mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Move XCH parameters into context structure.
Patch by Nick Brereton $name AT n$surname DOT net Originally committed as revision 24209 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
453d28af60
commit
d0a1885018
@ -288,6 +288,10 @@ typedef struct {
|
|||||||
int current_subframe;
|
int current_subframe;
|
||||||
int current_subsubframe;
|
int current_subsubframe;
|
||||||
|
|
||||||
|
/* XCh extension information */
|
||||||
|
int xch_present;
|
||||||
|
int xch_base_channel; ///< index of first (only) channel containing XCH data
|
||||||
|
|
||||||
int debug_flag; ///< used for suppressing repeated error messages output
|
int debug_flag; ///< used for suppressing repeated error messages output
|
||||||
DSPContext dsp;
|
DSPContext dsp;
|
||||||
FFTContext imdct;
|
FFTContext imdct;
|
||||||
@ -1260,12 +1264,12 @@ static int dca_decode_frame(AVCodecContext * avctx,
|
|||||||
int lfe_samples;
|
int lfe_samples;
|
||||||
int num_core_channels = 0;
|
int num_core_channels = 0;
|
||||||
int i;
|
int i;
|
||||||
int xch_present = 0;
|
|
||||||
int16_t *samples = data;
|
int16_t *samples = data;
|
||||||
DCAContext *s = avctx->priv_data;
|
DCAContext *s = avctx->priv_data;
|
||||||
int channels;
|
int channels;
|
||||||
|
|
||||||
|
|
||||||
|
s->xch_present = 0;
|
||||||
s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, DCA_MAX_FRAME_SIZE);
|
s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, DCA_MAX_FRAME_SIZE);
|
||||||
if (s->dca_buffer_size == -1) {
|
if (s->dca_buffer_size == -1) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
|
av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
|
||||||
@ -1297,9 +1301,10 @@ static int dca_decode_frame(AVCodecContext * avctx,
|
|||||||
|
|
||||||
switch(bits) {
|
switch(bits) {
|
||||||
case 0x5a5a5a5a: {
|
case 0x5a5a5a5a: {
|
||||||
int ext_base_ch = s->prim_channels;
|
|
||||||
int ext_amode, xch_fsize;
|
int ext_amode, xch_fsize;
|
||||||
|
|
||||||
|
s->xch_base_channel = s->prim_channels;
|
||||||
|
|
||||||
/* validate sync word using XCHFSIZE field */
|
/* validate sync word using XCHFSIZE field */
|
||||||
xch_fsize = show_bits(&s->gb, 10);
|
xch_fsize = show_bits(&s->gb, 10);
|
||||||
if((s->frame_size != (get_bits_count(&s->gb) >> 3) - 4 + xch_fsize) &&
|
if((s->frame_size != (get_bits_count(&s->gb) >> 3) - 4 + xch_fsize) &&
|
||||||
@ -1318,13 +1323,13 @@ static int dca_decode_frame(AVCodecContext * avctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* much like core primary audio coding header */
|
/* much like core primary audio coding header */
|
||||||
dca_parse_audio_coding_header(s, ext_base_ch);
|
dca_parse_audio_coding_header(s, s->xch_base_channel);
|
||||||
|
|
||||||
for (i = 0; i < (s->sample_blocks / 8); i++) {
|
for (i = 0; i < (s->sample_blocks / 8); i++) {
|
||||||
dca_decode_block(s, ext_base_ch, i);
|
dca_decode_block(s, s->xch_base_channel, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
xch_present = 1;
|
s->xch_present = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x1d95f262:
|
case 0x1d95f262:
|
||||||
@ -1342,7 +1347,7 @@ static int dca_decode_frame(AVCodecContext * avctx,
|
|||||||
if (s->amode<16) {
|
if (s->amode<16) {
|
||||||
avctx->channel_layout = dca_core_channel_layout[s->amode];
|
avctx->channel_layout = dca_core_channel_layout[s->amode];
|
||||||
|
|
||||||
if (xch_present && (!avctx->request_channels ||
|
if (s->xch_present && (!avctx->request_channels ||
|
||||||
avctx->request_channels > num_core_channels)) {
|
avctx->request_channels > num_core_channels)) {
|
||||||
avctx->channel_layout |= CH_BACK_CENTER;
|
avctx->channel_layout |= CH_BACK_CENTER;
|
||||||
if (s->lfe) {
|
if (s->lfe) {
|
||||||
|
Loading…
Reference in New Issue
Block a user