mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-02-04 14:30:55 +08:00
lavfi: make ff_framequeue_skip_samples() more useful.
Instead of just updating statistics and leaving the work to the call site, have it actually do the work. Also: skip the samples by updating the frame data pointers instead of moving the samples. More efficient and avoid writing into shared frames. Found-By: Muhammad Faiz <mfcc64@gmail.com>
This commit is contained in:
@@ -121,3 +121,30 @@ AVFrame *ff_framequeue_peek(FFFrameQueue *fq, size_t idx)
|
||||
check_consistency(fq);
|
||||
return b->frame;
|
||||
}
|
||||
|
||||
void ff_framequeue_skip_samples(FFFrameQueue *fq, size_t samples, AVRational time_base)
|
||||
{
|
||||
FFFrameBucket *b;
|
||||
size_t bytes;
|
||||
int planar, planes, i;
|
||||
|
||||
check_consistency(fq);
|
||||
av_assert1(fq->queued);
|
||||
b = bucket(fq, 0);
|
||||
av_assert1(samples < b->frame->nb_samples);
|
||||
planar = av_sample_fmt_is_planar(b->frame->format);
|
||||
planes = planar ? b->frame->channels : 1;
|
||||
bytes = samples * av_get_bytes_per_sample(b->frame->format);
|
||||
if (!planar)
|
||||
bytes *= b->frame->channels;
|
||||
if (b->frame->pts != AV_NOPTS_VALUE)
|
||||
b->frame->pts += av_rescale_q(samples, av_make_q(1, b->frame->sample_rate), time_base);
|
||||
b->frame->nb_samples -= samples;
|
||||
b->frame->linesize[0] -= bytes;
|
||||
for (i = 0; i < planes; i++)
|
||||
b->frame->extended_data[i] += bytes;
|
||||
for (i = 0; i < planes && i < AV_NUM_DATA_POINTERS; i++)
|
||||
b->frame->data[i] = b->frame->extended_data[i];
|
||||
fq->total_samples_tail += samples;
|
||||
ff_framequeue_update_peeked(fq, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user