From: Reimar Döffinger Date: Tue, 22 Mar 2011 18:22:07 +0000 (-0400) Subject: Detect byte-swapped AC-3 and support decoding it directly. X-Git-Tag: v0.7b2~591 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4c886d613df8b217c6d62cb2c94e88f848177b23;p=coroid%2Flibav_saccubus.git 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. --- diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index a9a67ced3..071cc6a54 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -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 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)); buf = s->input_buffer; /* initialize the GetBitContext with the start of valid AC-3 Frame */