mirror of https://git.ffmpeg.org/ffmpeg.git
Fix channel order for some MLP samples.
This commit is contained in:
parent
19de9d5646
commit
939a12e25d
|
@ -133,6 +133,9 @@ typedef struct MLPDecodeContext {
|
||||||
//! Index of the last substream to decode - further substreams are skipped.
|
//! Index of the last substream to decode - further substreams are skipped.
|
||||||
uint8_t max_decoded_substream;
|
uint8_t max_decoded_substream;
|
||||||
|
|
||||||
|
//! Stream needs channel reordering to comply with FFmpeg's channel order
|
||||||
|
uint8_t needs_reordering;
|
||||||
|
|
||||||
//! number of PCM samples contained in each frame
|
//! number of PCM samples contained in each frame
|
||||||
int access_unit_size;
|
int access_unit_size;
|
||||||
//! next power of two above the number of samples in each frame
|
//! next power of two above the number of samples in each frame
|
||||||
|
@ -326,6 +329,8 @@ static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb)
|
||||||
for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
|
for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
|
||||||
m->substream[substr].restart_seen = 0;
|
m->substream[substr].restart_seen = 0;
|
||||||
|
|
||||||
|
m->needs_reordering = mh.channels_mlp >= 18 && mh.channels_mlp <= 20;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,6 +441,19 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
|
||||||
s->ch_assign[ch_assign] = ch;
|
s->ch_assign[ch_assign] = ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m->avctx->codec_id == CODEC_ID_MLP && m->needs_reordering) {
|
||||||
|
if (m->avctx->channel_layout == (AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY) ||
|
||||||
|
m->avctx->channel_layout == AV_CH_LAYOUT_5POINT0) {
|
||||||
|
int i = s->ch_assign[4];
|
||||||
|
s->ch_assign[4] = s->ch_assign[3];
|
||||||
|
s->ch_assign[3] = s->ch_assign[2];
|
||||||
|
s->ch_assign[2] = i;
|
||||||
|
} else if (m->avctx->channel_layout == AV_CH_LAYOUT_5POINT1) {
|
||||||
|
FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
|
||||||
|
FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
|
checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
|
||||||
|
|
||||||
if (checksum != get_bits(gbp, 8))
|
if (checksum != get_bits(gbp, 8))
|
||||||
|
|
Loading…
Reference in New Issue