diff --git a/libavcodec/aac_ac3_parser.c b/libavcodec/aac_ac3_parser.c index cfb1a222be..d0c912a606 100644 --- a/libavcodec/aac_ac3_parser.c +++ b/libavcodec/aac_ac3_parser.c @@ -76,7 +76,8 @@ get_next: avctx->request_channels < s->channels && (avctx->request_channels <= 2 || (avctx->request_channels == 1 && - avctx->codec_id == CODEC_ID_AC3))) { + (avctx->codec_id == CODEC_ID_AC3 || + avctx->codec_id == CODEC_ID_EAC3)))) { avctx->channels = avctx->request_channels; } else { avctx->channels = s->channels; diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c index b9a25abc42..aedcbcd472 100644 --- a/libavcodec/ac3_parser.c +++ b/libavcodec/ac3_parser.c @@ -188,7 +188,7 @@ static av_cold int ac3_parse_init(AVCodecParserContext *s1) AVCodecParser ac3_parser = { - { CODEC_ID_AC3 }, + { CODEC_ID_AC3, CODEC_ID_EAC3 }, sizeof(AACAC3ParseContext), ac3_parse_init, ff_aac_ac3_parse, diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 1432ff05a0..1a22126d8c 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -1288,5 +1288,16 @@ AVCodec ac3_decoder = { .init = ac3_decode_init, .close = ac3_decode_end, .decode = ac3_decode_frame, - .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 (AC-3, E-AC-3)"), + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), +}; + +AVCodec eac3_decoder = { + .name = "eac3", + .type = CODEC_TYPE_AUDIO, + .id = CODEC_ID_EAC3, + .priv_data_size = sizeof (AC3DecodeContext), + .init = ac3_decode_init, + .close = ac3_decode_end, + .decode = ac3_decode_frame, + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"), }; diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index e0f17c2415..434869cee9 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -1365,5 +1365,5 @@ AVCodec ac3_encoder = { AC3_encode_close, NULL, .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 (AC-3, E-AC-3)"), + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), }; diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 8be683a027..5694282270 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -189,6 +189,7 @@ void avcodec_register_all(void) REGISTER_DECODER (COOK, cook); REGISTER_DECODER (DCA, dca); REGISTER_DECODER (DSICINAUDIO, dsicinaudio); + REGISTER_DECODER (EAC3, eac3); REGISTER_ENCDEC (FLAC, flac); REGISTER_DECODER (IMC, imc); REGISTER_DECODER (MACE3, mace3); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e333841fd0..4c4437615f 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVCODEC_VERSION_MAJOR 51 -#define LIBAVCODEC_VERSION_MINOR 70 +#define LIBAVCODEC_VERSION_MINOR 71 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -306,6 +306,7 @@ enum CodecID { CODEC_ID_WMAPRO, CODEC_ID_WMALOSSLESS, CODEC_ID_ATRAC3P, + CODEC_ID_EAC3, /* subtitle codecs */ CODEC_ID_DVD_SUBTITLE= 0x17000, diff --git a/libavformat/Makefile b/libavformat/Makefile index 6457f6650a..565b2972d3 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -44,6 +44,8 @@ OBJS-$(CONFIG_DV_MUXER) += dvenc.o OBJS-$(CONFIG_DXA_DEMUXER) += dxa.o riff.o OBJS-$(CONFIG_EA_CDATA_DEMUXER) += eacdata.o OBJS-$(CONFIG_EA_DEMUXER) += electronicarts.o +OBJS-$(CONFIG_EAC3_DEMUXER) += raw.o +OBJS-$(CONFIG_EAC3_MUXER) += raw.o OBJS-$(CONFIG_FFM_DEMUXER) += ffmdec.o OBJS-$(CONFIG_FFM_MUXER) += ffmenc.o OBJS-$(CONFIG_FLAC_DEMUXER) += raw.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index d207c3b7f1..528cdcd314 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -76,6 +76,7 @@ void av_register_all(void) REGISTER_DEMUXER (DXA, dxa); REGISTER_DEMUXER (EA, ea); REGISTER_DEMUXER (EA_CDATA, ea_cdata); + REGISTER_MUXDEMUX (EAC3, eac3); REGISTER_MUXDEMUX (FFM, ffm); REGISTER_MUXDEMUX (FLAC, flac); REGISTER_DEMUXER (FLIC, flic); diff --git a/libavformat/raw.c b/libavformat/raw.c index f8b3f5d57c..c065785bb1 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -487,8 +487,8 @@ static int dirac_probe(AVProbeData *p) } #endif -#ifdef CONFIG_AC3_DEMUXER -static int ac3_probe(AVProbeData *p) +#if (CONFIG_AC3_DEMUXER || CONFIG_EAC3_DEMUXER) +static int ac3_eac3_probe(AVProbeData *p, int *codec_id) { int max_frames, first_frames = 0, frames; uint8_t *buf, *buf2, *end; @@ -499,6 +499,7 @@ static int ac3_probe(AVProbeData *p) buf = p->buf; end = buf + p->buf_size; + *codec_id = CODEC_ID_AC3; for(; buf < end; buf++) { buf2 = buf; @@ -509,6 +510,8 @@ static int ac3_probe(AVProbeData *p) if(buf2 + hdr.frame_size > end || av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2)) break; + if (hdr.bitstream_id > 10) + *codec_id = CODEC_ID_EAC3; buf2 += hdr.frame_size; } max_frames = FFMAX(max_frames, frames); @@ -522,6 +525,28 @@ static int ac3_probe(AVProbeData *p) } #endif +#ifdef CONFIG_AC3_DEMUXER +static int ac3_probe(AVProbeData *p) +{ + int codec_id = CODEC_ID_NONE; + int score = ac3_eac3_probe(p, &codec_id); + if(codec_id == CODEC_ID_AC3) + return score; + return 0; +} +#endif + +#ifdef CONFIG_EAC3_DEMUXER +static int eac3_probe(AVProbeData *p) +{ + int codec_id = CODEC_ID_NONE; + int score = ac3_eac3_probe(p, &codec_id); + if(codec_id == CODEC_ID_EAC3) + return score; + return 0; +} +#endif + #ifdef CONFIG_FLAC_DEMUXER static int flac_probe(AVProbeData *p) { @@ -633,6 +658,35 @@ AVOutputFormat dts_muxer = { }; #endif +#ifdef CONFIG_EAC3_DEMUXER +AVInputFormat eac3_demuxer = { + "eac3", + NULL_IF_CONFIG_SMALL("raw E-AC-3"), + 0, + eac3_probe, + audio_read_header, + raw_read_partial_packet, + .flags= AVFMT_GENERIC_INDEX, + .extensions = "eac3", + .value = CODEC_ID_EAC3, +}; +#endif + +#ifdef CONFIG_EAC3_MUXER +AVOutputFormat eac3_muxer = { + "eac3", + NULL_IF_CONFIG_SMALL("raw E-AC-3"), + "audio/x-eac3", + "eac3", + 0, + CODEC_ID_EAC3, + CODEC_ID_NONE, + NULL, + raw_write_packet, + .flags= AVFMT_NOTIMESTAMPS, +}; +#endif + #ifdef CONFIG_FLAC_DEMUXER AVInputFormat flac_demuxer = { "flac",