Detect byte-swapped AC-3 and support decoding it directly.

This allows the AC-3 decoder to be used directly with RealMedia
decoders that unlike the libavformat one do not byte-swap automatically.
Since the new code is only used in case we would fail directly otherwise
there should be no risk for regressions.
This commit is contained in:
Reimar Döffinger 2011-03-22 14:22:07 -04:00 committed by Justin Ruggles
parent 40728b5169
commit 4c886d613d
1 changed files with 5 additions and 0 deletions

View File

@ -1314,6 +1314,11 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
/* copy input buffer to decoder context to avoid reading past the end /* copy input buffer to decoder context to avoid reading past the end
of the buffer, which can be caused by a damaged input stream. */ of the buffer, which can be caused by a damaged input stream. */
if (buf_size >= 2 && AV_RB16(buf) == 0x770B) {
// seems to be byte-swapped AC-3
int cnt = FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE) >> 1;
s->dsp.bswap16_buf((uint16_t *)s->input_buffer, (const uint16_t *)buf, cnt);
} else
memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE)); memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE));
buf = s->input_buffer; buf = s->input_buffer;
/* initialize the GetBitContext with the start of valid AC-3 Frame */ /* initialize the GetBitContext with the start of valid AC-3 Frame */