avformat/utils: add missing brackets around arguments in av_realloc() call
[ffmpeg.git] / libavfilter / vf_mergeplanes.c
index 4a81412..c211043 100644 (file)
@@ -46,14 +46,13 @@ typedef struct MergePlanesContext {
     const AVPixFmtDescriptor *outdesc;
 
     FFFrameSync fs;
-    FFFrameSyncIn fsin[3]; /* must be immediately after fs */
 } MergePlanesContext;
 
 #define OFFSET(x) offsetof(MergePlanesContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 static const AVOption mergeplanes_options[] = {
     { "mapping", "set input to output plane mapping", OFFSET(mapping), AV_OPT_TYPE_INT, {.i64=0}, 0, 0x33333333, FLAGS },
-    { "format", "set output pixel format", OFFSET(out_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64=AV_PIX_FMT_YUVA444P}, 0, AV_PIX_FMT_NB-1, .flags=FLAGS },
+    { "format", "set output pixel format", OFFSET(out_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64=AV_PIX_FMT_YUVA444P}, 0, INT_MAX, .flags=FLAGS },
     { NULL }
 };
 
@@ -117,22 +116,26 @@ static int query_formats(AVFilterContext *ctx)
 {
     MergePlanesContext *s = ctx->priv;
     AVFilterFormats *formats = NULL;
-    int i;
+    int i, ret;
 
     s->outdesc = av_pix_fmt_desc_get(s->out_fmt);
-    for (i = 0; i < AV_PIX_FMT_NB; i++) {
+    for (i = 0; av_pix_fmt_desc_get(i); i++) {
         const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
-        if (desc->comp[0].depth_minus1 == s->outdesc->comp[0].depth_minus1 &&
-            av_pix_fmt_count_planes(i) == desc->nb_components)
-            ff_add_format(&formats, i);
+        if (desc->comp[0].depth == s->outdesc->comp[0].depth &&
+            (desc->comp[0].depth <= 8 || (desc->flags & AV_PIX_FMT_FLAG_BE) == (s->outdesc->flags & AV_PIX_FMT_FLAG_BE)) &&
+            av_pix_fmt_count_planes(i) == desc->nb_components &&
+            (ret = ff_add_format(&formats, i)) < 0)
+                return ret;
     }
 
     for (i = 0; i < s->nb_inputs; i++)
-        ff_formats_ref(formats, &ctx->inputs[i]->out_formats);
+        if ((ret = ff_formats_ref(formats, &ctx->inputs[i]->out_formats)) < 0)
+            return ret;
 
     formats = NULL;
-    ff_add_format(&formats, s->out_fmt);
-    ff_formats_ref(formats, &ctx->outputs[0]->in_formats);
+    if ((ret = ff_add_format(&formats, s->out_fmt)) < 0 ||
+        (ret = ff_formats_ref(formats, &ctx->outputs[0]->in_formats)) < 0)
+        return ret;
 
     return 0;
 }
@@ -174,9 +177,11 @@ static int config_output(AVFilterLink *outlink)
     MergePlanesContext *s = ctx->priv;
     InputParam inputsp[4];
     FFFrameSyncIn *in;
-    int i;
+    int i, ret;
+
+    if ((ret = ff_framesync_init(&s->fs, ctx, s->nb_inputs)) < 0)
+        return ret;
 
-    ff_framesync_init(&s->fs, ctx, s->nb_inputs);
     in = s->fs.in;
     s->fs.opaque = s;
     s->fs.on_event = process_frame;
@@ -188,11 +193,11 @@ static int config_output(AVFilterLink *outlink)
     outlink->sample_aspect_ratio = ctx->inputs[0]->sample_aspect_ratio;
 
     s->planewidth[1]  =
-    s->planewidth[2]  = FF_CEIL_RSHIFT(outlink->w, s->outdesc->log2_chroma_w);
+    s->planewidth[2]  = AV_CEIL_RSHIFT(((s->outdesc->comp[1].depth > 8) + 1) * outlink->w, s->outdesc->log2_chroma_w);
     s->planewidth[0]  =
-    s->planewidth[3]  = outlink->w;
+    s->planewidth[3]  = ((s->outdesc->comp[0].depth > 8) + 1) * outlink->w;
     s->planeheight[1] =
-    s->planeheight[2] = FF_CEIL_RSHIFT(outlink->h, s->outdesc->log2_chroma_h);
+    s->planeheight[2] = AV_CEIL_RSHIFT(outlink->h, s->outdesc->log2_chroma_h);
     s->planeheight[0] =
     s->planeheight[3] = outlink->h;
 
@@ -216,17 +221,17 @@ static int config_output(AVFilterLink *outlink)
         }
 
         inputp->planewidth[1]  =
-        inputp->planewidth[2]  = FF_CEIL_RSHIFT(inlink->w, indesc->log2_chroma_w);
+        inputp->planewidth[2]  = AV_CEIL_RSHIFT(((indesc->comp[1].depth > 8) + 1) * inlink->w, indesc->log2_chroma_w);
         inputp->planewidth[0]  =
-        inputp->planewidth[3]  = inlink->w;
+        inputp->planewidth[3]  = ((indesc->comp[0].depth > 8) + 1) * inlink->w;
         inputp->planeheight[1] =
-        inputp->planeheight[2] = FF_CEIL_RSHIFT(inlink->h, indesc->log2_chroma_h);
+        inputp->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, indesc->log2_chroma_h);
         inputp->planeheight[0] =
         inputp->planeheight[3] = inlink->h;
         inputp->nb_planes = av_pix_fmt_count_planes(inlink->format);
 
         for (j = 0; j < inputp->nb_planes; j++)
-            inputp->depth[j] = indesc->comp[j].depth_minus1 + 1;
+            inputp->depth[j] = indesc->comp[j].depth;
 
         in[i].time_base = inlink->time_base;
         in[i].sync   = 1;
@@ -244,10 +249,10 @@ static int config_output(AVFilterLink *outlink)
                                       input, plane);
             goto fail;
         }
-        if (s->outdesc->comp[i].depth_minus1 + 1 != inputp->depth[plane]) {
+        if (s->outdesc->comp[i].depth != inputp->depth[plane]) {
             av_log(ctx, AV_LOG_ERROR, "output plane %d depth %d does not "
                                       "match input %d plane %d depth %d\n",
-                                      i, s->outdesc->comp[i].depth_minus1 + 1,
+                                      i, s->outdesc->comp[i].depth,
                                       input, plane, inputp->depth[plane]);
             goto fail;
         }