aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-09-03 19:05:22 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-09-03 19:05:22 +0000
commitd4a240cbc9e75e943fa98b9e9e0afe60644b6033 (patch)
treeaff2543ff3b51f9ad16ac85cb2c1f013827f443b
parent395206f6b1e445258cba1bdffb82060939030bb4 (diff)
downloadffmpeg-d4a240cbc9e75e943fa98b9e9e0afe60644b6033.tar.gz
ac3 muxing support in mov/mp4/m4v
Originally committed as revision 15184 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/isom.c2
-rw-r--r--libavformat/movenc.c52
2 files changed, 53 insertions, 1 deletions
diff --git a/libavformat/isom.c b/libavformat/isom.c
index a21caa1cff..cec5809ff8 100644
--- a/libavformat/isom.c
+++ b/libavformat/isom.c
@@ -48,6 +48,7 @@ const AVCodecTag ff_mp4_obj_type[] = {
{ CODEC_ID_PNG , 109 },
{ CODEC_ID_JPEG2000 , 110 }, /* 15444-1 */
{ CODEC_ID_VC1 , 163 },
+ { CODEC_ID_AC3 , 165 },
{ CODEC_ID_VORBIS , 221 }, /* non standard, gpac uses it */
{ CODEC_ID_DVD_SUBTITLE, 224 }, /* non standard, see unsupported-embedded-subs-2.mp4 */
{ CODEC_ID_QCELP , 225 },
@@ -187,6 +188,7 @@ const AVCodecTag codec_movaudio_tags[] = {
/* { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
{ CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */
+ { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
{ CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
{ CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 3547618410..039f5aca2d 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -24,6 +24,7 @@
#include "avio.h"
#include "isom.h"
#include "avc.h"
+#include "libavcodec/bitstream.h"
#undef NDEBUG
#include <assert.h>
@@ -219,6 +220,50 @@ static int mov_write_amr_tag(ByteIOContext *pb, MOVTrack *track)
return 0x11;
}
+static int mov_write_ac3_tag(ByteIOContext *pb, MOVTrack *track)
+{
+ GetBitContext gbc;
+ PutBitContext pbc;
+ uint8_t buf[3];
+ int fscod, bsid, bsmod, acmod, lfeon, frmsizecod;
+
+ if (track->vosLen < 7)
+ return -1;
+
+ put_be32(pb, 11);
+ put_tag(pb, "dac3");
+
+ init_get_bits(&gbc, track->vosData+2, track->vosLen-2);
+ fscod = get_bits(&gbc, 2);
+ frmsizecod = get_bits(&gbc, 6);
+ bsid = get_bits(&gbc, 5);
+ bsmod = get_bits(&gbc, 3);
+ acmod = get_bits(&gbc, 3);
+ if (acmod == 2) {
+ skip_bits(&gbc, 2); // dsurmod
+ } else {
+ if ((acmod & 1) && acmod != 1)
+ skip_bits(&gbc, 2); // cmixlev
+ if (acmod & 4)
+ skip_bits(&gbc, 2); // surmixlev
+ }
+ lfeon = get_bits1(&gbc);
+
+ init_put_bits(&pbc, buf, sizeof(buf));
+ put_bits(&pbc, 2, fscod);
+ put_bits(&pbc, 5, bsid);
+ put_bits(&pbc, 3, bsmod);
+ put_bits(&pbc, 3, acmod);
+ put_bits(&pbc, 1, lfeon);
+ put_bits(&pbc, 5, frmsizecod>>1); // bit_rate_code
+ put_bits(&pbc, 5, 0); // reserved
+
+ flush_put_bits(&pbc);
+ put_buffer(pb, buf, sizeof(buf));
+
+ return 11;
+}
+
/**
* This function writes extradata "as is".
* Extradata must be formated like a valid atom (with size and tag)
@@ -330,6 +375,8 @@ static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track)
mov_write_enda_tag(pb);
} else if (track->enc->codec_id == CODEC_ID_AMR_NB) {
mov_write_amr_tag(pb, track);
+ } else if (track->enc->codec_id == CODEC_ID_AC3) {
+ mov_write_ac3_tag(pb, track);
} else if (track->enc->codec_id == CODEC_ID_ALAC) {
mov_write_extradata_tag(pb, track);
}
@@ -516,6 +563,7 @@ static const AVCodecTag codec_ipod_tags[] = {
{ CODEC_ID_MPEG4, MKTAG('m','p','4','v') },
{ CODEC_ID_AAC, MKTAG('m','p','4','a') },
{ CODEC_ID_ALAC, MKTAG('a','l','a','c') },
+ { CODEC_ID_AC3, MKTAG('a','c','-','3') },
};
static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
@@ -525,6 +573,7 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
if (!codec_get_tag(ff_mp4_obj_type, track->enc->codec_id))
return 0;
if (track->enc->codec_id == CODEC_ID_H264) tag = MKTAG('a','v','c','1');
+ else if (track->enc->codec_id == CODEC_ID_AC3) tag = MKTAG('a','c','-','3');
else if (track->enc->codec_type == CODEC_TYPE_VIDEO) tag = MKTAG('m','p','4','v');
else if (track->enc->codec_type == CODEC_TYPE_AUDIO) tag = MKTAG('m','p','4','a');
} else if (track->mode == MODE_IPOD) {
@@ -1618,7 +1667,8 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
return ret;
assert(pkt->size);
size = pkt->size;
- } else if (enc->codec_id == CODEC_ID_DNXHD && !trk->vosLen) {
+ } else if ((enc->codec_id == CODEC_ID_DNXHD ||
+ enc->codec_id == CODEC_ID_AC3) && !trk->vosLen) {
/* copy frame to create needed atoms */
trk->vosLen = size;
trk->vosData = av_malloc(size);