--- libavfilter/vf_telecine.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/libavfilter/vf_telecine.c b/libavfilter/vf_telecine.c index a0f28d4..aaad2b5 100644 --- a/libavfilter/vf_telecine.c +++ b/libavfilter/vf_telecine.c @@ -38,6 +38,8 @@ typedef struct { int first_field; char *pattern; unsigned int pattern_pos; + int ts_mode; + int64_t start_time; AVRational pts; double ts_unit; @@ -62,6 +64,7 @@ static const AVOption telecine_options[] = { {"bottom", "select bottom field first", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "field"}, {"b", "select bottom field first", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "field"}, {"pattern", "pattern that describe for how many fields a frame is to be displayed", OFFSET(pattern), AV_OPT_TYPE_STRING, {.str="23"}, 0, 0, FLAGS}, + {"ts_mode", "set to choose timestamp handling as being with respect to the input", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS}, {NULL} }; @@ -89,6 +92,10 @@ static av_cold int init(AVFilterContext *ctx) s->pts.den += *p - '0'; } + s->start_time = 0; + if (s->ts_mode) + s->start_time = -1; + s->out_cnt = (max + 1) / 2; av_log(ctx, AV_LOG_INFO, "Telecine pattern %s yields up to %d frames per frame, pts advance factor: %d/%d\n", s->pattern, s->out_cnt, s->pts.num, s->pts.den); @@ -173,6 +180,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) TelecineContext *s = ctx->priv; int i, len, ret = 0, nout = 0; + if (s->start_time < 0) + s->start_time = inpicref->pts; + len = s->pattern[s->pattern_pos] - '0'; s->pattern_pos++; @@ -235,7 +245,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) return AVERROR(ENOMEM); } - frame->pts = outlink->frame_count * s->ts_unit; + frame->pts = s->start_time + outlink->frame_count * s->ts_unit; ret = ff_filter_frame(outlink, frame); } av_frame_free(&inpicref); -- 1.9.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel