* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "libavutil/channel_layout.h"
#include "parser.h"
#include "ac3_parser.h"
#include "aac_ac3_parser.h"
#include "get_bits.h"
-#include "libavutil/audioconvert.h"
#define AC3_HEADER_SIZE 7
1, 2, 3, 6
};
+/**
+ * Table for center mix levels
+ * reference: Section 5.4.2.4 cmixlev
+ */
+static const uint8_t center_levels[4] = { 4, 5, 6, 5 };
+
+/**
+ * Table for surround mix levels
+ * reference: Section 5.4.2.5 surmixlev
+ */
+static const uint8_t surround_levels[4] = { 4, 6, 7, 6 };
+
int avpriv_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
{
hdr->num_blocks = 6;
/* set default mix levels */
- hdr->center_mix_level = 1; // -4.5dB
- hdr->surround_mix_level = 1; // -6.0dB
+ hdr->center_mix_level = 5; // -4.5dB
+ hdr->surround_mix_level = 6; // -6.0dB
+
+ /* set default dolby surround mode */
+ hdr->dolby_surround_mode = AC3_DSURMOD_NOTINDICATED;
if(hdr->bitstream_id <= 10) {
/* Normal AC-3 */
hdr->channel_mode = get_bits(gbc, 3);
if(hdr->channel_mode == AC3_CHMODE_STEREO) {
- skip_bits(gbc, 2); // skip dsurmod
+ hdr->dolby_surround_mode = get_bits(gbc, 2);
} else {
if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO)
- hdr->center_mix_level = get_bits(gbc, 2);
+ hdr-> center_mix_level = center_levels[get_bits(gbc, 2)];
if(hdr->channel_mode & 4)
- hdr->surround_mix_level = get_bits(gbc, 2);
+ hdr->surround_mix_level = surround_levels[get_bits(gbc, 2)];
}
hdr->lfe_on = get_bits1(gbc);
(hdr->num_blocks * 256.0));
hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
}
- hdr->channel_layout = ff_ac3_channel_layout_tab[hdr->channel_mode];
+ hdr->channel_layout = avpriv_ac3_channel_layout_tab[hdr->channel_mode];
if (hdr->lfe_on)
hdr->channel_layout |= AV_CH_LOW_FREQUENCY;
int err;
union {
uint64_t u64;
- uint8_t u8[8];
+ uint8_t u8[8 + AV_INPUT_BUFFER_PADDING_SIZE];
} tmp = { av_be2ne64(state) };
AC3HeaderInfo hdr;
GetBitContext gbc;
if (hdr.bitstream_mode == 0x7 && hdr.channels > 1)
hdr_info->service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
if(hdr.bitstream_id>10)
- hdr_info->codec_id = CODEC_ID_EAC3;
- else if (hdr_info->codec_id == CODEC_ID_NONE)
- hdr_info->codec_id = CODEC_ID_AC3;
+ hdr_info->codec_id = AV_CODEC_ID_EAC3;
+ else if (hdr_info->codec_id == AV_CODEC_ID_NONE)
+ hdr_info->codec_id = AV_CODEC_ID_AC3;
*need_next_header = (hdr.frame_type != EAC3_FRAME_TYPE_AC3_CONVERT);
*new_frame_start = (hdr.frame_type != EAC3_FRAME_TYPE_DEPENDENT);
AVCodecParser ff_ac3_parser = {
- .codec_ids = { CODEC_ID_AC3, CODEC_ID_EAC3 },
+ .codec_ids = { AV_CODEC_ID_AC3, AV_CODEC_ID_EAC3 },
.priv_data_size = sizeof(AACAC3ParseContext),
.parser_init = ac3_parse_init,
.parser_parse = ff_aac_ac3_parse,