[FFmpeg-devel] [PATCH 4/4] Support DTS-ES extension (XCh) in dca
Benjamin Larsson
banan
Mon Jun 21 10:28:48 CEST 2010
Nick Brereton skrev 2010-06-21 01:22:
> Index: libavcodec/dca.c
> ===================================================================
> --- libavcodec/dca.c 2010-06-21 00:01:55.000000000 +0100
> +++ libavcodec/dca.c 2010-06-21 00:02:55.000000000 +0100
> @@ -41,10 +41,11 @@
>
> //#define TRACE
>
> -#define DCA_PRIM_CHANNELS_MAX (5)
> +#define DCA_PRIM_CHANNELS_MAX (7)
> #define DCA_SUBBANDS (32)
> #define DCA_ABITS_MAX (32) /* Should be 28 */
> #define DCA_SUBSUBFRAMES_MAX (4)
> +#define DCA_SUBFRAMES_MAX (16)
> #define DCA_BLOCKS_MAX (16)
> #define DCA_LFE_MAX (3)
>
> @@ -246,8 +247,8 @@
> float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< scale factor adjustment
>
> /* Primary audio coding side information */
> - int subsubframes; ///< number of subsubframes
> - int partial_samples; ///< partial subsubframe samples count
> + int subsubframes[DCA_SUBFRAMES_MAX]; ///< number of subsubframes
> + int partial_samples[DCA_SUBFRAMES_MAX]; ///< partial subsubframe samples count
> int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction mode (ADPCM used or not)
> int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction VQ coefs
> int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< bit allocation index
> @@ -260,8 +261,7 @@
>
> int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< VQ encoded high frequency subbands
>
> - float lfe_data[2 * DCA_SUBSUBFRAMES_MAX * DCA_LFE_MAX *
> - 2 /*history */ ]; ///< Low frequency effect data
> + float lfe_data[2 * DCA_LFE_MAX * (DCA_BLOCKS_MAX + 4)]; ///< Low frequency effect data
> int lfe_scale_factor;
>
> /* Subband samples history (for ADPCM) */
> @@ -276,8 +276,8 @@
> float scale_bias; ///< output scale
>
> DECLARE_ALIGNED(16, float, subband_samples)[DCA_BLOCKS_MAX][DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8];
> - DECLARE_ALIGNED(16, float, samples)[1536]; /* 6 * 256 = 1536, might only need 5 */
> - const float *samples_chanptr[6];
> + DECLARE_ALIGNED(16, float, samples)[(DCA_PRIM_CHANNELS_MAX+1)*256];
> + const float *samples_chanptr[DCA_PRIM_CHANNELS_MAX+1];
>
> uint8_t dca_buffer[DCA_MAX_FRAME_SIZE];
> int dca_buffer_size; ///< how much data is in the dca_buffer
> @@ -363,47 +363,49 @@
> *dst++ = get_bits(gb, bits);
> }
>
> -static int dca_parse_audio_coding_header(DCAContext * s)
> +static int dca_parse_audio_coding_header(DCAContext * s, int base_channel)
> {
> int i, j;
> static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 };
> static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };
> static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };
>
> - s->total_channels = get_bits(&s->gb, 3) + 1;
> + s->total_channels = get_bits(&s->gb, 3) + 1 + base_channel;
> s->prim_channels = s->total_channels;
> +
> if (s->prim_channels> DCA_PRIM_CHANNELS_MAX)
> - s->prim_channels = DCA_PRIM_CHANNELS_MAX; /* We only support DTS core */
> + s->prim_channels = DCA_PRIM_CHANNELS_MAX;
>
>
> - for (i = 0; i< s->prim_channels; i++) {
> + for (i = base_channel; i< s->prim_channels; i++) {
> s->subband_activity[i] = get_bits(&s->gb, 5) + 2;
> if (s->subband_activity[i]> DCA_SUBBANDS)
> s->subband_activity[i] = DCA_SUBBANDS;
> }
> - for (i = 0; i< s->prim_channels; i++) {
> + for (i = base_channel; i< s->prim_channels; i++) {
> s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1;
> if (s->vq_start_subband[i]> DCA_SUBBANDS)
> s->vq_start_subband[i] = DCA_SUBBANDS;
> }
> - get_array(&s->gb, s->joint_intensity, s->prim_channels, 3);
> - get_array(&s->gb, s->transient_huffman, s->prim_channels, 2);
> - get_array(&s->gb, s->scalefactor_huffman, s->prim_channels, 3);
> - get_array(&s->gb, s->bitalloc_huffman, s->prim_channels, 3);
> + get_array(&s->gb, s->joint_intensity + base_channel, s->prim_channels - base_channel, 3);
> + get_array(&s->gb, s->transient_huffman + base_channel, s->prim_channels - base_channel, 2);
> + get_array(&s->gb, s->scalefactor_huffman + base_channel, s->prim_channels - base_channel, 3);
> + get_array(&s->gb, s->bitalloc_huffman + base_channel, s->prim_channels - base_channel, 3);
>
> /* Get codebooks quantization indexes */
> - memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman));
> + if (!base_channel)
> + memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman));
> for (j = 1; j< 11; j++)
> - for (i = 0; i< s->prim_channels; i++)
> + for (i = base_channel; i< s->prim_channels; i++)
> s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]);
>
> /* Get scale factor adjustment */
> for (j = 0; j< 11; j++)
> - for (i = 0; i< s->prim_channels; i++)
> + for (i = base_channel; i< s->prim_channels; i++)
> s->scalefactor_adj[i][j] = 1;
>
> for (j = 1; j< 11; j++)
> - for (i = 0; i< s->prim_channels; i++)
> + for (i = base_channel; i< s->prim_channels; i++)
> if (s->quant_index_huffman[i][j]< thr[j])
> s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)];
>
> @@ -418,7 +420,7 @@
> #ifdef TRACE
> av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes);
> av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels);
> - for (i = 0; i< s->prim_channels; i++){
> + for (i = base_channel; i< s->prim_channels; i++){
> av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]);
> av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]);
> av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]);
> @@ -532,7 +534,7 @@
> /* Primary audio coding header */
> s->subframes = get_bits(&s->gb, 4) + 1;
>
> - return dca_parse_audio_coding_header(s);
> + return dca_parse_audio_coding_header(s, 0);
> }
>
>
> @@ -546,20 +548,23 @@
> return value;
> }
>
> -static int dca_subframe_header(DCAContext * s, int block_index)
> +static int dca_subframe_header(DCAContext * s, int base_channel, int block_index)
> {
> /* Primary audio coding side information */
> int j, k;
>
> - s->subsubframes = get_bits(&s->gb, 2) + 1;
> - s->partial_samples = get_bits(&s->gb, 3);
> - for (j = 0; j< s->prim_channels; j++) {
> + if (!base_channel) {
> + s->subsubframes[s->current_subframe] = get_bits(&s->gb, 2) + 1;
> + s->partial_samples[s->current_subframe] = get_bits(&s->gb, 3);
> + }
> +
> + for (j = base_channel; j< s->prim_channels; j++) {
> for (k = 0; k< s->subband_activity[j]; k++)
> s->prediction_mode[j][k] = get_bits(&s->gb, 1);
> }
>
> /* Get prediction codebook */
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> for (k = 0; k< s->subband_activity[j]; k++) {
> if (s->prediction_mode[j][k]> 0) {
> /* (Prediction coefficient VQ address) */
> @@ -569,7 +574,7 @@
> }
>
> /* Bit allocation index */
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> for (k = 0; k< s->vq_start_subband[j]; k++) {
> if (s->bitalloc_huffman[j] == 6)
> s->bitalloc[j][k] = get_bits(&s->gb, 5);
> @@ -593,10 +598,10 @@
> }
>
> /* Transition mode */
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> for (k = 0; k< s->subband_activity[j]; k++) {
> s->transition_mode[j][k] = 0;
> - if (s->subsubframes> 1&&
> + if (s->subsubframes[s->current_subframe]> 1&&
> k< s->vq_start_subband[j]&& s->bitalloc[j][k]> 0) {
> s->transition_mode[j][k] =
> get_bitalloc(&s->gb,&dca_tmode, s->transient_huffman[j]);
> @@ -604,7 +609,7 @@
> }
> }
>
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> const uint32_t *scale_table;
> int scale_sum;
>
> @@ -633,14 +638,14 @@
> }
>
> /* Joint subband scale factor codebook select */
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> /* Transmitted only if joint subband coding enabled */
> if (s->joint_intensity[j]> 0)
> s->joint_huff[j] = get_bits(&s->gb, 3);
> }
>
> /* Scale factors for joint subband coding */
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> int source_channel;
>
> /* Transmitted only if joint subband coding enabled */
> @@ -666,15 +671,15 @@
> }
>
> /* Stereo downmix coefficients */
> - if (s->prim_channels> 2) {
> + if (!base_channel&& s->prim_channels> 2) {
> if(s->downmix) {
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> s->downmix_coef[j][0] = get_bits(&s->gb, 7);
> s->downmix_coef[j][1] = get_bits(&s->gb, 7);
> }
> } else {
> int am = s->amode& DCA_CHANNEL_MASK;
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> s->downmix_coef[j][0] = dca_default_coeffs[am][j][0];
> s->downmix_coef[j][1] = dca_default_coeffs[am][j][1];
> }
> @@ -695,16 +700,16 @@
> */
>
> /* VQ encoded high frequency subbands */
> - for (j = 0; j< s->prim_channels; j++)
> + for (j = base_channel; j< s->prim_channels; j++)
> for (k = s->vq_start_subband[j]; k< s->subband_activity[j]; k++)
> /* 1 vector -> 32 samples */
> s->high_freq_vq[j][k] = get_bits(&s->gb, 10);
>
> /* Low frequency effect data */
> - if (s->lfe) {
> + if (!base_channel&& s->lfe) {
> /* LFE samples */
> int lfe_samples = 2 * s->lfe * (4 + block_index);
> - int lfe_end_sample = 2 * s->lfe * (4 + block_index + s->subsubframes);
> + int lfe_end_sample = 2 * s->lfe * (4 + block_index + s->subsubframes[s->current_subframe]);
> float lfe_scale;
>
> for (j = lfe_samples; j< lfe_end_sample; j++) {
> @@ -723,16 +728,16 @@
> }
>
> #ifdef TRACE
> - av_log(s->avctx, AV_LOG_DEBUG, "subsubframes: %i\n", s->subsubframes);
> + av_log(s->avctx, AV_LOG_DEBUG, "subsubframes: %i\n", s->subsubframes[s->current_subframe]);
> av_log(s->avctx, AV_LOG_DEBUG, "partial samples: %i\n",
> - s->partial_samples);
> - for (j = 0; j< s->prim_channels; j++) {
> + s->partial_samples[s->current_subframe]);
> + for (j = base_channel; j< s->prim_channels; j++) {
> av_log(s->avctx, AV_LOG_DEBUG, "prediction mode:");
> for (k = 0; k< s->subband_activity[j]; k++)
> av_log(s->avctx, AV_LOG_DEBUG, " %i", s->prediction_mode[j][k]);
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> for (k = 0; k< s->subband_activity[j]; k++)
> av_log(s->avctx, AV_LOG_DEBUG,
> "prediction coefs: %f, %f, %f, %f\n",
> @@ -741,19 +746,19 @@
> (float) adpcm_vb[s->prediction_vq[j][k]][2] / 8192,
> (float) adpcm_vb[s->prediction_vq[j][k]][3] / 8192);
> }
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> av_log(s->avctx, AV_LOG_DEBUG, "bitalloc index: ");
> for (k = 0; k< s->vq_start_subband[j]; k++)
> av_log(s->avctx, AV_LOG_DEBUG, "%2.2i ", s->bitalloc[j][k]);
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> av_log(s->avctx, AV_LOG_DEBUG, "Transition mode:");
> for (k = 0; k< s->subband_activity[j]; k++)
> av_log(s->avctx, AV_LOG_DEBUG, " %i", s->transition_mode[j][k]);
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> av_log(s->avctx, AV_LOG_DEBUG, "Scale factor:");
> for (k = 0; k< s->subband_activity[j]; k++) {
> if (k>= s->vq_start_subband[j] || s->bitalloc[j][k]> 0)
> @@ -763,7 +768,7 @@
> }
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> - for (j = 0; j< s->prim_channels; j++) {
> + for (j = base_channel; j< s->prim_channels; j++) {
> if (s->joint_intensity[j]> 0) {
> int source_channel = s->joint_intensity[j] - 1;
> av_log(s->avctx, AV_LOG_DEBUG, "Joint scale factor index:\n");
> @@ -772,7 +777,7 @@
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> }
> - if (s->prim_channels> 2&& s->downmix) {
> + if (!base_channel&& s->prim_channels> 2&& s->downmix) {
> av_log(s->avctx, AV_LOG_DEBUG, "Downmix coeffs:\n");
> for (j = 0; j< s->prim_channels; j++) {
> av_log(s->avctx, AV_LOG_DEBUG, "Channel 0,%d = %f\n", j, dca_downmix_coeffs[s->downmix_coef[j][0]]);
> @@ -780,10 +785,10 @@
> }
> av_log(s->avctx, AV_LOG_DEBUG, "\n");
> }
> - for (j = 0; j< s->prim_channels; j++)
> + for (j = base_channel; j< s->prim_channels; j++)
> for (k = s->vq_start_subband[j]; k< s->subband_activity[j]; k++)
> av_log(s->avctx, AV_LOG_DEBUG, "VQ index: %i\n", s->high_freq_vq[j][k]);
> - if(s->lfe){
> + if (!base_channel&& s->lfe) {
> int lfe_samples = 2 * s->lfe * (4 + block_index);
> int lfe_end_sample = 2 * s->lfe * (4 + block_index + s->subsubframes[s->current_subframe]);
>
> @@ -955,7 +960,7 @@
> static const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 };
> static const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 };
>
> -static int dca_subsubframe(DCAContext * s, int block_index)
> +static int dca_subsubframe(DCAContext * s, int base_channel, int block_index)
> {
> int k, l;
> int subsubframe = s->current_subsubframe;
> @@ -976,7 +981,7 @@
> else
> quant_step_table = lossy_quant_d;
>
> - for (k = 0; k< s->prim_channels; k++) {
> + for (k = base_channel; k< s->prim_channels; k++) {
> for (l = 0; l< s->vq_start_subband[k]; l++) {
> int m;
>
> @@ -1073,7 +1078,7 @@
> }
>
> /* Check for DSYNC after subsubframe */
> - if (s->aspf || subsubframe == s->subsubframes - 1) {
> + if (s->aspf || subsubframe == s->subsubframes[s->current_subframe] - 1) {
> if (0xFFFF == get_bits(&s->gb, 16)) { /* 0xFFFF */
> #ifdef TRACE
> av_log(s->avctx, AV_LOG_DEBUG, "Got subframe DSYNC\n");
> @@ -1084,7 +1089,7 @@
> }
>
> /* Backup predictor history for adpcm */
> - for (k = 0; k< s->prim_channels; k++)
> + for (k = base_channel; k< s->prim_channels; k++)
> for (l = 0; l< s->vq_start_subband[k]; l++)
> memcpy(s->subband_samples_hist[k][l],&subband_samples[k][l][4],
> 4 * sizeof(subband_samples[0][0][0]));
> @@ -1123,8 +1128,7 @@
> return 0;
> }
>
> -
>
Cosmetics.
> -static int dca_subframe_footer(DCAContext * s)
> +static int dca_subframe_footer(DCAContext * s, int base_channel)
> {
> int aux_data_count = 0, i;
>
> @@ -1132,17 +1136,20 @@
> * Unpack optional information
> */
>
> - if (s->timestamp)
> - get_bits(&s->gb, 32);
> + /* presumably optional information only appears in the core? */
> + if (!base_channel) {
> + if (s->timestamp)
> + get_bits(&s->gb, 32);
>
> - if (s->aux_data)
> - aux_data_count = get_bits(&s->gb, 6);
> + if (s->aux_data)
> + aux_data_count = get_bits(&s->gb, 6);
>
>
Cosmetics.
> - for (i = 0; i< aux_data_count; i++)
> - get_bits(&s->gb, 8);
> + for (i = 0; i< aux_data_count; i++)
> + get_bits(&s->gb, 8);
>
Cosmetics.
>
> - if (s->crc_present&& (s->downmix || s->dynrange))
> - get_bits(&s->gb, 16);
> + if (s->crc_present&& (s->downmix || s->dynrange))
> + get_bits(&s->gb, 16);
> + }
>
Cosmetics.
>
> return 0;
> }
> @@ -1153,7 +1160,7 @@
> * @param s pointer to the DCAContext
> */
>
> -static int dca_decode_block(DCAContext * s, int block_index)
> +static int dca_decode_block(DCAContext * s, int base_channel, int block_index)
> {
>
> /* Sanity check */
> @@ -1168,7 +1175,7 @@
> av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_header\n");
> #endif
> /* Read subframe header */
> - if (dca_subframe_header(s, block_index))
> + if (dca_subframe_header(s, base_channel, block_index))
> return -1;
> }
>
> @@ -1176,12 +1183,12 @@
> #ifdef TRACE
> av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subsubframe\n");
> #endif
> - if (dca_subsubframe(s, block_index))
> + if (dca_subsubframe(s, base_channel, block_index))
> return -1;
>
> /* Update state */
> s->current_subsubframe++;
> - if (s->current_subsubframe>= s->subsubframes) {
> + if (s->current_subsubframe>= s->subsubframes[s->current_subframe]) {
> s->current_subsubframe = 0;
> s->current_subframe++;
> }
> @@ -1190,7 +1197,7 @@
> av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_footer\n");
> #endif
> /* Read subframe footer */
> - if (dca_subframe_footer(s))
> + if (dca_subframe_footer(s, base_channel))
> return -1;
> }
>
> @@ -1250,7 +1257,9 @@
> int buf_size = avpkt->size;
>
> int lfe_samples;
> + int num_core_channels = 0;
> int i;
> + int xch_present = 0;
> int16_t *samples = data;
> DCAContext *s = avctx->priv_data;
> int channels;
> @@ -1273,7 +1282,52 @@
> avctx->bit_rate = s->bit_rate;
>
> for (i = 0; i< (s->sample_blocks / 8); i++) {
> - dca_decode_block(s, i);
> + dca_decode_block(s, 0, i);
> + }
> +
> + /* record number of core channels incase less than max channels are requested */
> + num_core_channels = s->prim_channels;
> +
> + /* extensions start at 32-bit boundaries into bitstream */
> + skip_bits(&s->gb, (-get_bits_count(&s->gb))& 31);
> +
> + while(get_bits_left(&s->gb)>= 32) {
> + uint32_t bits = get_bits(&s->gb, 32);
> +
> + switch(bits) {
> + case 0x5a5a5a5a: {
> + int ext_base_ch = s->prim_channels;
> + int ext_amode;
> +
> + /* skip length-to-end-of-frame field for the moment */
> + skip_bits(&s->gb, 10);
> +
> + /* extension amode should == 1, number of channels in extension */
> + /* AFAIK XCh is not used for more channels */
> + if ((ext_amode = get_bits(&s->gb, 4)) != 1) {
> + av_log(avctx, AV_LOG_ERROR, "XCh extension amode %d not"
> + " supported!\n",ext_amode);
> + continue;
> + }
> +
> + /* much like core primary audio coding header */
> + dca_parse_audio_coding_header(s, ext_base_ch);
> +
> + for (i = 0; i< (s->sample_blocks / 8); i++) {
> + dca_decode_block(s, ext_base_ch, i);
> + }
> +
> + xch_present = 1;
> + break;
> + }
> + case 0x1d95f262:
> + av_log(avctx, AV_LOG_DEBUG, "Possible X96 extension found at %d bits\n", get_bits_count(&s->gb));
> + av_log(avctx, AV_LOG_DEBUG, "FSIZE96 = %d bytes\n", get_bits(&s->gb, 12)+1);
> + av_log(avctx, AV_LOG_DEBUG, "REVNO = %d\n", get_bits(&s->gb, 4));
> + break;
> + }
> +
> + skip_bits(&s->gb, (-get_bits_count(&s->gb))& 31);
> }
>
> channels = s->prim_channels + !!s->lfe;
> @@ -1281,11 +1335,22 @@
> if (s->amode<16) {
> avctx->channel_layout = dca_core_channel_layout[s->amode];
>
> - if (s->lfe) {
> - avctx->channel_layout |= CH_LOW_FREQUENCY;
> - s->channel_order_tab = dca_channel_reorder_lfe[s->amode];
> - } else
> - s->channel_order_tab = dca_channel_reorder_nolfe[s->amode];
> + if (xch_present&& (!avctx->request_channels ||
> + avctx->request_channels> num_core_channels)) {
> + avctx->channel_layout |= CH_BACK_CENTER;
> + if (s->lfe) {
> + avctx->channel_layout |= CH_LOW_FREQUENCY;
> + s->channel_order_tab = dca_channel_reorder_lfe_xch[s->amode];
> + } else {
> + s->channel_order_tab = dca_channel_reorder_nolfe_xch[s->amode];
> + }
> + } else {
> + if (s->lfe) {
> + avctx->channel_layout |= CH_LOW_FREQUENCY;
> + s->channel_order_tab = dca_channel_reorder_lfe[s->amode];
> + } else
> + s->channel_order_tab = dca_channel_reorder_nolfe[s->amode];
> + }
>
> if (s->prim_channels> 0&&
> s->channel_order_tab[s->prim_channels - 1]< 0)
>
Patch ok after removal of cosmetics.
MvH
Benjamin Larsson
More information about the ffmpeg-devel
mailing list