OSDN Git Service

sink_buffer: make opaque argument optional.
authorNicolas George <nicolas.george@normalesup.org>
Sun, 24 Jun 2012 21:28:29 +0000 (23:28 +0200)
committerNicolas George <nicolas.george@normalesup.org>
Tue, 26 Jun 2012 11:17:30 +0000 (13:17 +0200)
libavfilter/sink_buffer.c

index b6410a2..c4f6118 100644 (file)
@@ -231,24 +231,25 @@ static void filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
 static av_cold int asink_init(AVFilterContext *ctx, const char *args, void *opaque)
 {
     BufferSinkContext *buf = ctx->priv;
-    AVABufferSinkParams *params;
+    AVABufferSinkParams *params = opaque;
 
-    if (!opaque) {
-        av_log(ctx, AV_LOG_ERROR,
-               "No opaque field provided, an AVABufferSinkParams struct is required\n");
-        return AVERROR(EINVAL);
-    } else
-        params = (AVABufferSinkParams *)opaque;
-
-    buf->sample_fmts     = ff_copy_int_list  (params->sample_fmts);
-    buf->channel_layouts = ff_copy_int64_list(params->channel_layouts);
-    if (!buf->sample_fmts || !buf->channel_layouts) {
-        av_freep(&buf->sample_fmts);
-        av_freep(&buf->channel_layouts);
-        return AVERROR(ENOMEM);
+    if (params && params->sample_fmts) {
+        buf->sample_fmts     = ff_copy_int_list  (params->sample_fmts);
+        if (!buf->sample_fmts)
+            goto fail_enomem;
     }
+    if (params && params->channel_layouts) {
+        buf->channel_layouts = ff_copy_int64_list(params->channel_layouts);
+        if (!buf->channel_layouts)
+            goto fail_enomem;
+    }
+    if (!common_init(ctx))
+        return 0;
 
-    return common_init(ctx);
+fail_enomem:
+    av_freep(&buf->sample_fmts);
+    av_freep(&buf->channel_layouts);
+    return AVERROR(ENOMEM);
 }
 
 static av_cold void asink_uninit(AVFilterContext *ctx)
@@ -266,14 +267,17 @@ static int asink_query_formats(AVFilterContext *ctx)
     AVFilterFormats *formats = NULL;
     AVFilterChannelLayouts *layouts = NULL;
 
+    if (buf->sample_fmts) {
     if (!(formats = ff_make_format_list(buf->sample_fmts)))
         return AVERROR(ENOMEM);
     ff_set_common_formats(ctx, formats);
+    }
 
+    if (buf->channel_layouts) {
     if (!(layouts = avfilter_make_format64_list(buf->channel_layouts)))
         return AVERROR(ENOMEM);
     ff_set_common_channel_layouts(ctx, layouts);
-    ff_set_common_samplerates          (ctx, ff_all_samplerates());
+    }
 
     return 0;
 }