[FFmpeg-cvslog] lavu/frame: use channels rather than channel_layout.

Nicolas George git at videolan.org
Wed Mar 20 14:03:17 CET 2013


ffmpeg | branch: master | Nicolas George <nicolas.george at normalesup.org> | Sat Mar 16 11:33:25 2013 +0100| [a964d6a8a26d4e0858f7df9a6bfee949fe9c16ea] | committer: Nicolas George

lavu/frame: use channels rather than channel_layout.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a964d6a8a26d4e0858f7df9a6bfee949fe9c16ea
---

 libavutil/frame.c |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index a5ddab9..2ec75e4 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -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;



More information about the ffmpeg-cvslog mailing list