diff options
author | Nicolas George <george@nsup.org> | 2017-01-29 10:10:40 +0100 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2017-01-29 18:53:11 +0100 |
commit | 383057f8e744efeaaa3648a59bc577b25b055835 (patch) | |
tree | 03e096d662f3814c292e3a3a153a6a8bf7071730 /libavfilter/framequeue.c | |
parent | e05d2dd86abc2fdbadfc7ec9a84c22013be62da2 (diff) | |
download | ffmpeg-383057f8e744efeaaa3648a59bc577b25b055835.tar.gz |
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>
Diffstat (limited to 'libavfilter/framequeue.c')
-rw-r--r-- | libavfilter/framequeue.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/libavfilter/framequeue.c b/libavfilter/framequeue.c index a4ffa86c95..26bfa49967 100644 --- a/libavfilter/framequeue.c +++ b/libavfilter/framequeue.c @@ -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); +} |