lavu/frame: use channels rather than channel_layout.
authorNicolas George <nicolas.george@normalesup.org>
Sat, 16 Mar 2013 10:33:25 +0000 (11:33 +0100)
committerNicolas George <nicolas.george@normalesup.org>
Wed, 20 Mar 2013 12:35:24 +0000 (13:35 +0100)
libavutil/frame.c

index a5ddab9..2ec75e4 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include "channel_layout.h"
+#include "avassert.h"
 #include "buffer.h"
 #include "common.h"
 #include "dict.h"
@@ -40,6 +41,11 @@ MAKE_ACCESSORS(AVFrame, frame, AVDictionary *, metadata)
 MAKE_ACCESSORS(AVFrame, frame, int,     decode_error_flags)
 MAKE_ACCESSORS(AVFrame, frame, int,     pkt_size)
 
+#define CHECK_CHANNELS_CONSISTENCY(frame) \
+    av_assert2(!(frame)->channel_layout || \
+               (frame)->channels == \
+               av_get_channel_layout_nb_channels((frame)->channel_layout))
+
 AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame) {return &frame->metadata;};
 
 int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int qp_type)
@@ -158,11 +164,12 @@ fail:
 
 static int get_audio_buffer(AVFrame *frame, int align)
 {
-    int channels = av_get_channel_layout_nb_channels(frame->channel_layout);
+    int channels = frame->channels;
     int planar   = av_sample_fmt_is_planar(frame->format);
     int planes   = planar ? channels : 1;
     int ret, i;
 
+    CHECK_CHANNELS_CONSISTENCY(frame);
     if (!frame->linesize[0]) {
         ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
                                          frame->nb_samples, frame->format,
@@ -240,7 +247,8 @@ int av_frame_ref(AVFrame *dst, AVFrame *src)
             return ret;
 
         if (src->nb_samples) {
-            int ch = av_get_channel_layout_nb_channels(src->channel_layout);
+            int ch = src->channels;
+            CHECK_CHANNELS_CONSISTENCY(src);
             av_samples_copy(dst->extended_data, src->extended_data, 0, 0,
                             dst->nb_samples, ch, dst->format);
         } else {
@@ -279,12 +287,13 @@ int av_frame_ref(AVFrame *dst, AVFrame *src)
 
     /* duplicate extended data */
     if (src->extended_data != src->data) {
-        int ch = av_get_channel_layout_nb_channels(src->channel_layout);
+        int ch = src->channels;
 
         if (!ch) {
             ret = AVERROR(EINVAL);
             goto fail;
         }
+        CHECK_CHANNELS_CONSISTENCY(src);
 
         dst->extended_data = av_malloc(sizeof(*dst->extended_data) * ch);
         if (!dst->extended_data) {
@@ -388,7 +397,8 @@ int av_frame_make_writable(AVFrame *frame)
         return ret;
 
     if (tmp.nb_samples) {
-        int ch = av_get_channel_layout_nb_channels(tmp.channel_layout);
+        int ch = tmp.channels;
+        CHECK_CHANNELS_CONSISTENCY(&tmp);
         av_samples_copy(tmp.extended_data, frame->extended_data, 0, 0,
                         frame->nb_samples, ch, frame->format);
     } else {
@@ -478,9 +488,10 @@ AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
     int planes, i;
 
     if (frame->nb_samples) {
-        int channels = av_get_channel_layout_nb_channels(frame->channel_layout);
+        int channels = frame->channels;
         if (!channels)
             return NULL;
+        CHECK_CHANNELS_CONSISTENCY(frame);
         planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
     } else
         planes = 4;