|  | @@ -219,6 +219,51 @@ static inline int16_t dither_int16(dither_state *state) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* END Mersenne Twister */ |  |  | /* END Mersenne Twister */ | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /** | 
														
													
														
															
																|  |  |  |  |  | * Generate a Kaiser Window. | 
														
													
														
															
																|  |  |  |  |  | */ | 
														
													
														
															
																|  |  |  |  |  | static void | 
														
													
														
															
																|  |  |  |  |  | k_window_init(int alpha, double *window, int n, int iter) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int j, k; | 
														
													
														
															
																|  |  |  |  |  | double a, x; | 
														
													
														
															
																|  |  |  |  |  | a = alpha * M_PI / n; | 
														
													
														
															
																|  |  |  |  |  | a = a*a; | 
														
													
														
															
																|  |  |  |  |  | for(k=0; k<n; k++) { | 
														
													
														
															
																|  |  |  |  |  | x = k * (n - k) * a; | 
														
													
														
															
																|  |  |  |  |  | window[k] = 1.0; | 
														
													
														
															
																|  |  |  |  |  | for(j=iter; j>0; j--) { | 
														
													
														
															
																|  |  |  |  |  | window[k] = (window[k] * x / (j*j)) + 1.0; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /** | 
														
													
														
															
																|  |  |  |  |  | * Generate a Kaiser-Bessel Derived Window. | 
														
													
														
															
																|  |  |  |  |  | * @param alpha  determines window shape | 
														
													
														
															
																|  |  |  |  |  | * @param window array to fill with window values | 
														
													
														
															
																|  |  |  |  |  | * @param n      length of the window | 
														
													
														
															
																|  |  |  |  |  | * @param iter   number of iterations to use in BesselI0 | 
														
													
														
															
																|  |  |  |  |  | */ | 
														
													
														
															
																|  |  |  |  |  | static void | 
														
													
														
															
																|  |  |  |  |  | kbd_window_init(int alpha, double *window, int n, int iter) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int k, n2; | 
														
													
														
															
																|  |  |  |  |  | double *kwindow; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | n2 = n >> 1; | 
														
													
														
															
																|  |  |  |  |  | kwindow = &window[n2]; | 
														
													
														
															
																|  |  |  |  |  | k_window_init(alpha, kwindow, n2, iter); | 
														
													
														
															
																|  |  |  |  |  | window[0] = kwindow[0]; | 
														
													
														
															
																|  |  |  |  |  | for(k=1; k<n2; k++) { | 
														
													
														
															
																|  |  |  |  |  | window[k] = window[k-1] + kwindow[k]; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | for(k=0; k<n2; k++) { | 
														
													
														
															
																|  |  |  |  |  | window[k] = sqrt(window[k] / (window[n2-1]+1)); | 
														
													
														
															
																|  |  |  |  |  | window[n-1-k] = window[k]; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | static void generate_quantizers_table(int16_t quantizers[], int level, int length) |  |  | static void generate_quantizers_table(int16_t quantizers[], int level, int length) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int i; |  |  | int i; | 
														
													
												
													
														
															
																|  | @@ -342,6 +387,9 @@ static void ac3_tables_init(void) | 
														
													
														
															
																|  |  | x_cos2[i] = -cos(alpha); |  |  | x_cos2[i] = -cos(alpha); | 
														
													
														
															
																|  |  | x_sin2[i] = -sin(alpha); |  |  | x_sin2[i] = -sin(alpha); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /* Kaiser-Bessel derived window. */ | 
														
													
														
															
																|  |  |  |  |  | kbd_window_init(5, window, 256, 100); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -374,8 +422,6 @@ static int ac3_parse_sync_info(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | GetBitContext *gb = &ctx->gb; |  |  | GetBitContext *gb = &ctx->gb; | 
														
													
														
															
																|  |  | int frmsizecod, bsid; |  |  | int frmsizecod, bsid; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | memset (ctx, sizeof (AC3DecodeContext), 0); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | skip_bits(gb, 16); //skip the sync_word, sync_info->sync_word = get_bits(gb, 16); |  |  | skip_bits(gb, 16); //skip the sync_word, sync_info->sync_word = get_bits(gb, 16); | 
														
													
														
															
																|  |  | ctx->crc1 = get_bits(gb, 16); |  |  | ctx->crc1 = get_bits(gb, 16); | 
														
													
														
															
																|  |  | ctx->fscod = get_bits(gb, 2); |  |  | ctx->fscod = get_bits(gb, 2); | 
														
													
												
													
														
															
																|  | @@ -471,7 +517,6 @@ static void ac3_parse_bsi(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | static int decode_exponents(GetBitContext *gb, int expstr, int ngrps, uint8_t absexp, uint8_t *dexps) |  |  | static int decode_exponents(GetBitContext *gb, int expstr, int ngrps, uint8_t absexp, uint8_t *dexps) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int exps; |  |  | int exps; | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "%d\n", ngrps); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | while (ngrps--) { |  |  | while (ngrps--) { | 
														
													
														
															
																|  |  | exps = get_bits(gb, 7); |  |  | exps = get_bits(gb, 7); | 
														
													
												
													
														
															
																|  | @@ -530,7 +575,7 @@ static inline int logadd(int a, int b) | 
														
													
														
															
																|  |  | int c = a - b; |  |  | int c = a - b; | 
														
													
														
															
																|  |  | int address; |  |  | int address; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | address = FFMIN(ABS(c) >> 1, 255); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | address = FFMIN((ABS(c) >> 1), 255); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (c >= 0) |  |  | if (c >= 0) | 
														
													
														
															
																|  |  | return (a + latab[address]); |  |  | return (a + latab[address]); | 
														
													
												
													
														
															
																|  | @@ -544,16 +589,16 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin) | 
														
													
														
															
																|  |  | if ((b0 + 256) == b1) |  |  | if ((b0 + 256) == b1) | 
														
													
														
															
																|  |  | a = 384; |  |  | a = 384; | 
														
													
														
															
																|  |  | else if (b0 > b1) |  |  | else if (b0 > b1) | 
														
													
														
															
																|  |  | a = FFMAX(0, a - 64); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | a = FFMAX(0, (a - 64)); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | else if (bin < 20) { |  |  | else if (bin < 20) { | 
														
													
														
															
																|  |  | if ((b0 + 256) == b1) |  |  | if ((b0 + 256) == b1) | 
														
													
														
															
																|  |  | a = 320; |  |  | a = 320; | 
														
													
														
															
																|  |  | else if (b0 > b1) |  |  | else if (b0 > b1) | 
														
													
														
															
																|  |  | a = FFMAX(0, a - 64); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | a = FFMAX(0, (a - 64)); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | else |  |  | else | 
														
													
														
															
																|  |  | a = FFMAX(0, a - 128); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | a = FFMAX(0, (a - 128)); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | return a; |  |  | return a; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -563,17 +608,16 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin) | 
														
													
														
															
																|  |  | * chnl = 5 coupling channel |  |  | * chnl = 5 coupling channel | 
														
													
														
															
																|  |  | * chnl = 6 lfe channel |  |  | * chnl = 6 lfe channel | 
														
													
														
															
																|  |  | */ |  |  | */ | 
														
													
														
															
																|  |  | static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | static void do_bit_allocation(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int16_t psd[256], bndpsd[50], excite[50], mask[50], delta; | 
														
													
														
															
																|  |  | int sdecay, fdecay, sgain, dbknee, floor; |  |  | int sdecay, fdecay, sgain, dbknee, floor; | 
														
													
														
															
																|  |  | int lowcomp = 0, fgain = 0, snroffset = 0, fastleak = 0, slowleak = 0; |  |  |  | 
														
													
														
															
																|  |  | int psd[256], bndpsd[50], excite[50], mask[50], delta; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int lowcomp = 0, fgain = 0, snroffset = 0, fastleak = 0, slowleak = 0, do_delta = 0; | 
														
													
														
															
																|  |  | int start = 0, end = 0, bin = 0, i = 0, j = 0, k = 0, lastbin = 0, bndstrt = 0; |  |  | int start = 0, end = 0, bin = 0, i = 0, j = 0, k = 0, lastbin = 0, bndstrt = 0; | 
														
													
														
															
																|  |  | int bndend = 0, begin = 0, deltnseg = 0, band = 0, seg = 0, address = 0; |  |  | int bndend = 0, begin = 0, deltnseg = 0, band = 0, seg = 0, address = 0; | 
														
													
														
															
																|  |  | int fscod = ctx->fscod; |  |  | int fscod = ctx->fscod; | 
														
													
														
															
																|  |  | uint8_t *exps, *deltoffst = 0, *deltlen = 0, *deltba = 0; |  |  |  | 
														
													
														
															
																|  |  | uint8_t *baps; |  |  |  | 
														
													
														
															
																|  |  | int do_delta = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | uint8_t *deltoffst = 0, *deltlen = 0, *deltba = 0; | 
														
													
														
															
																|  |  |  |  |  | uint8_t *exps = 0, *bap = 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* initialization */ |  |  | /* initialization */ | 
														
													
														
															
																|  |  | sdecay = sdecaytab[ctx->sdcycod]; |  |  | sdecay = sdecaytab[ctx->sdcycod]; | 
														
													
												
													
														
															
																|  | @@ -590,8 +634,8 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | fastleak = (ctx->cplfleak << 8) + 768; |  |  | fastleak = (ctx->cplfleak << 8) + 768; | 
														
													
														
															
																|  |  | slowleak = (ctx->cplsleak << 8) + 768; |  |  | slowleak = (ctx->cplsleak << 8) + 768; | 
														
													
														
															
																|  |  | exps = ctx->dcplexps; |  |  | exps = ctx->dcplexps; | 
														
													
														
															
																|  |  | baps = ctx->cplbap; |  |  |  | 
														
													
														
															
																|  |  | if (ctx->cpldeltbae == AC3_DBASTR_NEW) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bap = ctx->cplbap; | 
														
													
														
															
																|  |  |  |  |  | if (ctx->cpldeltbae == AC3_DBASTR_NEW || ctx->deltbae == AC3_DBASTR_REUSE) { | 
														
													
														
															
																|  |  | do_delta = 1; |  |  | do_delta = 1; | 
														
													
														
															
																|  |  | deltnseg = ctx->cpldeltnseg; |  |  | deltnseg = ctx->cpldeltnseg; | 
														
													
														
															
																|  |  | deltoffst = ctx->cpldeltoffst; |  |  | deltoffst = ctx->cpldeltoffst; | 
														
													
												
													
														
															
																|  | @@ -608,7 +652,7 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | fgain = fgaintab[ctx->lfefgaincod]; |  |  | fgain = fgaintab[ctx->lfefgaincod]; | 
														
													
														
															
																|  |  | snroffset = (((ctx->csnroffst - 15) << 4) + ctx->lfefsnroffst) << 2; |  |  | snroffset = (((ctx->csnroffst - 15) << 4) + ctx->lfefsnroffst) << 2; | 
														
													
														
															
																|  |  | exps = ctx->dlfeexps; |  |  | exps = ctx->dlfeexps; | 
														
													
														
															
																|  |  | baps = ctx->lfebap; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bap = ctx->lfebap; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | else { |  |  | else { | 
														
													
														
															
																|  |  | start = 0; |  |  | start = 0; | 
														
													
												
													
														
															
																|  | @@ -619,8 +663,8 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | fgain = fgaintab[ctx->fgaincod[chnl]]; |  |  | fgain = fgaintab[ctx->fgaincod[chnl]]; | 
														
													
														
															
																|  |  | snroffset = (((ctx->csnroffst - 15) << 4) + ctx->fsnroffst[chnl]) << 2; |  |  | snroffset = (((ctx->csnroffst - 15) << 4) + ctx->fsnroffst[chnl]) << 2; | 
														
													
														
															
																|  |  | exps = ctx->dexps[chnl]; |  |  | exps = ctx->dexps[chnl]; | 
														
													
														
															
																|  |  | baps = ctx->bap[chnl]; |  |  |  | 
														
													
														
															
																|  |  | if (ctx->deltbae[chnl] == AC3_DBASTR_NEW) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bap = ctx->bap[chnl]; | 
														
													
														
															
																|  |  |  |  |  | if (ctx->deltbae[chnl] == AC3_DBASTR_NEW || ctx->deltbae[chnl] == AC3_DBASTR_REUSE) { | 
														
													
														
															
																|  |  | do_delta = 1; |  |  | do_delta = 1; | 
														
													
														
															
																|  |  | deltnseg = ctx->deltnseg[chnl]; |  |  | deltnseg = ctx->deltnseg[chnl]; | 
														
													
														
															
																|  |  | deltoffst = ctx->deltoffst[chnl]; |  |  | deltoffst = ctx->deltoffst[chnl]; | 
														
													
												
													
														
															
																|  | @@ -630,13 +674,13 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (bin = start; bin < end; bin++) /* exponent mapping into psd */ |  |  | for (bin = start; bin < end; bin++) /* exponent mapping into psd */ | 
														
													
														
															
																|  |  | psd[bin] = (3072 - ((int)(exps[bin]) << 7)); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | psd[bin] = (3072 - (exps[bin] << 7)); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* psd integration */ |  |  | /* psd integration */ | 
														
													
														
															
																|  |  | j = start; |  |  | j = start; | 
														
													
														
															
																|  |  | k = masktab[start]; |  |  | k = masktab[start]; | 
														
													
														
															
																|  |  | do { |  |  | do { | 
														
													
														
															
																|  |  | lastbin = FFMIN(bndtab[k] + bndsz[k], end); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | lastbin = FFMIN((bndtab[k] + bndsz[k]), end); | 
														
													
														
															
																|  |  | bndpsd[k] = psd[j]; |  |  | bndpsd[k] = psd[j]; | 
														
													
														
															
																|  |  | j++; |  |  | j++; | 
														
													
														
															
																|  |  | for (i = j; i < lastbin; i++) { |  |  | for (i = j; i < lastbin; i++) { | 
														
													
												
													
														
															
																|  | @@ -656,25 +700,25 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | excite[1] = bndpsd[1] - fgain - lowcomp; |  |  | excite[1] = bndpsd[1] - fgain - lowcomp; | 
														
													
														
															
																|  |  | begin = 7; |  |  | begin = 7; | 
														
													
														
															
																|  |  | for (bin = 2; bin < 7; bin++) { |  |  | for (bin = 2; bin < 7; bin++) { | 
														
													
														
															
																|  |  | if (!(chnl == 6 && bin == 6)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((bndend != 7) || (bin != 6)) | 
														
													
														
															
																|  |  | lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin); |  |  | lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin); | 
														
													
														
															
																|  |  | fastleak = bndpsd[bin] - fgain; |  |  | fastleak = bndpsd[bin] - fgain; | 
														
													
														
															
																|  |  | slowleak = bndpsd[bin] - sgain; |  |  | slowleak = bndpsd[bin] - sgain; | 
														
													
														
															
																|  |  | excite[bin] = fastleak - lowcomp; |  |  | excite[bin] = fastleak - lowcomp; | 
														
													
														
															
																|  |  | if (!(chnl == 6 && bin == 6)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((bndend != 7) || (bin != 6)) | 
														
													
														
															
																|  |  | if (bndpsd[bin] <= bndpsd[bin + 1]) { |  |  | if (bndpsd[bin] <= bndpsd[bin + 1]) { | 
														
													
														
															
																|  |  | begin = bin + 1; |  |  | begin = bin + 1; | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | for (bin = begin; bin < FFMIN(bndend, 22); bin++) { |  |  | for (bin = begin; bin < FFMIN(bndend, 22); bin++) { | 
														
													
														
															
																|  |  | if (!(chnl == 6 && bin == 6)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((bndend != 7) || (bin != 6)) | 
														
													
														
															
																|  |  | lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin); |  |  | lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin); | 
														
													
														
															
																|  |  | fastleak -= fdecay; |  |  | fastleak -= fdecay; | 
														
													
														
															
																|  |  | fastleak = FFMAX(fastleak, bndpsd[bin] - fgain); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | fastleak = FFMAX(fastleak, (bndpsd[bin] - fgain)); | 
														
													
														
															
																|  |  | slowleak -= sdecay; |  |  | slowleak -= sdecay; | 
														
													
														
															
																|  |  | slowleak = FFMAX(slowleak, bndpsd[bin] - sgain); |  |  |  | 
														
													
														
															
																|  |  | excite[bin] = FFMAX(fastleak - lowcomp, slowleak); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | slowleak = FFMAX(slowleak, (bndpsd[bin] - sgain)); | 
														
													
														
															
																|  |  |  |  |  | excite[bin] = FFMAX((fastleak - lowcomp), slowleak); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | begin = 22; |  |  | begin = 22; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -683,9 +727,9 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | for (bin = begin; bin < bndend; bin++) { |  |  | for (bin = begin; bin < bndend; bin++) { | 
														
													
														
															
																|  |  | fastleak -= fdecay; |  |  | fastleak -= fdecay; | 
														
													
														
															
																|  |  | fastleak = FFMAX(fastleak, bndpsd[bin] - fgain); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | fastleak = FFMAX(fastleak, (bndpsd[bin] - fgain)); | 
														
													
														
															
																|  |  | slowleak -= sdecay; |  |  | slowleak -= sdecay; | 
														
													
														
															
																|  |  | slowleak = FFMAX(slowleak, bndpsd[bin] - sgain); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | slowleak = FFMAX(slowleak, (bndpsd[bin] - sgain)); | 
														
													
														
															
																|  |  | excite[bin] = FFMAX(fastleak, slowleak); |  |  | excite[bin] = FFMAX(fastleak, slowleak); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -700,12 +744,12 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | if (do_delta) { |  |  | if (do_delta) { | 
														
													
														
															
																|  |  | band = 0; |  |  | band = 0; | 
														
													
														
															
																|  |  | for (seg = 0; seg < deltnseg + 1; seg++) { |  |  | for (seg = 0; seg < deltnseg + 1; seg++) { | 
														
													
														
															
																|  |  | band += (int)(deltoffst[seg]); |  |  |  | 
														
													
														
															
																|  |  | if ((int)(deltba[seg]) >= 4) |  |  |  | 
														
													
														
															
																|  |  | delta = ((int)(deltba[seg]) - 3) << 7; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | band += deltoffst[seg]; | 
														
													
														
															
																|  |  |  |  |  | if (deltba[seg] >= 4) | 
														
													
														
															
																|  |  |  |  |  | delta = (deltba[seg] - 3) << 7; | 
														
													
														
															
																|  |  | else |  |  | else | 
														
													
														
															
																|  |  | delta = ((int)(deltba[seg]) - 4) << 7; |  |  |  | 
														
													
														
															
																|  |  | for (k = 0; k < (int)(deltlen[seg]); k++) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | delta = (deltba[seg] - 4) << 7; | 
														
													
														
															
																|  |  |  |  |  | for (k = 0; k < deltlen[seg]; k++) { | 
														
													
														
															
																|  |  | mask[band] += delta; |  |  | mask[band] += delta; | 
														
													
														
															
																|  |  | band++; |  |  | band++; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -716,7 +760,7 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | i = start; |  |  | i = start; | 
														
													
														
															
																|  |  | j = masktab[start]; |  |  | j = masktab[start]; | 
														
													
														
															
																|  |  | do { |  |  | do { | 
														
													
														
															
																|  |  | lastbin = FFMIN(bndtab[j] + bndsz[j], end); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | lastbin = FFMIN((bndtab[j] + bndsz[j]), end); | 
														
													
														
															
																|  |  | mask[j] -= snroffset; |  |  | mask[j] -= snroffset; | 
														
													
														
															
																|  |  | mask[j] -= floor; |  |  | mask[j] -= floor; | 
														
													
														
															
																|  |  | if (mask[j] < 0) |  |  | if (mask[j] < 0) | 
														
													
												
													
														
															
																|  | @@ -725,48 +769,28 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl) | 
														
													
														
															
																|  |  | mask[j] += floor; |  |  | mask[j] += floor; | 
														
													
														
															
																|  |  | for (k = i; k < lastbin; k++) { |  |  | for (k = i; k < lastbin; k++) { | 
														
													
														
															
																|  |  | address = (psd[i] - mask[j]) >> 5; |  |  | address = (psd[i] - mask[j]) >> 5; | 
														
													
														
															
																|  |  | address = FFMIN(63, FFMAX(0, address)); |  |  |  | 
														
													
														
															
																|  |  | baps[i] = baptab[address]; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | address = FFMIN(63, (FFMAX(0, address))); | 
														
													
														
															
																|  |  |  |  |  | bap[i] = baptab[address]; | 
														
													
														
															
																|  |  | i++; |  |  | i++; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | j++; |  |  | j++; | 
														
													
														
															
																|  |  | } while (end > lastbin); |  |  | } while (end > lastbin); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | static void do_bit_allocation(AC3DecodeContext *ctx, int flags) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | /* Check if snroffsets are zero. */ | 
														
													
														
															
																|  |  |  |  |  | static int is_snr_offsets_zero(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int i, zerosnroffst = 1; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | if (!flags) /* bit allocation is not required */ |  |  |  | 
														
													
														
															
																|  |  | return; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int i; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* Check if snroffsets are zero. */ |  |  |  | 
														
													
														
															
																|  |  | if ((ctx->csnroffst) || (ctx->chincpl && ctx->cplfsnroffst) || |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if ((ctx->csnroffst) || (ctx->cplinu && ctx->cplfsnroffst) || | 
														
													
														
															
																|  |  | (ctx->lfeon && ctx->lfefsnroffst)) |  |  | (ctx->lfeon && ctx->lfefsnroffst)) | 
														
													
														
															
																|  |  | zerosnroffst = 0; |  |  |  | 
														
													
														
															
																|  |  | if (zerosnroffst) |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->nfchans; i++) |  |  |  | 
														
													
														
															
																|  |  | if (ctx->fsnroffst[i]) { |  |  |  | 
														
													
														
															
																|  |  | zerosnroffst = 0; |  |  |  | 
														
													
														
															
																|  |  | break; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | if (zerosnroffst) { |  |  |  | 
														
													
														
															
																|  |  | memset(ctx->cplbap, 0, sizeof (ctx->cplbap)); |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->nfchans; i++) |  |  |  | 
														
													
														
															
																|  |  | memset(ctx->bap[i], 0, sizeof (ctx->bap[i])); |  |  |  | 
														
													
														
															
																|  |  | memset(ctx->lfebap, 0, sizeof (ctx->lfebap)); |  |  |  | 
														
													
														
															
																|  |  | return; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | return 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* perform bit allocation */ |  |  |  | 
														
													
														
															
																|  |  | if (ctx->cplinu && (flags & 64)) |  |  |  | 
														
													
														
															
																|  |  | do_bit_allocation1(ctx, 5); |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->nfchans; i++) |  |  | for (i = 0; i < ctx->nfchans; i++) | 
														
													
														
															
																|  |  | if (flags & (1 << i)) |  |  |  | 
														
													
														
															
																|  |  | do_bit_allocation1(ctx, i); |  |  |  | 
														
													
														
															
																|  |  | if (ctx->lfeon && (flags & 32)) |  |  |  | 
														
													
														
															
																|  |  | do_bit_allocation1(ctx, 6); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (ctx->fsnroffst[i]) | 
														
													
														
															
																|  |  |  |  |  | return 0; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | return 1; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */ |  |  | typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */ | 
														
													
												
													
														
															
																|  | @@ -776,7 +800,6 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati | 
														
													
														
															
																|  |  | int l3ptr; |  |  | int l3ptr; | 
														
													
														
															
																|  |  | int l5ptr; |  |  | int l5ptr; | 
														
													
														
															
																|  |  | int l11ptr; |  |  | int l11ptr; | 
														
													
														
															
																|  |  | int bits; |  |  |  | 
														
													
														
															
																|  |  | } mant_groups; |  |  | } mant_groups; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | #define TRANSFORM_COEFF(tc, m, e, f) (tc) = (m) * (f)[(e)] |  |  | #define TRANSFORM_COEFF(tc, m, e, f) (tc) = (m) * (f)[(e)] | 
														
													
												
													
														
															
																|  | @@ -789,13 +812,11 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati | 
														
													
														
															
																|  |  | static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) |  |  | static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | GetBitContext *gb = &ctx->gb; |  |  | GetBitContext *gb = &ctx->gb; | 
														
													
														
															
																|  |  | int ch, bin, start, end, cplbndstrc, bnd, gcode, tbap; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int ch, start, end, cplbndstrc, bnd, gcode, tbap; | 
														
													
														
															
																|  |  | float cplcos[5], cplcoeff; |  |  | float cplcos[5], cplcoeff; | 
														
													
														
															
																|  |  | uint8_t *exps = ctx->dcplexps; |  |  | uint8_t *exps = ctx->dcplexps; | 
														
													
														
															
																|  |  | uint8_t *bap = ctx->cplbap; |  |  | uint8_t *bap = ctx->cplbap; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | int bits_consumed = m->bits; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | cplbndstrc = ctx->cplbndstrc; |  |  | cplbndstrc = ctx->cplbndstrc; | 
														
													
														
															
																|  |  | start = ctx->cplstrtmant; |  |  | start = ctx->cplstrtmant; | 
														
													
														
															
																|  |  | bnd = 0; |  |  | bnd = 0; | 
														
													
												
													
														
															
																|  | @@ -815,9 +836,9 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) | 
														
													
														
															
																|  |  | tbap = bap[start]; |  |  | tbap = bap[start]; | 
														
													
														
															
																|  |  | switch(tbap) { |  |  | switch(tbap) { | 
														
													
														
															
																|  |  | case 0: |  |  | case 0: | 
														
													
														
															
																|  |  | for (ch = 0; ch < ctx->nfchans; ctx++) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | for (ch = 0; ch < ctx->nfchans; ch++) | 
														
													
														
															
																|  |  | if (((ctx->chincpl) >> ch) & 1) { |  |  | if (((ctx->chincpl) >> ch) & 1) { | 
														
													
														
															
																|  |  | if (((ctx->dithflag) >> ch) & 1) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (!(((ctx->dithflag) >> ch) & 1)) { | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, dither_int16(&ctx->dith_state), exps[start], scale_factors); |  |  | TRANSFORM_COEFF(cplcoeff, dither_int16(&ctx->dith_state), exps[start], scale_factors); | 
														
													
														
															
																|  |  | ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch]; |  |  | ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch]; | 
														
													
														
															
																|  |  | } else |  |  | } else | 
														
													
												
													
														
															
																|  | @@ -828,13 +849,10 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) | 
														
													
														
															
																|  |  | case 1: |  |  | case 1: | 
														
													
														
															
																|  |  | if (m->l3ptr > 2) { |  |  | if (m->l3ptr > 2) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 5); |  |  | gcode = get_bits(gb, 5); | 
														
													
														
															
																|  |  | /*if (gcode > 26) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l3_quantizers[0] = l3_quantizers_1[gcode]; |  |  | m->l3_quantizers[0] = l3_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l3_quantizers[1] = l3_quantizers_2[gcode]; |  |  | m->l3_quantizers[1] = l3_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l3_quantizers[2] = l3_quantizers_3[gcode]; |  |  | m->l3_quantizers[2] = l3_quantizers_3[gcode]; | 
														
													
														
															
																|  |  | m->l3ptr = 0; |  |  | m->l3ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 5; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, m->l3_quantizers[m->l3ptr++], exps[start], scale_factors); |  |  | TRANSFORM_COEFF(cplcoeff, m->l3_quantizers[m->l3ptr++], exps[start], scale_factors); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
												
													
														
															
																|  | @@ -842,89 +860,84 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m) | 
														
													
														
															
																|  |  | case 2: |  |  | case 2: | 
														
													
														
															
																|  |  | if (m->l5ptr > 2) { |  |  | if (m->l5ptr > 2) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 7); |  |  | gcode = get_bits(gb, 7); | 
														
													
														
															
																|  |  | /*if (gcode > 124) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l5_quantizers[0] = l5_quantizers_1[gcode]; |  |  | m->l5_quantizers[0] = l5_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l5_quantizers[1] = l5_quantizers_2[gcode]; |  |  | m->l5_quantizers[1] = l5_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l5_quantizers[2] = l5_quantizers_3[gcode]; |  |  | m->l5_quantizers[2] = l5_quantizers_3[gcode]; | 
														
													
														
															
																|  |  | m->l5ptr = 0; |  |  | m->l5ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 7; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, m->l5_quantizers[m->l5ptr++], exps[start], scale_factors); |  |  | TRANSFORM_COEFF(cplcoeff, m->l5_quantizers[m->l5ptr++], exps[start], scale_factors); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 3: |  |  | case 3: | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 3); |  |  |  | 
														
													
														
															
																|  |  | /*if (gcode > 6) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->bits += 3; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, l7_quantizers[gcode], exps[start], scale_factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | TRANSFORM_COEFF(cplcoeff, l7_quantizers[get_bits(gb, 3)], exps[start], scale_factors); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 4: |  |  | case 4: | 
														
													
														
															
																|  |  | if (m->l11ptr > 1) { |  |  | if (m->l11ptr > 1) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 7); |  |  | gcode = get_bits(gb, 7); | 
														
													
														
															
																|  |  | /*if (gcode > 120) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l11_quantizers[0] = l11_quantizers_1[gcode]; |  |  | m->l11_quantizers[0] = l11_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l11_quantizers[1] = l11_quantizers_2[gcode]; |  |  | m->l11_quantizers[1] = l11_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l11ptr = 0; |  |  | m->l11ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 7; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, m->l11_quantizers[m->l11ptr++], exps[start], scale_factors); |  |  | TRANSFORM_COEFF(cplcoeff, m->l11_quantizers[m->l11ptr++], exps[start], scale_factors); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 5: |  |  | case 5: | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 4); |  |  |  | 
														
													
														
															
																|  |  | /*if (gcode > 14) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->bits += 4; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, l15_quantizers[gcode], exps[start], scale_factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | TRANSFORM_COEFF(cplcoeff, l15_quantizers[get_bits(gb, 4)], exps[start], scale_factors); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | default: |  |  | default: | 
														
													
														
															
																|  |  | m->bits += qntztab[bap[bin]]; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(cplcoeff, get_bits(gb, qntztab[tbap]) << (16 - qntztab[tbap]), |  |  | TRANSFORM_COEFF(cplcoeff, get_bits(gb, qntztab[tbap]) << (16 - qntztab[tbap]), | 
														
													
														
															
																|  |  | exps[bin], scale_factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | exps[start], scale_factors); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | for (ch = 0; ch < ctx->nfchans; ch++) |  |  | for (ch = 0; ch < ctx->nfchans; ch++) | 
														
													
														
															
																|  |  | if ((ctx->chincpl >> ch) & 1) |  |  | if ((ctx->chincpl >> ch) & 1) | 
														
													
														
															
																|  |  | ctx->transform_coeffs[ch][bin] = cplcoeff * cplcos[ch]; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ctx->transform_coeffs[ch + 1][start] = cplcoeff * cplcos[ch]; | 
														
													
														
															
																|  |  | start++; |  |  | start++; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | bits_consumed = m->bits - bits_consumed; |  |  |  | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "\tbits consumed by coupling = %d\n", bits_consumed); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* Get the transform coefficients for particular channel */ |  |  | /* Get the transform coefficients for particular channel */ | 
														
													
														
															
																|  |  | static int get_transform_coeffs_ch(uint8_t *exps, uint8_t *bap, float chcoeff, |  |  |  | 
														
													
														
															
																|  |  | float *coeffs, int start, int end, int dith_flag, GetBitContext *gb, |  |  |  | 
														
													
														
															
																|  |  | dither_state *state, mant_groups *m) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | static int get_transform_coeffs_ch(AC3DecodeContext *ctx, int ch_index, mant_groups *m) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int i; |  |  |  | 
														
													
														
															
																|  |  | int gcode; |  |  |  | 
														
													
														
															
																|  |  | int tbap; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | GetBitContext *gb = &ctx->gb; | 
														
													
														
															
																|  |  |  |  |  | int i, gcode, tbap, dithflag, end; | 
														
													
														
															
																|  |  |  |  |  | uint8_t *exps; | 
														
													
														
															
																|  |  |  |  |  | uint8_t *bap; | 
														
													
														
															
																|  |  |  |  |  | float *coeffs; | 
														
													
														
															
																|  |  | float factors[25]; |  |  | float factors[25]; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | int bits_consumed = m->bits; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < 25; i++) |  |  | for (i = 0; i < 25; i++) | 
														
													
														
															
																|  |  | factors[i] = scale_factors[i] * chcoeff; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | factors[i] = scale_factors[i] * ctx->chcoeffs[ch_index]; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | if (ch_index != -1) { /* fbw channels */ | 
														
													
														
															
																|  |  |  |  |  | dithflag = (ctx->dithflag >> ch_index) & 1; | 
														
													
														
															
																|  |  |  |  |  | exps = ctx->dexps[ch_index]; | 
														
													
														
															
																|  |  |  |  |  | bap = ctx->bap[ch_index]; | 
														
													
														
															
																|  |  |  |  |  | coeffs = ctx->transform_coeffs[ch_index + 1]; | 
														
													
														
															
																|  |  |  |  |  | end = ctx->endmant[ch_index]; | 
														
													
														
															
																|  |  |  |  |  | } else if (ch_index == -1) { | 
														
													
														
															
																|  |  |  |  |  | dithflag = 0; | 
														
													
														
															
																|  |  |  |  |  | exps = ctx->dlfeexps; | 
														
													
														
															
																|  |  |  |  |  | bap = ctx->lfebap; | 
														
													
														
															
																|  |  |  |  |  | coeffs = ctx->transform_coeffs[0]; | 
														
													
														
															
																|  |  |  |  |  | end = 7; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (i = start; i < end; i++) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < end; i++) { | 
														
													
														
															
																|  |  | tbap = bap[i]; |  |  | tbap = bap[i]; | 
														
													
														
															
																|  |  | switch (tbap) { |  |  | switch (tbap) { | 
														
													
														
															
																|  |  | case 0: |  |  | case 0: | 
														
													
														
															
																|  |  | if (!dith_flag) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (dithflag) { | 
														
													
														
															
																|  |  | coeffs[i] = 0; |  |  | coeffs[i] = 0; | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | else { |  |  | else { | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], dither_int16(state), exps[i], factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | TRANSFORM_COEFF(coeffs[i], dither_int16(&ctx->dith_state), exps[i], factors); | 
														
													
														
															
																|  |  | coeffs[i] *= LEVEL_PLUS_3DB; |  |  | coeffs[i] *= LEVEL_PLUS_3DB; | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -932,13 +945,10 @@ static int get_transform_coeffs_ch(uint8_t *exps, uint8_t *bap, float chcoeff, | 
														
													
														
															
																|  |  | case 1: |  |  | case 1: | 
														
													
														
															
																|  |  | if (m->l3ptr > 2) { |  |  | if (m->l3ptr > 2) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 5); |  |  | gcode = get_bits(gb, 5); | 
														
													
														
															
																|  |  | /*if (gcode > 26) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l3_quantizers[0] = l3_quantizers_1[gcode]; |  |  | m->l3_quantizers[0] = l3_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l3_quantizers[1] = l3_quantizers_2[gcode]; |  |  | m->l3_quantizers[1] = l3_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l3_quantizers[2] = l3_quantizers_3[gcode]; |  |  | m->l3_quantizers[2] = l3_quantizers_3[gcode]; | 
														
													
														
															
																|  |  | m->l3ptr = 0; |  |  | m->l3ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 5; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], m->l3_quantizers[m->l3ptr++], exps[i], factors); |  |  | TRANSFORM_COEFF(coeffs[i], m->l3_quantizers[m->l3ptr++], exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
												
													
														
															
																|  | @@ -946,56 +956,38 @@ static int get_transform_coeffs_ch(uint8_t *exps, uint8_t *bap, float chcoeff, | 
														
													
														
															
																|  |  | case 2: |  |  | case 2: | 
														
													
														
															
																|  |  | if (m->l5ptr > 2) { |  |  | if (m->l5ptr > 2) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 7); |  |  | gcode = get_bits(gb, 7); | 
														
													
														
															
																|  |  | /*if (gcode > 124) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l5_quantizers[0] = l5_quantizers_1[gcode]; |  |  | m->l5_quantizers[0] = l5_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l5_quantizers[1] = l5_quantizers_2[gcode]; |  |  | m->l5_quantizers[1] = l5_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l5_quantizers[2] = l5_quantizers_3[gcode]; |  |  | m->l5_quantizers[2] = l5_quantizers_3[gcode]; | 
														
													
														
															
																|  |  | m->l5ptr = 0; |  |  | m->l5ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 7; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], m->l5_quantizers[m->l5ptr++], exps[i], factors); |  |  | TRANSFORM_COEFF(coeffs[i], m->l5_quantizers[m->l5ptr++], exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 3: |  |  | case 3: | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 3); |  |  |  | 
														
													
														
															
																|  |  | /*if (gcode > 6) |  |  |  | 
														
													
														
															
																|  |  | return -1; */ |  |  |  | 
														
													
														
															
																|  |  | m->bits += 3; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], l7_quantizers[gcode], exps[i], factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | TRANSFORM_COEFF(coeffs[i], l7_quantizers[get_bits(gb, 3)], exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 4: |  |  | case 4: | 
														
													
														
															
																|  |  | if (m->l11ptr > 1) { |  |  | if (m->l11ptr > 1) { | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 7); |  |  | gcode = get_bits(gb, 7); | 
														
													
														
															
																|  |  | /*if (gcode > 120) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->l11_quantizers[0] = l11_quantizers_1[gcode]; |  |  | m->l11_quantizers[0] = l11_quantizers_1[gcode]; | 
														
													
														
															
																|  |  | m->l11_quantizers[1] = l11_quantizers_2[gcode]; |  |  | m->l11_quantizers[1] = l11_quantizers_2[gcode]; | 
														
													
														
															
																|  |  | m->l11ptr = 0; |  |  | m->l11ptr = 0; | 
														
													
														
															
																|  |  | m->bits += 7; |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], m->l11_quantizers[m->l11ptr++], exps[i], factors); |  |  | TRANSFORM_COEFF(coeffs[i], m->l11_quantizers[m->l11ptr++], exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | case 5: |  |  | case 5: | 
														
													
														
															
																|  |  | gcode = get_bits(gb, 4); |  |  |  | 
														
													
														
															
																|  |  | /*if (gcode > 14) |  |  |  | 
														
													
														
															
																|  |  | return -1;*/ |  |  |  | 
														
													
														
															
																|  |  | m->bits += 4; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], l15_quantizers[gcode], exps[i], factors); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | TRANSFORM_COEFF(coeffs[i], l15_quantizers[get_bits(gb, 4)], exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | default: |  |  | default: | 
														
													
														
															
																|  |  | m->bits += qntztab[bap[i]]; |  |  |  | 
														
													
														
															
																|  |  | TRANSFORM_COEFF(coeffs[i], get_bits(gb, qntztab[tbap]) << (16 - qntztab[tbap]), exps[i], factors); |  |  | TRANSFORM_COEFF(coeffs[i], get_bits(gb, qntztab[tbap]) << (16 - qntztab[tbap]), exps[i], factors); | 
														
													
														
															
																|  |  | continue; |  |  | continue; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | bits_consumed = m->bits - bits_consumed; |  |  |  | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "\tbits consumed by channel = %d\n", bits_consumed); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1003,17 +995,13 @@ static int get_transform_coeffs(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int i, end; |  |  | int i, end; | 
														
													
														
															
																|  |  | int got_cplchan = 0; |  |  | int got_cplchan = 0; | 
														
													
														
															
																|  |  | int dithflag = 0; |  |  |  | 
														
													
														
															
																|  |  | mant_groups m; |  |  | mant_groups m; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | m.l3ptr = m.l5ptr = m.l11ptr = 3; |  |  | m.l3ptr = m.l5ptr = m.l11ptr = 3; | 
														
													
														
															
																|  |  | m.bits = 0; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->nfchans; i++) { |  |  | for (i = 0; i < ctx->nfchans; i++) { | 
														
													
														
															
																|  |  | dithflag = (ctx->dithflag >> i) & 1; |  |  |  | 
														
													
														
															
																|  |  | /* transform coefficients for individual channel */ |  |  | /* transform coefficients for individual channel */ | 
														
													
														
															
																|  |  | if (get_transform_coeffs_ch(ctx->dexps[i], ctx->bap[i], ctx->chcoeffs[i], ctx->transform_coeffs[i + 1], |  |  |  | 
														
													
														
															
																|  |  | 0, ctx->endmant[i], dithflag, &ctx->gb, &ctx->dith_state, &m)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (get_transform_coeffs_ch(ctx, i, &m)) | 
														
													
														
															
																|  |  | return -1; |  |  | return -1; | 
														
													
														
															
																|  |  | /* tranform coefficients for coupling channels */ |  |  | /* tranform coefficients for coupling channels */ | 
														
													
														
															
																|  |  | if ((ctx->chincpl >> i) & 1)  { |  |  | if ((ctx->chincpl >> i) & 1)  { | 
														
													
												
													
														
															
																|  | @@ -1032,15 +1020,13 @@ static int get_transform_coeffs(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | while(++end < 256); |  |  | while(++end < 256); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | if (ctx->lfeon) { |  |  | if (ctx->lfeon) { | 
														
													
														
															
																|  |  | if (get_transform_coeffs_ch(ctx->dlfeexps, ctx->lfebap, 1.0f, ctx->transform_coeffs[0], 0, 7, 0, &ctx->gb, &ctx->dith_state, &m)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (get_transform_coeffs_ch(ctx, -1, &m)) | 
														
													
														
															
																|  |  | return -1; |  |  | return -1; | 
														
													
														
															
																|  |  | for (i = 7; i < 256; i++) { |  |  | for (i = 7; i < 256; i++) { | 
														
													
														
															
																|  |  | ctx->transform_coeffs[0][i] = 0; |  |  | ctx->transform_coeffs[0][i] = 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "bits consumed by get_transform_coeffs = %d\n", m.bits); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1059,22 +1045,27 @@ static void do_rematrixing1(AC3DecodeContext *ctx, int start, int end) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | static void do_rematrixing(AC3DecodeContext *ctx) |  |  | static void do_rematrixing(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | uint8_t bnd1 = 13, bnd2 = 25, bnd3 = 37, bnd4 = 61; |  |  |  | 
														
													
														
															
																|  |  | uint8_t bndend; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int bnd1 = 13, bnd2 = 25, bnd3 = 37, bnd4 = 61; | 
														
													
														
															
																|  |  |  |  |  | int end, bndend; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | end = FFMIN(ctx->endmant[0], ctx->endmant[1]); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | bndend = FFMIN(ctx->endmant[0], ctx->endmant[1]); |  |  |  | 
														
													
														
															
																|  |  | if (ctx->rematflg & 1) |  |  | if (ctx->rematflg & 1) | 
														
													
														
															
																|  |  | do_rematrixing1(ctx, bnd1, bnd2); |  |  | do_rematrixing1(ctx, bnd1, bnd2); | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | if (ctx->rematflg & 2) |  |  | if (ctx->rematflg & 2) | 
														
													
														
															
																|  |  | do_rematrixing1(ctx, bnd2, bnd3); |  |  | do_rematrixing1(ctx, bnd2, bnd3); | 
														
													
														
															
																|  |  | if (ctx->rematflg & 4) { |  |  |  | 
														
													
														
															
																|  |  | if (ctx->cplbegf > 0 && ctx->cplbegf <= 2 && (ctx->chincpl)) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | bndend = bnd4; | 
														
													
														
															
																|  |  |  |  |  | if (bndend > end) { | 
														
													
														
															
																|  |  |  |  |  | bndend = end; | 
														
													
														
															
																|  |  |  |  |  | if (ctx->rematflg & 4) | 
														
													
														
															
																|  |  | do_rematrixing1(ctx, bnd3, bndend); |  |  | do_rematrixing1(ctx, bnd3, bndend); | 
														
													
														
															
																|  |  | else { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | if (ctx->rematflg & 4) | 
														
													
														
															
																|  |  | do_rematrixing1(ctx, bnd3, bnd4); |  |  | do_rematrixing1(ctx, bnd3, bnd4); | 
														
													
														
															
																|  |  | if (ctx->rematflg & 8) |  |  |  | 
														
													
														
															
																|  |  | do_rematrixing1(ctx, bnd4, bndend); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (ctx->rematflg & 8) | 
														
													
														
															
																|  |  |  |  |  | do_rematrixing1(ctx, bnd4, end); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1118,7 +1109,7 @@ static void get_downmix_coeffs(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | case AC3_OUTPUT_MONO: |  |  | case AC3_OUTPUT_MONO: | 
														
													
														
															
																|  |  | ctx->chcoeffs[0] *= LEVEL_MINUS_3DB; |  |  | ctx->chcoeffs[0] *= LEVEL_MINUS_3DB; | 
														
													
														
															
																|  |  | ctx->chcoeffs[2] *= LEVEL_MINUS_3DB; |  |  | ctx->chcoeffs[2] *= LEVEL_MINUS_3DB; | 
														
													
														
															
																|  |  | ctx->chcoeffs[1] *= clev * LEVEL_PLUS_3DB; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ctx->chcoeffs[1] *= (clev * LEVEL_PLUS_3DB); | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | case AC3_OUTPUT_STEREO: |  |  | case AC3_OUTPUT_STEREO: | 
														
													
														
															
																|  |  | ctx->chcoeffs[1] *= clev; |  |  | ctx->chcoeffs[1] *= clev; | 
														
													
												
													
														
															
																|  | @@ -1561,14 +1552,13 @@ static void do_imdct_256(FFTContext *fft_ctx, float *coeffs, float *output, | 
														
													
														
															
																|  |  | CMUL(z2[k].re, z2[k].im, x2[n4 - 2 * k - 1], x2[2 * k], x_cos2[k], x_sin2[k]); |  |  | CMUL(z2[k].re, z2[k].im, x2[n4 - 2 * k - 1], x2[2 * k], x_cos2[k], x_sin2[k]); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* Permutation needed before calling ff_fft_calc. */ |  |  |  | 
														
													
														
															
																|  |  | ff_fft_permute(fft_ctx, z1); |  |  |  | 
														
													
														
															
																|  |  | ff_fft_permute(fft_ctx, z2); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | /* N/8 pointe complex IFFT. */ |  |  | /* N/8 pointe complex IFFT. */ | 
														
													
														
															
																|  |  |  |  |  | ff_fft_permute(fft_ctx, z1); | 
														
													
														
															
																|  |  | ff_fft_calc(fft_ctx, z1); |  |  | ff_fft_calc(fft_ctx, z1); | 
														
													
														
															
																|  |  |  |  |  | ff_fft_permute(fft_ctx, z2); | 
														
													
														
															
																|  |  | ff_fft_calc(fft_ctx, z2); |  |  | ff_fft_calc(fft_ctx, z2); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | /* Post IFFT Complex Multiply Step. */ |  |  | /* Post IFFT Complex Multiply Step. */ | 
														
													
														
															
																|  |  | for (k = 0; k < n8; k++) { |  |  | for (k = 0; k < n8; k++) { | 
														
													
														
															
																|  |  | CMUL(z1[k].re, z1[k].im, z1[k].re, z1[k].im, x_cos2[k], x_sin2[k]); |  |  | CMUL(z1[k].re, z1[k].im, z1[k].re, z1[k].im, x_cos2[k], x_sin2[k]); | 
														
													
												
													
														
															
																|  | @@ -1646,11 +1636,12 @@ static inline void do_imdct(AC3DecodeContext *ctx) | 
														
													
														
															
																|  |  | do_imdct_512(&ctx->fft_128, ctx->transform_coeffs[0], ctx->output[0], |  |  | do_imdct_512(&ctx->fft_128, ctx->transform_coeffs[0], ctx->output[0], | 
														
													
														
															
																|  |  | ctx->delay[0], ctx->tmp_imdct, ctx->tmp_output); |  |  | ctx->delay[0], ctx->tmp_imdct, ctx->tmp_output); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->nfchans + 1; i++) { |  |  |  | 
														
													
														
															
																|  |  | if (!(((ctx->blksw) >> i) & 1)) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < ctx->nfchans; i++) { | 
														
													
														
															
																|  |  |  |  |  | if (!((ctx->blksw >> i) & 1)) { | 
														
													
														
															
																|  |  | do_imdct_512(&ctx->fft_128, ctx->transform_coeffs[i + 1], ctx->output[i + 1], |  |  | do_imdct_512(&ctx->fft_128, ctx->transform_coeffs[i + 1], ctx->output[i + 1], | 
														
													
														
															
																|  |  | ctx->delay[i + 1], ctx->tmp_imdct, ctx->tmp_output); |  |  | ctx->delay[i + 1], ctx->tmp_imdct, ctx->tmp_output); | 
														
													
														
															
																|  |  | } else { |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | av_log(NULL, AV_LOG_INFO, "block switching enabled.\n"); | 
														
													
														
															
																|  |  | do_imdct_256(&ctx->fft_64, ctx->transform_coeffs[i + 1], ctx->output[i + 1], |  |  | do_imdct_256(&ctx->fft_64, ctx->transform_coeffs[i + 1], ctx->output[i + 1], | 
														
													
														
															
																|  |  | ctx->delay[i + 1], ctx->tmp_imdct, ctx->tmp_output); |  |  | ctx->delay[i + 1], ctx->tmp_imdct, ctx->tmp_output); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -1664,9 +1655,9 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | int i, bnd, rbnd, seg, grpsize; |  |  | int i, bnd, rbnd, seg, grpsize; | 
														
													
														
															
																|  |  | GetBitContext *gb = &ctx->gb; |  |  | GetBitContext *gb = &ctx->gb; | 
														
													
														
															
																|  |  | int bit_alloc_flags = 0; |  |  | int bit_alloc_flags = 0; | 
														
													
														
															
																|  |  | float drange, tmpco; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | float drange; | 
														
													
														
															
																|  |  | uint8_t *dexps; |  |  | uint8_t *dexps; | 
														
													
														
															
																|  |  | int mstrcplco, cplcoexp, cplcomant, sbnd, cplbndstrc; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | int mstrcplco, cplcoexp, cplcomant; | 
														
													
														
															
																|  |  | int dynrng, chbwcod, ngrps, cplabsexp, skipl; |  |  | int dynrng, chbwcod, ngrps, cplabsexp, skipl; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (i = 0; i < 5; i++) |  |  | for (i = 0; i < 5; i++) | 
														
													
												
													
														
															
																|  | @@ -1695,14 +1686,12 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* coupling strategy */ |  |  | if (get_bits1(gb)) { /* coupling strategy */ | 
														
													
														
															
																|  |  | ctx->cplinu = get_bits1(gb); |  |  | ctx->cplinu = get_bits1(gb); | 
														
													
														
															
																|  |  |  |  |  | ctx->cplbndstrc = 0; | 
														
													
														
															
																|  |  |  |  |  | ctx->chincpl = 0; | 
														
													
														
															
																|  |  | if (ctx->cplinu) { /* coupling in use */ |  |  | if (ctx->cplinu) { /* coupling in use */ | 
														
													
														
															
																|  |  | ctx->chincpl = 0; |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < nfchans; i++) |  |  | for (i = 0; i < nfchans; i++) | 
														
													
														
															
																|  |  | ctx->chincpl |= get_bits1(gb) << i; |  |  | ctx->chincpl |= get_bits1(gb) << i; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (acmod == 0x00 || acmod == 0x01) //atleast two shared channels required |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | if (acmod == 0x02) |  |  | if (acmod == 0x02) | 
														
													
														
															
																|  |  | ctx->phsflginu = get_bits1(gb); //phase flag in use |  |  | ctx->phsflginu = get_bits1(gb); //phase flag in use | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1717,7 +1706,6 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | ctx->ncplbnd = ctx->ncplsubnd = 3 + ctx->cplendf - ctx->cplbegf; |  |  | ctx->ncplbnd = ctx->ncplsubnd = 3 + ctx->cplendf - ctx->cplbegf; | 
														
													
														
															
																|  |  | ctx->cplstrtmant = ctx->cplbegf * 12 + 37; |  |  | ctx->cplstrtmant = ctx->cplbegf * 12 + 37; | 
														
													
														
															
																|  |  | ctx->cplendmant = ctx->cplendf * 12 + 73; |  |  | ctx->cplendmant = ctx->cplendf * 12 + 73; | 
														
													
														
															
																|  |  | ctx->cplbndstrc = 0; |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < ctx->ncplsubnd - 1; i++) /* coupling band structure */ |  |  | for (i = 0; i < ctx->ncplsubnd - 1; i++) /* coupling band structure */ | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { |  |  | if (get_bits1(gb)) { | 
														
													
														
															
																|  |  | ctx->cplbndstrc |= 1 << i; |  |  | ctx->cplbndstrc |= 1 << i; | 
														
													
												
													
														
															
																|  | @@ -1732,9 +1720,8 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | for (i = 0; i < nfchans; i++) |  |  | for (i = 0; i < nfchans; i++) | 
														
													
														
															
																|  |  | if ((ctx->chincpl) >> i & 1) |  |  | if ((ctx->chincpl) >> i & 1) | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* coupling co-ordinates */ |  |  | if (get_bits1(gb)) { /* coupling co-ordinates */ | 
														
													
														
															
																|  |  | ctx->cplcoe = 1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ctx->cplcoe |= 1 << i; | 
														
													
														
															
																|  |  | mstrcplco = 3 * get_bits(gb, 2); |  |  | mstrcplco = 3 * get_bits(gb, 2); | 
														
													
														
															
																|  |  | cplbndstrc = ctx->cplbndstrc; |  |  |  | 
														
													
														
															
																|  |  | for (bnd = 0; bnd < ctx->ncplbnd; bnd++) { |  |  | for (bnd = 0; bnd < ctx->ncplbnd; bnd++) { | 
														
													
														
															
																|  |  | cplcoexp = get_bits(gb, 4); |  |  | cplcoexp = get_bits(gb, 4); | 
														
													
														
															
																|  |  | cplcomant = get_bits(gb, 4); |  |  | cplcomant = get_bits(gb, 4); | 
														
													
												
													
														
															
																|  | @@ -1746,7 +1733,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (acmod == 0x02 && ctx->phsflginu && ctx->cplcoe) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (acmod == 0x02 && ctx->phsflginu && (ctx->cplcoe & 1 || ctx->cplcoe & 2)) | 
														
													
														
															
																|  |  | for (bnd = 0; bnd < ctx->ncplbnd; bnd++) |  |  | for (bnd = 0; bnd < ctx->ncplbnd; bnd++) | 
														
													
														
															
																|  |  | if (get_bits1(gb)) |  |  | if (get_bits1(gb)) | 
														
													
														
															
																|  |  | ctx->cplco[1][bnd] = -ctx->cplco[1][bnd]; |  |  | ctx->cplco[1][bnd] = -ctx->cplco[1][bnd]; | 
														
													
												
													
														
															
																|  | @@ -1789,12 +1776,11 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | return -1; |  |  | return -1; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | ctx->endmant[i] = chbwcod * 3 + 73; |  |  | ctx->endmant[i] = chbwcod * 3 + 73; | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "i = %d \t chbwcod = %d \t endmant = %d\n", i, chbwcod, ctx->endmant[i]); |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (ctx->cplexpstr != AC3_EXPSTR_REUSE) {/* coupling exponents */ |  |  | if (ctx->cplexpstr != AC3_EXPSTR_REUSE) {/* coupling exponents */ | 
														
													
														
															
																|  |  | bit_alloc_flags |= 64; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bit_alloc_flags = 64; | 
														
													
														
															
																|  |  | cplabsexp = get_bits(gb, 4) << 1; |  |  | cplabsexp = get_bits(gb, 4) << 1; | 
														
													
														
															
																|  |  | ngrps = (ctx->cplendmant - ctx->cplstrtmant) / (3 << (ctx->cplexpstr - 1)); |  |  | ngrps = (ctx->cplendmant - ctx->cplstrtmant) / (3 << (ctx->cplexpstr - 1)); | 
														
													
														
															
																|  |  | if (decode_exponents(gb, ctx->cplexpstr, ngrps, cplabsexp, ctx->dcplexps + ctx->cplstrtmant)) { |  |  | if (decode_exponents(gb, ctx->cplexpstr, ngrps, cplabsexp, ctx->dcplexps + ctx->cplstrtmant)) { | 
														
													
												
													
														
															
																|  | @@ -1827,7 +1813,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* bit allocation information */ |  |  | if (get_bits1(gb)) { /* bit allocation information */ | 
														
													
														
															
																|  |  | bit_alloc_flags |= 127; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bit_alloc_flags = 127; | 
														
													
														
															
																|  |  | ctx->sdcycod = get_bits(gb, 2); |  |  | ctx->sdcycod = get_bits(gb, 2); | 
														
													
														
															
																|  |  | ctx->fdcycod = get_bits(gb, 2); |  |  | ctx->fdcycod = get_bits(gb, 2); | 
														
													
														
															
																|  |  | ctx->sgaincod = get_bits(gb, 2); |  |  | ctx->sgaincod = get_bits(gb, 2); | 
														
													
												
													
														
															
																|  | @@ -1836,7 +1822,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* snroffset */ |  |  | if (get_bits1(gb)) { /* snroffset */ | 
														
													
														
															
																|  |  | bit_alloc_flags |= 127; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bit_alloc_flags = 127; | 
														
													
														
															
																|  |  | ctx->csnroffst = get_bits(gb, 6); |  |  | ctx->csnroffst = get_bits(gb, 6); | 
														
													
														
															
																|  |  | if (ctx->cplinu) { /* couling fine snr offset and fast gain code */ |  |  | if (ctx->cplinu) { /* couling fine snr offset and fast gain code */ | 
														
													
														
															
																|  |  | ctx->cplfsnroffst = get_bits(gb, 4); |  |  | ctx->cplfsnroffst = get_bits(gb, 4); | 
														
													
												
													
														
															
																|  | @@ -1852,8 +1838,6 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ctx->cplfleak = 0; |  |  |  | 
														
													
														
															
																|  |  | ctx->cplsleak = 0; |  |  |  | 
														
													
														
															
																|  |  | if (ctx->cplinu && get_bits1(gb)) { /* coupling leak information */ |  |  | if (ctx->cplinu && get_bits1(gb)) { /* coupling leak information */ | 
														
													
														
															
																|  |  | bit_alloc_flags |= 64; |  |  | bit_alloc_flags |= 64; | 
														
													
														
															
																|  |  | ctx->cplfleak = get_bits(gb, 3); |  |  | ctx->cplfleak = get_bits(gb, 3); | 
														
													
												
													
														
															
																|  | @@ -1861,7 +1845,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* delta bit allocation information */ |  |  | if (get_bits1(gb)) { /* delta bit allocation information */ | 
														
													
														
															
																|  |  | bit_alloc_flags |= 127; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | bit_alloc_flags = 127; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (ctx->cplinu) { |  |  | if (ctx->cplinu) { | 
														
													
														
															
																|  |  | ctx->cpldeltbae = get_bits(gb, 2); |  |  | ctx->cpldeltbae = get_bits(gb, 2); | 
														
													
												
													
														
															
																|  | @@ -1900,7 +1884,22 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | do_bit_allocation (ctx, bit_alloc_flags); /* perform the bit allocation */ |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (bit_alloc_flags) { | 
														
													
														
															
																|  |  |  |  |  | if (is_snr_offsets_zero(ctx)) { | 
														
													
														
															
																|  |  |  |  |  | memset(ctx->cplbap, 0, sizeof (ctx->cplbap)); | 
														
													
														
															
																|  |  |  |  |  | memset(ctx->lfebap, 0, sizeof (ctx->lfebap)); | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < nfchans; i++) | 
														
													
														
															
																|  |  |  |  |  | memset(ctx->bap[i], 0, sizeof(ctx->bap[i])); | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | if (ctx->chincpl && (bit_alloc_flags & 64)) | 
														
													
														
															
																|  |  |  |  |  | do_bit_allocation(ctx, 5); | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < nfchans; i++) | 
														
													
														
															
																|  |  |  |  |  | if ((bit_alloc_flags >> i) & 1) | 
														
													
														
															
																|  |  |  |  |  | do_bit_allocation(ctx, i); | 
														
													
														
															
																|  |  |  |  |  | if (ctx->lfeon && (bit_alloc_flags & 32)) | 
														
													
														
															
																|  |  |  |  |  | do_bit_allocation(ctx, 6); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (get_bits1(gb)) { /* unused dummy data */ |  |  | if (get_bits1(gb)) { /* unused dummy data */ | 
														
													
														
															
																|  |  | skipl = get_bits(gb, 9); |  |  | skipl = get_bits(gb, 9); | 
														
													
												
													
														
															
																|  | @@ -1918,7 +1917,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx) | 
														
													
														
															
																|  |  | dump_floats("channel transform coefficients", 10, ctx->transform_coeffs[i + 1], BLOCK_SIZE);*/ |  |  | dump_floats("channel transform coefficients", 10, ctx->transform_coeffs[i + 1], BLOCK_SIZE);*/ | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* recover coefficients if rematrixing is in use */ |  |  | /* recover coefficients if rematrixing is in use */ | 
														
													
														
															
																|  |  | if (ctx->rematflg) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (ctx->rematstr) | 
														
													
														
															
																|  |  | do_rematrixing(ctx); |  |  | do_rematrixing(ctx); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | do_imdct(ctx); |  |  | do_imdct(ctx); | 
														
													
												
													
														
															
																|  | 
 |