OSDN Git Service

create a separate codec_id for E-AC-3
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 1 Sep 2008 14:33:54 +0000 (14:33 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Mon, 1 Sep 2008 14:33:54 +0000 (14:33 +0000)
Originally committed as revision 15143 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/aac_ac3_parser.c
libavcodec/ac3_parser.c
libavcodec/ac3dec.c
libavcodec/ac3enc.c
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavformat/Makefile
libavformat/allformats.c
libavformat/raw.c

index cfb1a22..d0c912a 100644 (file)
@@ -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;
index b9a25ab..aedcbcd 100644 (file)
@@ -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,
index 1432ff0..1a22126 100644 (file)
@@ -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)"),
 };
index e0f17c2..434869c 100644 (file)
@@ -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)"),
 };
index 8be683a..5694282 100644 (file)
@@ -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);
index e333841..4c44376 100644 (file)
@@ -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,
index 6457f66..565b297 100644 (file)
@@ -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
index d207c3b..528cdcd 100644 (file)
@@ -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);
index f8b3f5d..c065785 100644 (file)
@@ -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",