]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/vf_telecine.c
Merge commit '6fe2641d6e410b7bc203138fa97e1118b411f16d'
[ffmpeg] / libavfilter / vf_telecine.c
index a0f28d4f357f9ee63d2edd91040d8363f19cf8bb..93e5aa9e44b7e231e1d2e03a996b1a98cb73378f 100644 (file)
@@ -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);