avcodec/mjpegdec: Fix context fields becoming inconsistent
[ffmpeg.git] / libavfilter / vf_phase.c
index dd3eced..82dc603 100644 (file)
@@ -117,13 +117,11 @@ static enum PhaseMode analyze_plane(void *ctx, enum PhaseMode mode, AVFrame *old
     double bdiff, tdiff, pdiff, scale;
     const int ns = new->linesize[0];
     const int os = old->linesize[0];
-    uint8_t *nptr = new->data[0];
-    uint8_t *optr = old->data[0];
+    const uint8_t *nptr = new->data[0];
+    const uint8_t *optr = old->data[0];
     const int h = new->height;
     const int w = new->width;
     int bdif, tdif, pdif;
-    uint8_t *end, *rend;
-    int top, t;
 
     if (mode == AUTO) {
         mode = new->interlaced_frame ? new->top_field_first ?
@@ -136,10 +134,14 @@ static enum PhaseMode analyze_plane(void *ctx, enum PhaseMode mode, AVFrame *old
     if (mode <= BOTTOM_FIRST) {
         bdiff = pdiff = tdiff = 65536.0;
     } else {
+        int top = 0, t;
+        const uint8_t *rend, *end = nptr + (h - 2) * ns;
+
         bdiff = pdiff = tdiff = 0.0;
 
-        for (end = nptr + (h - 2) * ns, nptr += ns, optr += os, top = 0;
-             nptr < end; nptr += ns - w, optr += os - w, top ^= 1) {
+        nptr += ns;
+        optr += os;
+        while (nptr < end) {
             pdif = tdif = bdif = 0;
 
             switch (mode) {
@@ -204,6 +206,9 @@ static enum PhaseMode analyze_plane(void *ctx, enum PhaseMode mode, AVFrame *old
             pdiff += (double)pdif;
             tdiff += (double)tdif;
             bdiff += (double)bdif;
+            nptr += ns - w;
+            optr += os - w;
+            top ^= 1;
         }
 
         scale = 1.0 / (w * (h - 3)) / 25.0;
@@ -243,6 +248,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     int plane, top, y;
     AVFrame *out;
 
+    if (ctx->is_disabled) {
+        av_frame_free(&s->frame);
+        /* we keep a reference to the previous frame so the filter can start
+         * being useful as soon as it's not disabled, avoiding the 1-frame
+         * delay. */
+        s->frame = av_frame_clone(in);
+        return ff_filter_frame(outlink, in);
+    }
+
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
         av_frame_free(&in);
@@ -258,8 +272,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     }
 
     for (plane = 0; plane < s->nb_planes; plane++) {
-        uint8_t *buf = s->frame->data[plane];
-        uint8_t *from = in->data[plane];
+        const uint8_t *buf = s->frame->data[plane];
+        const uint8_t *from = in->data[plane];
         uint8_t *to = out->data[plane];
 
         for (y = 0, top = 1; y < s->planeheight[plane]; y++, top ^= 1) {
@@ -311,4 +325,5 @@ AVFilter ff_vf_phase = {
     .query_formats = query_formats,
     .inputs        = phase_inputs,
     .outputs       = phase_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
 };