diff options
author | Tim Walker <tdskywalker@gmail.com> | 2013-12-11 02:03:35 +0000 |
---|---|---|
committer | Tim Walker <tdskywalker@gmail.com> | 2014-01-05 16:41:56 +0100 |
commit | 7840c40445c9f52aeccba96de3d27613398bfbf2 (patch) | |
tree | aa6a5923d4512daf12405b3f8fb1d222c3599c5e /libavcodec/ac3dec.c | |
parent | 13345fc1f86fc3615789e196d5a339c1c27c9068 (diff) | |
download | ffmpeg-7840c40445c9f52aeccba96de3d27613398bfbf2.tar.gz |
(e)ac3dec: set AV_FRAME_DATA_MATRIXENCODING side data.
Diffstat (limited to 'libavcodec/ac3dec.c')
-rw-r--r-- | libavcodec/ac3dec.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 2b71c8384c..87638e7143 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); |