add some approved parts of the E-AC-3 decoder
Originally committed as revision 14910 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									26efefc52c
								
							
						
					
					
						commit
						6fafb0202a
					
				| @ -761,9 +761,21 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) | ||||
|         } | ||||
|     } while(i--); | ||||
| 
 | ||||
|     /* spectral extension strategy */ | ||||
|     if (s->eac3 && (!blk || get_bits1(gbc))) { | ||||
|         if (get_bits1(gbc)) { | ||||
|             av_log_missing_feature(s->avctx, "Spectral extension", 1); | ||||
|             return -1; | ||||
|         } | ||||
|         /* TODO: parse spectral extension strategy info */ | ||||
|     } | ||||
| 
 | ||||
|     /* TODO: spectral extension coordinates */ | ||||
| 
 | ||||
|     /* coupling strategy */ | ||||
|     if (get_bits1(gbc)) { | ||||
|         memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); | ||||
|         if (!s->eac3) | ||||
|         s->cpl_in_use[blk] = get_bits1(gbc); | ||||
|         if (s->cpl_in_use[blk]) { | ||||
|             /* coupling in use */ | ||||
| @ -774,15 +786,28 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             /* check for enhanced coupling */ | ||||
|             if (s->eac3 && get_bits1(gbc)) { | ||||
|                 /* TODO: parse enhanced coupling strategy info */ | ||||
|                 av_log_missing_feature(s->avctx, "Enhanced coupling", 1); | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             /* determine which channels are coupled */ | ||||
|             if (s->eac3 && s->channel_mode == AC3_CHMODE_STEREO) { | ||||
|                 s->channel_in_cpl[1] = 1; | ||||
|                 s->channel_in_cpl[2] = 1; | ||||
|             } else { | ||||
|             for (ch = 1; ch <= fbw_channels; ch++) | ||||
|                 s->channel_in_cpl[ch] = get_bits1(gbc); | ||||
|             } | ||||
| 
 | ||||
|             /* phase flags in use */ | ||||
|             if (channel_mode == AC3_CHMODE_STEREO) | ||||
|                 s->phase_flags_in_use = get_bits1(gbc); | ||||
| 
 | ||||
|             /* coupling frequency range and band structure */ | ||||
|             /* coupling frequency range */ | ||||
|             /* TODO: modify coupling end freq if spectral extension is used */ | ||||
|             cpl_begin_freq = get_bits(gbc, 4); | ||||
|             cpl_end_freq = get_bits(gbc, 4); | ||||
|             if (3 + cpl_end_freq - cpl_begin_freq < 0) { | ||||
| @ -792,24 +817,37 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) | ||||
|             s->num_cpl_bands = s->num_cpl_subbands = 3 + cpl_end_freq - cpl_begin_freq; | ||||
|             s->start_freq[CPL_CH] = cpl_begin_freq * 12 + 37; | ||||
|             s->end_freq[CPL_CH] = cpl_end_freq * 12 + 73; | ||||
| 
 | ||||
|             /* coupling band structure */ | ||||
|             if (!s->eac3 || get_bits1(gbc)) { | ||||
|             for (bnd = 0; bnd < s->num_cpl_subbands - 1; bnd++) { | ||||
|                 if (get_bits1(gbc)) { | ||||
|                     s->cpl_band_struct[bnd] = 1; | ||||
|                     s->num_cpl_bands--; | ||||
|                     s->cpl_band_struct[bnd] = get_bits1(gbc); | ||||
|                 } | ||||
|             } else if (!blk) { | ||||
|             } | ||||
|             s->cpl_band_struct[s->num_cpl_subbands-1] = 0; | ||||
| 
 | ||||
|             /* calculate number of coupling bands based on band structure */ | ||||
|             for (bnd = 0; bnd < s->num_cpl_subbands-1; bnd++) { | ||||
|                 s->num_cpl_bands -= s->cpl_band_struct[bnd]; | ||||
|             } | ||||
|         } else { | ||||
|             /* coupling not in use */ | ||||
|             for (ch = 1; ch <= fbw_channels; ch++) | ||||
|             for (ch = 1; ch <= fbw_channels; ch++) { | ||||
|                 s->channel_in_cpl[ch] = 0; | ||||
|                 s->first_cpl_coords[ch] = 1; | ||||
|             } | ||||
|             s->first_cpl_leak = 1; | ||||
|             s->phase_flags_in_use = 0; | ||||
|         } | ||||
|     } else if (!blk) { | ||||
|     } else if (!s->eac3) { | ||||
|         if(!blk) { | ||||
|         av_log(s->avctx, AV_LOG_ERROR, "new coupling strategy must be present in block 0\n"); | ||||
|         return -1; | ||||
|     } else { | ||||
|         s->cpl_in_use[blk] = s->cpl_in_use[blk-1]; | ||||
|     } | ||||
|     } | ||||
|     cpl_in_use = s->cpl_in_use[blk]; | ||||
| 
 | ||||
|     /* coupling coordinates */ | ||||
| @ -847,7 +885,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) | ||||
| 
 | ||||
|     /* stereo rematrixing strategy and band structure */ | ||||
|     if (channel_mode == AC3_CHMODE_STEREO) { | ||||
|         if (get_bits1(gbc)) { | ||||
|         if ((s->eac3 && !blk) || get_bits1(gbc)) { | ||||
|             s->num_rematrixing_bands = 4; | ||||
|             if(cpl_in_use && s->start_freq[CPL_CH] <= 61) | ||||
|                 s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37); | ||||
| @ -937,6 +975,25 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     /* fast gain (E-AC-3 only) */ | ||||
|     if (s->fast_gain_syntax && get_bits1(gbc)) { | ||||
|         for (ch = !cpl_in_use; ch <= s->channels; ch++) { | ||||
|             int prev = s->fast_gain[ch]; | ||||
|             s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; | ||||
|             /* run last 2 bit allocation stages if fast gain changes */ | ||||
|             if(blk && prev != s->fast_gain[ch]) | ||||
|                 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); | ||||
|         } | ||||
|     } else if (s->eac3 && !blk) { | ||||
|         for (ch = !cpl_in_use; ch <= s->channels; ch++) | ||||
|             s->fast_gain[ch] = ff_ac3_fast_gain_tab[4]; | ||||
|     } | ||||
| 
 | ||||
|     /* E-AC-3 to AC-3 converter SNR offset */ | ||||
|     if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT && get_bits1(gbc)) { | ||||
|         skip_bits(gbc, 10); // skip converter snr offset
 | ||||
|     } | ||||
| 
 | ||||
|     /* coupling leak information */ | ||||
|     if (cpl_in_use) { | ||||
|         if (get_bits1(gbc)) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user