add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
and then reads the channel_map stuff Originally committed as revision 12944 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
81d5ae6dec
commit
0c79b1402a
@ -97,6 +97,7 @@ typedef struct {
|
|||||||
uint16_t frame_size;
|
uint16_t frame_size;
|
||||||
int center_mix_level; ///< Center mix level index
|
int center_mix_level; ///< Center mix level index
|
||||||
int surround_mix_level; ///< Surround mix level index
|
int surround_mix_level; ///< Surround mix level index
|
||||||
|
uint16_t channel_map;
|
||||||
/** @} */
|
/** @} */
|
||||||
} AC3HeaderInfo;
|
} AC3HeaderInfo;
|
||||||
|
|
||||||
|
@ -136,6 +136,35 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ff_ac3_parse_header_full(GetBitContext *gbc, AC3HeaderInfo *hdr){
|
||||||
|
int ret, i;
|
||||||
|
ret = ff_ac3_parse_header(gbc, hdr);
|
||||||
|
if(!ret){
|
||||||
|
if(hdr->bitstream_id>10){
|
||||||
|
/* Enhanced AC-3 */
|
||||||
|
skip_bits(gbc, 5); // skip bitstream id
|
||||||
|
|
||||||
|
/* skip dialog normalization and compression gain */
|
||||||
|
for (i = 0; i < (hdr->channel_mode ? 1 : 2); i++) {
|
||||||
|
skip_bits(gbc, 5); // skip dialog normalization
|
||||||
|
if (get_bits1(gbc)) {
|
||||||
|
skip_bits(gbc, 8); //skip Compression gain word
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* dependent stream channel map */
|
||||||
|
if (hdr->frame_type == EAC3_FRAME_TYPE_DEPENDENT && get_bits1(gbc)) {
|
||||||
|
hdr->channel_map = get_bits(gbc, 16); //custom channel map
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//default channel map based on acmod and lfeon
|
||||||
|
hdr->channel_map = ff_eac3_default_chmap[hdr->channel_mode];
|
||||||
|
if(hdr->lfe_on)
|
||||||
|
hdr->channel_map |= AC3_CHMAP_LFE;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
|
static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
|
||||||
int *need_next_header, int *new_frame_start)
|
int *need_next_header, int *new_frame_start)
|
||||||
{
|
{
|
||||||
|
@ -46,4 +46,15 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr);
|
int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses AC-3 frame header and sets channel_map
|
||||||
|
* Parses the header up to the lfeon (channel_map in E-AC-3)
|
||||||
|
* element, which is the first 52, 54 or 104 bits depending
|
||||||
|
* on the audio coding mode.
|
||||||
|
* @param gbc[in] BitContext containing the first 54 bits of the frame.
|
||||||
|
* @param hdr[out] Pointer to struct where header info is written.
|
||||||
|
* @return value returned by ff_ac3_parse_header
|
||||||
|
*/
|
||||||
|
int ff_ac3_parse_header_full(GetBitContext *gbc, AC3HeaderInfo *hdr);
|
||||||
|
|
||||||
#endif /* FFMPEG_AC3_PARSER_H */
|
#endif /* FFMPEG_AC3_PARSER_H */
|
||||||
|
@ -247,3 +247,16 @@ const uint8_t ff_ac3_critical_band_size_tab[50]={
|
|||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
|
||||||
3, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 24, 24, 24, 24, 24
|
3, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 24, 24, 24, 24, 24
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* Default channel map for a dependent substream defined by acmod
|
||||||
|
*/
|
||||||
|
const uint16_t ff_eac3_default_chmap[8] = {
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_R, // FIXME Ch1+Ch2
|
||||||
|
AC3_CHMAP_C,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_R,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_R | AC3_CHMAP_C_SUR,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R | AC3_CHMAP_C_SUR,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_R | AC3_CHMAP_L_SUR | AC3_CHMAP_R_SUR,
|
||||||
|
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R | AC3_CHMAP_L_SUR | AC3_CHMAP_R_SUR
|
||||||
|
};
|
||||||
|
@ -39,5 +39,21 @@ extern const uint16_t ff_ac3_db_per_bit_tab[4];
|
|||||||
extern const int16_t ff_ac3_floor_tab[8];
|
extern const int16_t ff_ac3_floor_tab[8];
|
||||||
extern const uint16_t ff_ac3_fast_gain_tab[8];
|
extern const uint16_t ff_ac3_fast_gain_tab[8];
|
||||||
extern const uint8_t ff_ac3_critical_band_size_tab[50];
|
extern const uint8_t ff_ac3_critical_band_size_tab[50];
|
||||||
|
extern const uint16_t ff_eac3_default_chmap[8];
|
||||||
|
|
||||||
|
/** Custom channel map locations bitmask
|
||||||
|
* Other channels described in documentation:
|
||||||
|
* Lc/Rc pair, Lrs/Rrs pair, Ts, Lsd/Rsd pair,
|
||||||
|
* Lw/Rw pair, Lvh/Rvh pair, Cvh, Reserved, LFE2
|
||||||
|
*/
|
||||||
|
enum CustomChannelMapLocation{
|
||||||
|
AC3_CHMAP_L= 1<<(15-0),
|
||||||
|
AC3_CHMAP_C= 1<<(15-1),
|
||||||
|
AC3_CHMAP_R= 1<<(15-2),
|
||||||
|
AC3_CHMAP_L_SUR= 1<<(15-3),
|
||||||
|
AC3_CHMAP_R_SUR = 1<<(15-4),
|
||||||
|
AC3_CHMAP_C_SUR= 1<<(15-7),
|
||||||
|
AC3_CHMAP_LFE = 1<<(15-15)
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* FFMPEG_AC3TAB_H */
|
#endif /* FFMPEG_AC3TAB_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user