}
s->downmixed = 1;
- /* allocate context input buffer */
- if (avctx->error_recognition >= FF_ER_CAREFUL) {
- s->input_buffer = av_mallocz(AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
- if (!s->input_buffer)
- return AVERROR(ENOMEM);
- }
-
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
return 0;
}
int blk, ch, err;
const uint8_t *channel_map;
const float *output[AC3_MAX_CHANNELS];
+ // if it seems to be byte-swapped AC-3 (aka DNET)
+ int is_swapped = buf_size >= 2 && AV_RB16(buf) == 0x770B;
/* initialize the GetBitContext with the start of valid AC-3 Frame */
- if (s->input_buffer) {
+ if (is_swapped || avctx->error_recognition >= FF_ER_CAREFUL) {
+ /* allocate context input buffer */
+ if (!s->input_buffer)
+ s->input_buffer = av_mallocz(AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!s->input_buffer)
+ return AVERROR(ENOMEM);
+
/* 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 (is_swapped) {
+ int cnt = FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE) >> 1;
+ s->dsp.bswap16_buf(s->input_buffer, buf, cnt);
+ } else
memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE));
- init_get_bits(&s->gbc, s->input_buffer, buf_size * 8);
- } else {
- init_get_bits(&s->gbc, buf, buf_size * 8);
+ buf = s->input_buffer;
}
+ init_get_bits(&s->gbc, buf, buf_size * 8);
/* parse the syncinfo */
*data_size = 0;