diff options
author | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2013-10-31 00:33:51 +0100 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2013-10-31 11:24:43 +0100 |
commit | e4b0a77021a25fd538ef14791e31c06950d5ff1f (patch) | |
tree | 89adfd81d92361df2c9d9a7ba36bb0a78280a2c3 | |
parent | fa6fa2162b730336fc1d6ee0d547dcc81f4afbad (diff) | |
download | ffmpeg-e4b0a77021a25fd538ef14791e31c06950d5ff1f.tar.gz |
libavfilter/decimate: Add pts of first frame to all frames.
Fixes ticket #3019
Reviewed-by: Clément Bœsch
-rw-r--r-- | libavfilter/vf_decimate.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/libavfilter/vf_decimate.c b/libavfilter/vf_decimate.c index 034d5247bc..5efafe9f77 100644 --- a/libavfilter/vf_decimate.c +++ b/libavfilter/vf_decimate.c @@ -43,6 +43,7 @@ typedef struct { AVFrame **clean_src; ///< frame queue for the clean source int got_frame[2]; ///< frame request flag for each input stream double ts_unit; ///< timestamp units for the output frames + int64_t start_pts; ///< base for output timestamps uint32_t eof; ///< bitmask for end of stream int hsub, vsub; ///< chroma subsampling values int depth; @@ -210,11 +211,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) av_frame_free(&dm->queue[i].frame); } else { AVFrame *frame = dm->queue[i].frame; + if (frame->pts != AV_NOPTS_VALUE && dm->start_pts == AV_NOPTS_VALUE) + dm->start_pts = frame->pts; if (dm->ppsrc) { av_frame_free(&frame); frame = dm->clean_src[i]; } - frame->pts = outlink->frame_count * dm->ts_unit; + frame->pts = outlink->frame_count * dm->ts_unit + + (dm->start_pts == AV_NOPTS_VALUE ? 0 : dm->start_pts); ret = ff_filter_frame(outlink, frame); if (ret < 0) break; @@ -259,7 +263,7 @@ static int config_input(AVFilterLink *inlink) static av_cold int decimate_init(AVFilterContext *ctx) { - const DecimateContext *dm = ctx->priv; + DecimateContext *dm = ctx->priv; AVFilterPad pad = { .name = av_strdup("main"), .type = AVMEDIA_TYPE_VIDEO, @@ -285,6 +289,8 @@ static av_cold int decimate_init(AVFilterContext *ctx) return AVERROR(EINVAL); } + dm->start_pts = AV_NOPTS_VALUE; + return 0; } |