simplify snr offset and bit allocation
Originally committed as revision 9784 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									e9a3824880
								
							
						
					
					
						commit
						4611b64ec1
					
				| @ -107,13 +107,12 @@ typedef struct { | |||||||
|     int cplexpstr; |     int cplexpstr; | ||||||
|     int lfeexpstr; |     int lfeexpstr; | ||||||
|     int chexpstr[5]; |     int chexpstr[5]; | ||||||
|     int csnroffst; |     int cplsnroffst; | ||||||
|     int cplfsnroffst; |     int cplfgain; | ||||||
|     int cplfgaincod; |     int snroffst[5]; | ||||||
|     int fsnroffst[5]; |     int fgain[5]; | ||||||
|     int fgaincod[5]; |     int lfesnroffst; | ||||||
|     int lfefsnroffst; |     int lfefgain; | ||||||
|     int lfefgaincod; |  | ||||||
|     int cpldeltbae; |     int cpldeltbae; | ||||||
|     int deltbae[5]; |     int deltbae[5]; | ||||||
|     int cpldeltnseg; |     int cpldeltnseg; | ||||||
| @ -424,41 +423,6 @@ static void decode_exponents(GetBitContext *gb, int expstr, int ngrps, | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Performs bit allocation.
 |  | ||||||
|  * This function performs bit allocation for the requested chanenl. |  | ||||||
|  */ |  | ||||||
| static void do_bit_allocation(AC3DecodeContext *ctx, int chnl) |  | ||||||
| { |  | ||||||
|     int fgain, snroffset; |  | ||||||
| 
 |  | ||||||
|     if (chnl == 5) { |  | ||||||
|         fgain = ff_fgaintab[ctx->cplfgaincod]; |  | ||||||
|         snroffset = (((ctx->csnroffst - 15) << 4) + ctx->cplfsnroffst) << 2; |  | ||||||
|         ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap, |  | ||||||
|                                       ctx->dcplexps, ctx->cplstrtmant, |  | ||||||
|                                       ctx->cplendmant, snroffset, fgain, 0, |  | ||||||
|                                       ctx->cpldeltbae, ctx->cpldeltnseg, |  | ||||||
|                                       ctx->cpldeltoffst, ctx->cpldeltlen, |  | ||||||
|                                       ctx->cpldeltba); |  | ||||||
|     } |  | ||||||
|     else if (chnl == 6) { |  | ||||||
|         fgain = ff_fgaintab[ctx->lfefgaincod]; |  | ||||||
|         snroffset = (((ctx->csnroffst - 15) << 4) + ctx->lfefsnroffst) << 2; |  | ||||||
|         ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap, |  | ||||||
|                                       ctx->dlfeexps, 0, 7, snroffset, fgain, 1, |  | ||||||
|                                       DBA_NONE, 0, NULL, NULL, NULL); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         fgain = ff_fgaintab[ctx->fgaincod[chnl]]; |  | ||||||
|         snroffset = (((ctx->csnroffst - 15) << 4) + ctx->fsnroffst[chnl]) << 2; |  | ||||||
|         ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->bap[chnl], |  | ||||||
|                                       ctx->dexps[chnl], 0, ctx->endmant[chnl], |  | ||||||
|                                       snroffset, fgain, 0, ctx->deltbae[chnl], |  | ||||||
|                                       ctx->deltnseg[chnl], ctx->deltoffst[chnl], |  | ||||||
|                                       ctx->deltlen[chnl], ctx->deltba[chnl]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 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 */ | ||||||
|     int16_t l3_quantizers[3]; |     int16_t l3_quantizers[3]; | ||||||
|     int16_t l5_quantizers[3]; |     int16_t l5_quantizers[3]; | ||||||
| @ -1463,19 +1427,20 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (get_bits1(gb)) { /* snroffset */ |     if (get_bits1(gb)) { /* snroffset */ | ||||||
|  |         int csnr; | ||||||
|         bit_alloc_flags = 127; |         bit_alloc_flags = 127; | ||||||
|         ctx->csnroffst = get_bits(gb, 6); |         csnr = (get_bits(gb, 6) - 15) << 4; | ||||||
|         if (ctx->cplinu) { /* coupling fine snr offset and fast gain code */ |         if (ctx->cplinu) { /* coupling fine snr offset and fast gain code */ | ||||||
|             ctx->cplfsnroffst = get_bits(gb, 4); |             ctx->cplsnroffst = (csnr + get_bits(gb, 4)) << 2; | ||||||
|             ctx->cplfgaincod = get_bits(gb, 3); |             ctx->cplfgain = ff_fgaintab[get_bits(gb, 3)]; | ||||||
|         } |         } | ||||||
|         for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */ |         for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */ | ||||||
|             ctx->fsnroffst[i] = get_bits(gb, 4); |             ctx->snroffst[i] = (csnr + get_bits(gb, 4)) << 2; | ||||||
|             ctx->fgaincod[i] = get_bits(gb, 3); |             ctx->fgain[i] = ff_fgaintab[get_bits(gb, 3)]; | ||||||
|         } |         } | ||||||
|         if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */ |         if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */ | ||||||
|             ctx->lfefsnroffst = get_bits(gb, 4); |             ctx->lfesnroffst = (csnr + get_bits(gb, 4)) << 2; | ||||||
|             ctx->lfefgaincod = get_bits(gb, 3); |             ctx->lfefgain = ff_fgaintab[get_bits(gb, 3)]; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1533,12 +1498,26 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk) | |||||||
| 
 | 
 | ||||||
|     if (bit_alloc_flags) { |     if (bit_alloc_flags) { | ||||||
|         if (ctx->cplinu && (bit_alloc_flags & 64)) |         if (ctx->cplinu && (bit_alloc_flags & 64)) | ||||||
|             do_bit_allocation(ctx, 5); |             ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap, | ||||||
|  |                                           ctx->dcplexps, ctx->cplstrtmant, | ||||||
|  |                                           ctx->cplendmant, ctx->cplsnroffst, | ||||||
|  |                                           ctx->cplfgain, 0, | ||||||
|  |                                           ctx->cpldeltbae, ctx->cpldeltnseg, | ||||||
|  |                                           ctx->cpldeltoffst, ctx->cpldeltlen, | ||||||
|  |                                           ctx->cpldeltba); | ||||||
|         for (i = 0; i < nfchans; i++) |         for (i = 0; i < nfchans; i++) | ||||||
|             if ((bit_alloc_flags >> i) & 1) |             if ((bit_alloc_flags >> i) & 1) | ||||||
|                 do_bit_allocation(ctx, i); |                 ac3_parametric_bit_allocation(&ctx->bit_alloc_params, | ||||||
|  |                                               ctx->bap[i], ctx->dexps[i], 0, | ||||||
|  |                                               ctx->endmant[i], ctx->snroffst[i], | ||||||
|  |                                               ctx->fgain[i], 0, ctx->deltbae[i], | ||||||
|  |                                               ctx->deltnseg[i], ctx->deltoffst[i], | ||||||
|  |                                               ctx->deltlen[i], ctx->deltba[i]); | ||||||
|         if (ctx->lfeon && (bit_alloc_flags & 32)) |         if (ctx->lfeon && (bit_alloc_flags & 32)) | ||||||
|             do_bit_allocation(ctx, 6); |             ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap, | ||||||
|  |                                           ctx->dlfeexps, 0, 7, ctx->lfesnroffst, | ||||||
|  |                                           ctx->lfefgain, 1, | ||||||
|  |                                           DBA_NONE, 0, NULL, NULL, NULL); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (get_bits1(gb)) { /* unused dummy data */ |     if (get_bits1(gb)) { /* unused dummy data */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user