[FFmpeg-cvslog] lavc: make up a fake frame channel layout when there is no real one.

Anton Khirnov git at videolan.org
Tue Mar 12 12:55:45 CET 2013


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Feb 11 08:13:22 2013 +0100| [2eba9087f3031c6050f8dcd996225490be6c2410] | committer: Anton Khirnov

lavc: make up a fake frame channel layout when there is no real one.

This should ensure that a valid channel layout is always set on a frame,
until a better solution is implemented.

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

 libavcodec/utils.c |   24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 90f2537..62fc1b5 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -569,8 +569,28 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
             frame->sample_rate    = avctx->sample_rate;
         if (frame->format < 0)
             frame->format         = avctx->sample_fmt;
-        if (!frame->channel_layout)
-            frame->channel_layout = avctx->channel_layout;
+        if (!frame->channel_layout) {
+            if (avctx->channel_layout) {
+                 if (av_get_channel_layout_nb_channels(avctx->channel_layout) !=
+                     avctx->channels) {
+                     av_log(avctx, AV_LOG_ERROR, "Inconsistent channel "
+                            "configuration.\n");
+                     return AVERROR(EINVAL);
+                 }
+
+                frame->channel_layout = avctx->channel_layout;
+            } else {
+                if (avctx->channels > FF_SANE_NB_CHANNELS) {
+                    av_log(avctx, AV_LOG_ERROR, "Too many channels: %d.\n",
+                           avctx->channels);
+                    return AVERROR(ENOSYS);
+                }
+
+                frame->channel_layout = av_get_default_channel_layout(avctx->channels);
+                if (!frame->channel_layout)
+                    frame->channel_layout = (1ULL << avctx->channels) - 1;
+            }
+        }
         break;
     default: return AVERROR(EINVAL);
     }



More information about the ffmpeg-cvslog mailing list