diff -Naur mpeg4ip/lib/mp4v2/Makefile.am mpeg4ip-patched/lib/mp4v2/Makefile.am --- mpeg4ip/lib/mp4v2/Makefile.am 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/Makefile.am 2008-02-13 15:50:50.000000000 +1300 @@ -10,6 +10,7 @@ libmp4v2_la_SOURCES = \ 3gp.cpp \ + atom_ac3.cpp \ atom_amr.cpp \ atom_avc1.cpp \ atom_avcC.cpp \ @@ -33,6 +34,7 @@ atom_mp4s.cpp \ atom_mp4v.cpp \ atom_mvhd.cpp \ + atom_name.cpp \ atom_pasp.cpp \ atom_root.cpp \ atom_rtp.cpp \ diff -Naur mpeg4ip/lib/mp4v2/Makefile.in mpeg4ip-patched/lib/mp4v2/Makefile.in --- mpeg4ip/lib/mp4v2/Makefile.in 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/Makefile.in 2008-02-14 14:38:05.000000000 +1300 @@ -55,7 +55,7 @@ am_libmp4v2_la_OBJECTS = 3gp.lo atom_amr.lo atom_avc1.lo atom_avcC.lo \ atom_d263.lo atom_damr.lo atom_dref.lo atom_elst.lo \ atom_enca.lo atom_encv.lo atom_free.lo atom_ftyp.lo \ - atom_gmin.lo atom_text.lo \ + atom_gmin.lo atom_text.lo atom_ac3.lo \ atom_hdlr.lo atom_hinf.lo atom_hnti.lo atom_href.lo \ atom_mdat.lo atom_mdhd.lo atom_meta.lo atom_mp4a.lo \ atom_mp4s.lo atom_mp4v.lo atom_mvhd.lo atom_pasp.lo atom_root.lo \ @@ -73,6 +73,7 @@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/3gp.Plo ./$(DEPDIR)/atom_amr.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/atom_ac3.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_avc1.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_avcC.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_d263.Plo \ @@ -342,6 +343,7 @@ include_HEADERS = mp4.h libmp4v2_la_SOURCES = \ 3gp.cpp \ + atom_ac3.cpp \ atom_amr.cpp \ atom_avc1.cpp \ atom_avcC.cpp \ @@ -497,6 +499,7 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/3gp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_ac3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_amr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_avc1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_avcC.Plo@am__quote@ diff -Naur mpeg4ip/lib/mp4v2/atom_ac3.cpp mpeg4ip-patched/lib/mp4v2/atom_ac3.cpp --- mpeg4ip/lib/mp4v2/atom_ac3.cpp 1970-01-01 12:00:00.000000000 +1200 +++ mpeg4ip-patched/lib/mp4v2/atom_ac3.cpp 2008-02-14 14:29:52.000000000 +1300 @@ -0,0 +1,51 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is MPEG4IP. + * + * The Initial Developer of the Original Code is Cisco Systems Inc. + * Portions created by Cisco Systems Inc. are + * Copyright (C) Cisco Systems Inc. 2001. All Rights Reserved. + * + * Contributor(s): + * Dave Mackie dmackie@cisco.com + */ + +#include "mp4common.h" + +MP4Ac3Atom::MP4Ac3Atom() + : MP4Atom("ac-3") +{ + + AddProperty( new MP4BytesProperty("data", 47)); +} + +void MP4Ac3Atom::Generate() +{ + MP4Atom::Generate(); + + // This is a nasty nasty hack because Apple haven't told us what is + // in the AC3 atom. So I've just copied this raw data from a sample + // file. + // I believe most of this is actually the same as the mp4a atom. + // I can play with this later to get it 100% right, for now this works. + static u_int8_t ac3[39] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xbb, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x64, 0x61, 0x63, 0x33, 0x10, 0x3d, 0x40, + }; + + m_pProperties[0]->SetReadOnly(false); + ((MP4BytesProperty*)m_pProperties[0])-> + SetValue(ac3, sizeof(ac3)); +} diff -Naur mpeg4ip/lib/mp4v2/atom_meta.cpp mpeg4ip-patched/lib/mp4v2/atom_meta.cpp --- mpeg4ip/lib/mp4v2/atom_meta.cpp 2004-12-15 10:35:35.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/atom_meta.cpp 2008-02-13 16:49:16.000000000 +1300 @@ -43,20 +43,33 @@ MP4NameAtom::MP4NameAtom() : MP4Atom("name") { - AddVersionAndFlags(); /* 0, 1 */ - - AddProperty( - new MP4BytesProperty("metadata")); /* 2 */ + } void MP4NameAtom::Read() { + if (ATOMID(m_pParentAtom->GetType()) != ATOMID("udta")) { // calculate size of the metadata from the atom size ((MP4BytesProperty*)m_pProperties[2])->SetValueSize(m_size - 4); + } - MP4Atom::Read(); + MP4Atom::Read(); } +void MP4NameAtom::Generate() +{ + if (ATOMID(m_pParentAtom->GetType()) == ATOMID("udta")) { + AddProperty(new MP4BytesProperty("value")); + } else { + AddVersionAndFlags(); /* 0, 1 */ + + AddProperty( + new MP4BytesProperty("metadata")); /* 2 */ + } + MP4Atom::Generate(); +} + + MP4DataAtom::MP4DataAtom() : MP4Atom("data") { diff -Naur mpeg4ip/lib/mp4v2/atom_stsd.cpp mpeg4ip-patched/lib/mp4v2/atom_stsd.cpp --- mpeg4ip/lib/mp4v2/atom_stsd.cpp 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/atom_stsd.cpp 2008-02-13 14:52:10.000000000 +1300 @@ -51,6 +51,7 @@ ExpectChildAtom("avc1", Optional, Many); ExpectChildAtom("text", Optional, Many); ExpectChildAtom("pasp", Optional, Many); + ExpectChildAtom("ac-3", Optional, Many); } void MP4StsdAtom::Read() diff -Naur mpeg4ip/lib/mp4v2/atom_udta.cpp mpeg4ip-patched/lib/mp4v2/atom_udta.cpp --- mpeg4ip/lib/mp4v2/atom_udta.cpp 2003-08-05 09:59:56.000000000 +1200 +++ mpeg4ip-patched/lib/mp4v2/atom_udta.cpp 2008-02-13 16:25:08.000000000 +1300 @@ -33,6 +33,7 @@ { if (ATOMID(m_pParentAtom->GetType()) == ATOMID("trak")) { ExpectChildAtom("hinf", Optional, OnlyOne); + ExpectChildAtom("name", Optional, OnlyOne); } MP4Atom::Read(); diff -Naur mpeg4ip/lib/mp4v2/atoms.h mpeg4ip-patched/lib/mp4v2/atoms.h --- mpeg4ip/lib/mp4v2/atoms.h 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/atoms.h 2008-02-14 14:54:20.000000000 +1300 @@ -146,6 +146,12 @@ void Generate(); }; +class MP4Ac3Atom : public MP4Atom { +public: + MP4Ac3Atom(); + void Generate(); +}; + class MP4Mp4sAtom : public MP4Atom { public: MP4Mp4sAtom(); @@ -267,6 +273,7 @@ public: MP4NameAtom(); void Read(); + void Generate(); }; class MP4RtpAtom : public MP4Atom { diff -Naur mpeg4ip/lib/mp4v2/mp4.cpp mpeg4ip-patched/lib/mp4v2/mp4.cpp --- mpeg4ip/lib/mp4v2/mp4.cpp 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/mp4.cpp 2008-02-13 17:16:33.000000000 +1300 @@ -592,6 +592,25 @@ return MP4_INVALID_TRACK_ID; } +extern "C" MP4TrackId MP4AddAC3AudioTrack( + MP4FileHandle hFile, + u_int32_t timeScale, + MP4Duration sampleDuration, + u_int8_t audioType) +{ + if (MP4_IS_VALID_FILE_HANDLE(hFile)) { + try { + return ((MP4File*)hFile)-> + AddAC3AudioTrack(timeScale, sampleDuration, audioType); + } + catch (MP4Error* e) { + PRINT_ERROR(e); + delete e; + } + } + return MP4_INVALID_TRACK_ID; +} + extern "C" MP4TrackId MP4AddEncAudioTrack(MP4FileHandle hFile, u_int32_t timeScale, MP4Duration sampleDuration, diff -Naur mpeg4ip/lib/mp4v2/mp4.h mpeg4ip-patched/lib/mp4v2/mp4.h --- mpeg4ip/lib/mp4v2/mp4.h 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/mp4.h 2008-02-13 17:15:24.000000000 +1300 @@ -432,6 +432,12 @@ MP4Duration sampleDuration, u_int8_t audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE)); +MP4TrackId MP4AddAC3AudioTrack( + MP4FileHandle hFile, + u_int32_t timeScale, + MP4Duration sampleDuration, + u_int8_t audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE)); + typedef struct mp4v2_ismacryp_session_params { u_int32_t scheme_type; u_int16_t scheme_version; diff -Naur mpeg4ip/lib/mp4v2/mp4atom.cpp mpeg4ip-patched/lib/mp4v2/mp4atom.cpp --- mpeg4ip/lib/mp4v2/mp4atom.cpp 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/mp4atom.cpp 2008-02-13 16:03:41.000000000 +1300 @@ -76,6 +76,8 @@ case 'a': if (ATOMID(type) == ATOMID("avc1")) { pAtom = new MP4Avc1Atom(); + } else if (ATOMID(type) == ATOMID("ac-3")) { + pAtom = new MP4Ac3Atom(); } else if (ATOMID(type) == ATOMID("avcC")) { pAtom = new MP4AvcCAtom(); } else if (ATOMID(type) == ATOMID("alis")) { diff -Naur mpeg4ip/lib/mp4v2/mp4file.cpp mpeg4ip-patched/lib/mp4v2/mp4file.cpp --- mpeg4ip/lib/mp4v2/mp4file.cpp 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/mp4file.cpp 2008-02-13 17:47:11.000000000 +1300 @@ -1301,6 +1301,8 @@ AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "mp4a"); + AddDescendantAtoms(MakeTrackName(trackId, NULL), "udta.name"); + // stsd is a unique beast in that it has a count of the number // of child atoms that needs to be incremented after we add the mp4a atom MP4Integer32Property* pStsdCountProperty; @@ -1337,6 +1339,60 @@ return trackId; } +MP4TrackId MP4File::AddAC3AudioTrack( + u_int32_t timeScale, + MP4Duration sampleDuration, + u_int8_t audioType) +{ + MP4TrackId trackId = AddTrack(MP4_AUDIO_TRACK_TYPE, timeScale); + + AddTrackToOd(trackId); + + SetTrackFloatProperty(trackId, "tkhd.volume", 1.0); + + InsertChildAtom(MakeTrackName(trackId, "mdia.minf"), "smhd", 0); + + AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "ac-3"); + + AddDescendantAtoms(MakeTrackName(trackId, NULL), "udta.name"); + + // stsd is a unique beast in that it has a count of the number + // of child atoms that needs to be incremented after we add the mp4a atom + MP4Integer32Property* pStsdCountProperty; + FindIntegerProperty( + MakeTrackName(trackId, "mdia.minf.stbl.stsd.entryCount"), + (MP4Property**)&pStsdCountProperty); + pStsdCountProperty->IncrementValue(); + + //SetTrackIntegerProperty(trackId, + // "mdia.minf.stbl.stsd.ac-3.timeScale", timeScale); + + // + //SetTrackIntegerProperty(trackId, + // "mdia.minf.stbl.stsd.ac-3.esds.ESID", +#if 0 + // note - for a file, these values need to + // be 0 - wmay - 04/16/2003 + // trackId +#else + // 0 +#endif + // ); + + //SetTrackIntegerProperty(trackId, + // "mdia.minf.stbl.stsd.ac-3.esds.decConfigDescr.objectTypeId", + // audioType); + + //SetTrackIntegerProperty(trackId, + // "mdia.minf.stbl.stsd.ac-3.esds.decConfigDescr.streamType", + // MP4AudioStreamType); + + m_pTracks[FindTrackIndex(trackId)]-> + SetFixedSampleDuration(sampleDuration); + + return trackId; +} + MP4TrackId MP4File::AddEncAudioTrack(u_int32_t timeScale, MP4Duration sampleDuration, u_int8_t audioType, diff -Naur mpeg4ip/lib/mp4v2/mp4file.h mpeg4ip-patched/lib/mp4v2/mp4file.h --- mpeg4ip/lib/mp4v2/mp4file.h 2008-02-14 14:44:36.000000000 +1300 +++ mpeg4ip-patched/lib/mp4v2/mp4file.h 2008-02-13 17:17:11.000000000 +1300 @@ -203,6 +203,11 @@ MP4Duration sampleDuration, u_int8_t audioType); + MP4TrackId AddAC3AudioTrack( + u_int32_t timeScale, + MP4Duration sampleDuration, + u_int8_t audioType); + MP4TrackId AddEncAudioTrack( // ismacryp u_int32_t timeScale, MP4Duration sampleDuration,