avcodec/dcaenc: unbreak >4 channel support
LFE channel is still broken, search for FIXME. Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
		@@ -58,6 +58,7 @@ typedef struct DCAEncContext {
 | 
				
			|||||||
    int lfe_scale_factor;
 | 
					    int lfe_scale_factor;
 | 
				
			||||||
    softfloat lfe_quant;
 | 
					    softfloat lfe_quant;
 | 
				
			||||||
    int32_t lfe_peak_cb;
 | 
					    int32_t lfe_peak_cb;
 | 
				
			||||||
 | 
					    const int8_t *channel_order_tab;  ///< channel reordering table, lfe and non lfe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int32_t history[512][MAX_CHANNELS]; /* This is a circular buffer */
 | 
					    int32_t history[512][MAX_CHANNELS]; /* This is a circular buffer */
 | 
				
			||||||
    int32_t subband[SUBBAND_SAMPLES][DCAENC_SUBBANDS][MAX_CHANNELS];
 | 
					    int32_t subband[SUBBAND_SAMPLES][DCAENC_SUBBANDS][MAX_CHANNELS];
 | 
				
			||||||
@@ -133,8 +134,12 @@ static int encode_init(AVCodecContext *avctx)
 | 
				
			|||||||
        return AVERROR_PATCHWELCOME;
 | 
					        return AVERROR_PATCHWELCOME;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (c->lfe_channel)
 | 
					    if (c->lfe_channel) {
 | 
				
			||||||
        c->fullband_channels--;
 | 
					        c->fullband_channels--;
 | 
				
			||||||
 | 
					        c->channel_order_tab = ff_dca_channel_reorder_lfe[c->channel_config];
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        c->channel_order_tab = ff_dca_channel_reorder_nolfe[c->channel_config];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < 9; i++) {
 | 
					    for (i = 0; i < 9; i++) {
 | 
				
			||||||
        if (sample_rates[i] == avctx->sample_rate)
 | 
					        if (sample_rates[i] == avctx->sample_rate)
 | 
				
			||||||
@@ -243,6 +248,7 @@ static void subband_transform(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
        /* History is copied because it is also needed for PSY */
 | 
					        /* History is copied because it is also needed for PSY */
 | 
				
			||||||
        int32_t hist[512];
 | 
					        int32_t hist[512];
 | 
				
			||||||
        int hist_start = 0;
 | 
					        int hist_start = 0;
 | 
				
			||||||
 | 
					        const int chi = c->channel_order_tab[ch];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < 512; i++)
 | 
					        for (i = 0; i < 512; i++)
 | 
				
			||||||
            hist[i] = c->history[i][ch];
 | 
					            hist[i] = c->history[i][ch];
 | 
				
			||||||
@@ -279,7 +285,7 @@ static void subband_transform(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            /* Copy in 32 new samples from input */
 | 
					            /* Copy in 32 new samples from input */
 | 
				
			||||||
            for (i = 0; i < 32; i++)
 | 
					            for (i = 0; i < 32; i++)
 | 
				
			||||||
                hist[i + hist_start] = input[(subs * 32 + i) * c->channels + ch];
 | 
					                hist[i + hist_start] = input[(subs * 32 + i) * c->channels + chi];
 | 
				
			||||||
            hist_start = (hist_start + 32) & 511;
 | 
					            hist_start = (hist_start + 32) & 511;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -288,6 +294,7 @@ static void subband_transform(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
static void lfe_downsample(DCAEncContext *c, const int32_t *input)
 | 
					static void lfe_downsample(DCAEncContext *c, const int32_t *input)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* FIXME: make 128x LFE downsampling possible */
 | 
					    /* FIXME: make 128x LFE downsampling possible */
 | 
				
			||||||
 | 
					    const int lfech = ff_dca_lfe_index[c->channel_config];
 | 
				
			||||||
    int i, j, lfes;
 | 
					    int i, j, lfes;
 | 
				
			||||||
    int32_t hist[512];
 | 
					    int32_t hist[512];
 | 
				
			||||||
    int32_t accum;
 | 
					    int32_t accum;
 | 
				
			||||||
@@ -309,7 +316,7 @@ static void lfe_downsample(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* Copy in 64 new samples from input */
 | 
					        /* Copy in 64 new samples from input */
 | 
				
			||||||
        for (i = 0; i < 64; i++)
 | 
					        for (i = 0; i < 64; i++)
 | 
				
			||||||
            hist[i + hist_start] = input[(lfes * 64 + i) * c->channels + c->channels - 1];
 | 
					            hist[i + hist_start] = input[(lfes * 64 + i) * c->channels + lfech];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        hist_start = (hist_start + 64) & 511;
 | 
					        hist_start = (hist_start + 64) & 511;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -497,10 +504,12 @@ static void calc_masking(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for (ssf = 0; ssf < SUBSUBFRAMES; ssf++)
 | 
					    for (ssf = 0; ssf < SUBSUBFRAMES; ssf++)
 | 
				
			||||||
        for (ch = 0; ch < c->fullband_channels; ch++) {
 | 
					        for (ch = 0; ch < c->fullband_channels; ch++) {
 | 
				
			||||||
 | 
					            const int chi = c->channel_order_tab[ch];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (i = 0, k = 128 + 256 * ssf; k < 512; i++, k++)
 | 
					            for (i = 0, k = 128 + 256 * ssf; k < 512; i++, k++)
 | 
				
			||||||
                data[i] = c->history[k][ch];
 | 
					                data[i] = c->history[k][ch];
 | 
				
			||||||
            for (k -= 512; i < 512; i++, k++)
 | 
					            for (k -= 512; i < 512; i++, k++)
 | 
				
			||||||
                data[i] = input[k * c->channels + ch];
 | 
					                data[i] = input[k * c->channels + chi];
 | 
				
			||||||
            adjust_jnd(c->samplerate_index, data, c->masking_curve_cb[ssf]);
 | 
					            adjust_jnd(c->samplerate_index, data, c->masking_curve_cb[ssf]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    for (i = 0; i < 256; i++) {
 | 
					    for (i = 0; i < 256; i++) {
 | 
				
			||||||
@@ -632,8 +641,11 @@ static void shift_history(DCAEncContext *c, const int32_t *input)
 | 
				
			|||||||
    int k, ch;
 | 
					    int k, ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (k = 0; k < 512; k++)
 | 
					    for (k = 0; k < 512; k++)
 | 
				
			||||||
        for (ch = 0; ch < c->channels; ch++)
 | 
					        for (ch = 0; ch < c->channels; ch++) {
 | 
				
			||||||
            c->history[k][ch] = input[k * c->channels + ch];
 | 
					            const int chi = c->channel_order_tab[ch];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            c->history[k][ch] = input[k * c->channels + chi];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t quantize_value(int32_t value, softfloat quant)
 | 
					static int32_t quantize_value(int32_t value, softfloat quant)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user