[FFmpeg-cvslog] (e)ac3dec: set AV_FRAME_DATA_MATRIXENCODING side data.

Tim Walker git at videolan.org
Sun Jan 5 23:21:17 CET 2014


ffmpeg | branch: master | Tim Walker <tdskywalker at gmail.com> | Wed Dec 11 02:03:35 2013 +0000| [7840c40445c9f52aeccba96de3d27613398bfbf2] | committer: Tim Walker

(e)ac3dec: set AV_FRAME_DATA_MATRIXENCODING side data.

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

 libavcodec/ac3dec.c |   30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 2b71c83..87638e7 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -1296,6 +1296,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data,
     int blk, ch, err, ret;
     const uint8_t *channel_map;
     const float *output[AC3_MAX_CHANNELS];
+    enum AVMatrixEncoding matrix_encoding;
 
     /* copy input buffer to decoder context to avoid reading past the end
        of the buffer, which can be caused by a damaged input stream. */
@@ -1437,6 +1438,35 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data,
     for (ch = 0; ch < s->out_channels; ch++)
         memcpy(s->output[ch], output[ch], sizeof(**output) * AC3_BLOCK_SIZE);
 
+    /*
+     * AVMatrixEncoding
+     *
+     * Check whether the input layout is compatible, and make sure we're not
+     * downmixing (else the matrix encoding is no longer applicable).
+     */
+    matrix_encoding = AV_MATRIX_ENCODING_NONE;
+    if (s->channel_mode == AC3_CHMODE_STEREO &&
+        s->channel_mode == (s->output_mode & ~AC3_OUTPUT_LFEON)) {
+        if (s->dolby_surround_mode == AC3_DSURMOD_ON)
+            matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
+        else if (s->dolby_headphone_mode == AC3_DHEADPHONMOD_ON)
+            matrix_encoding = AV_MATRIX_ENCODING_DOLBYHEADPHONE;
+    } else if (s->channel_mode >= AC3_CHMODE_2F2R &&
+               s->channel_mode == (s->output_mode & ~AC3_OUTPUT_LFEON)) {
+        switch (s->dolby_surround_ex_mode) {
+        case AC3_DSUREXMOD_ON: // EX or PLIIx
+            matrix_encoding = AV_MATRIX_ENCODING_DOLBYEX;
+            break;
+        case AC3_DSUREXMOD_PLIIZ:
+            matrix_encoding = AV_MATRIX_ENCODING_DPLIIZ;
+            break;
+        default: // not indicated or off
+            break;
+        }
+    }
+    if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0)
+        return ret;
+
     *got_frame_ptr = 1;
 
     return FFMIN(buf_size, s->frame_size);



More information about the ffmpeg-cvslog mailing list