X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_telecine.c;h=93e5aa9e44b7e231e1d2e03a996b1a98cb73378f;hb=97a407f696ae212d53b77ab7e37e0be749e3167e;hp=a0f28d4f357f9ee63d2edd91040d8363f19cf8bb;hpb=a2740a060b36f6612043fa3128f4eb6197d0ce13;p=ffmpeg diff --git a/libavfilter/vf_telecine.c b/libavfilter/vf_telecine.c index a0f28d4f357..93e5aa9e44b 100644 --- a/libavfilter/vf_telecine.c +++ b/libavfilter/vf_telecine.c @@ -38,9 +38,10 @@ typedef struct { int first_field; char *pattern; unsigned int pattern_pos; + int64_t start_time; AVRational pts; - double ts_unit; + AVRational ts_unit; int out_cnt; int occupied; @@ -89,6 +90,8 @@ static av_cold int init(AVFilterContext *ctx) s->pts.den += *p - '0'; } + s->start_time = AV_NOPTS_VALUE; + 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); @@ -161,7 +164,7 @@ static int config_output(AVFilterLink *outlink) av_log(ctx, AV_LOG_VERBOSE, "TB: %d/%d -> %d/%d\n", inlink->time_base.num, inlink->time_base.den, outlink->time_base.num, outlink->time_base.den); - s->ts_unit = av_q2d(av_inv_q(av_mul_q(fps, outlink->time_base))); + s->ts_unit = av_inv_q(av_mul_q(fps, outlink->time_base)); return 0; } @@ -173,6 +176,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) TelecineContext *s = ctx->priv; int i, len, ret = 0, nout = 0; + if (s->start_time == AV_NOPTS_VALUE) + s->start_time = inpicref->pts; + len = s->pattern[s->pattern_pos] - '0'; s->pattern_pos++; @@ -235,7 +241,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) return AVERROR(ENOMEM); } - frame->pts = outlink->frame_count * s->ts_unit; + av_frame_copy_props(frame, inpicref); + frame->pts = ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time) + + av_rescale(outlink->frame_count, s->ts_unit.num, + s->ts_unit.den); ret = ff_filter_frame(outlink, frame); } av_frame_free(&inpicref);