diff -Naur mpeg4ip/bootstrap mpeg4ip-patched/bootstrap --- mpeg4ip/bootstrap 2005-10-13 16:09:41.000000000 -0400 +++ mpeg4ip-patched/bootstrap 2008-01-17 12:05:42.000000000 -0500 @@ -47,9 +47,9 @@ # if test $target_system = "Linux"; then have_faac=no - if which faac >/dev/null 2>/dev/null; then - have_faac=yes - fi +# if which faac >/dev/null 2>/dev/null; then +# have_faac=yes +# fi if test $have_faac = "yes"; then # we have lame and faac - see if faac is built with mp4 support diff -Naur mpeg4ip/lib/mp4v2/Makefile.am mpeg4ip-patched/lib/mp4v2/Makefile.am --- mpeg4ip/lib/mp4v2/Makefile.am 2005-03-10 13:31:34.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/Makefile.am 2008-01-17 12:09:56.000000000 -0500 @@ -21,6 +21,7 @@ atom_encv.cpp \ atom_free.cpp \ atom_ftyp.cpp \ + atom_gmin.cpp \ atom_hdlr.cpp \ atom_hinf.cpp \ atom_hnti.cpp \ @@ -32,6 +33,7 @@ atom_mp4s.cpp \ atom_mp4v.cpp \ atom_mvhd.cpp \ + atom_pasp.cpp \ atom_root.cpp \ atom_rtp.cpp \ atom_s263.cpp \ @@ -45,6 +47,7 @@ atom_stsc.cpp \ atom_stsd.cpp \ atom_stsz.cpp \ + atom_text.cpp \ atom_tfhd.cpp \ atom_tkhd.cpp \ atom_treftype.cpp \ diff -Naur mpeg4ip/lib/mp4v2/Makefile.in mpeg4ip-patched/lib/mp4v2/Makefile.in --- mpeg4ip/lib/mp4v2/Makefile.in 2005-05-18 18:03:05.000000000 -0400 +++ mpeg4ip-patched/lib/mp4v2/Makefile.in 2008-01-17 12:04:09.000000000 -0500 @@ -55,6 +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_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_root.lo \ @@ -82,6 +83,7 @@ @AMDEP_TRUE@ ./$(DEPDIR)/atom_encv.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_free.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_ftyp.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/atom_gmin.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_hdlr.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_hinf.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_hnti.Plo \ @@ -103,6 +105,7 @@ @AMDEP_TRUE@ ./$(DEPDIR)/atom_stsc.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_stsd.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_stsz.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/atom_text.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_tfhd.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_tkhd.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_treftype.Plo \ @@ -349,6 +352,7 @@ atom_encv.cpp \ atom_free.cpp \ atom_ftyp.cpp \ + atom_gmin.cpp \ atom_hdlr.cpp \ atom_hinf.cpp \ atom_hnti.cpp \ @@ -373,6 +377,7 @@ atom_stsc.cpp \ atom_stsd.cpp \ atom_stsz.cpp \ + atom_text.cpp \ atom_tfhd.cpp \ atom_tkhd.cpp \ atom_treftype.cpp \ @@ -501,6 +506,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_encv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_ftyp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_gmin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_hdlr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_hinf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_hnti.Plo@am__quote@ @@ -524,6 +530,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_stsc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_stsd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_stsz.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_tfhd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_tkhd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_treftype.Plo@am__quote@ diff -Naur mpeg4ip/lib/mp4v2/atom_avc1.cpp mpeg4ip-patched/lib/mp4v2/atom_avc1.cpp --- mpeg4ip/lib/mp4v2/atom_avc1.cpp 2004-07-13 17:07:50.000000000 -0400 +++ mpeg4ip-patched/lib/mp4v2/atom_avc1.cpp 2008-01-17 12:07:00.000000000 -0500 @@ -41,7 +41,7 @@ MP4StringProperty* pProp = new MP4StringProperty("compressorName"); pProp->SetFixedLength(32); - pProp->SetValue("AVC Coding"); + pProp->SetValue(""); AddProperty(pProp); /* 6 */ AddReserved("reserved4", 4); /* 7 */ diff -Naur mpeg4ip/lib/mp4v2/atom_gmin.cpp mpeg4ip-patched/lib/mp4v2/atom_gmin.cpp --- mpeg4ip/lib/mp4v2/atom_gmin.cpp 1969-12-31 19:00:00.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/atom_gmin.cpp 2008-01-17 12:04:09.000000000 -0500 @@ -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" + +MP4GminAtom::MP4GminAtom() + : MP4Atom("gmin") +{ + + AddVersionAndFlags(); /* 0, 1 */ + + AddProperty(new MP4Integer16Property("graphicsMode")); /* 2 */ + AddProperty(new MP4Integer16Property("opColorRed")); /* 3 */ + AddProperty(new MP4Integer16Property("opColorGreen")); /* 4 */ + AddProperty(new MP4Integer16Property("opColorBlue")); /* 5 */ + AddProperty(new MP4Integer16Property("balance")); /* 6 */ + AddReserved("reserved", 2); /* 7 */ + +} + +void MP4GminAtom::Generate() +{ + + MP4Atom::Generate(); + + ((MP4Integer16Property*)m_pProperties[2])->SetValue(0x0040); + ((MP4Integer16Property*)m_pProperties[3])->SetValue(0x8000); + ((MP4Integer16Property*)m_pProperties[4])->SetValue(0x8000); + ((MP4Integer16Property*)m_pProperties[5])->SetValue(0x8000); + ((MP4Integer16Property*)m_pProperties[6])->SetValue(0x0000); + +} + diff -Naur mpeg4ip/lib/mp4v2/atom_mp4a.cpp mpeg4ip-patched/lib/mp4v2/atom_mp4a.cpp --- mpeg4ip/lib/mp4v2/atom_mp4a.cpp 2001-10-02 17:15:39.000000000 -0400 +++ mpeg4ip-patched/lib/mp4v2/atom_mp4a.cpp 2008-01-17 12:04:09.000000000 -0500 @@ -29,7 +29,10 @@ AddProperty( /* 1 */ new MP4Integer16Property("dataReferenceIndex")); - AddReserved("reserved2", 16); /* 2 */ + /* patched by saintdev to allow us to set correct audio information */ +// AddReserved("reserved2", 16); /* 2 */ + AddProperty( /* 2 */ + new MP4BytesProperty("reserved2", 16)); AddProperty( /* 3 */ new MP4Integer16Property("timeScale")); @@ -55,5 +58,6 @@ m_pProperties[2]->SetReadOnly(false); ((MP4BytesProperty*)m_pProperties[2])-> SetValue(reserved2, sizeof(reserved2)); - m_pProperties[2]->SetReadOnly(true); + /* patched by saintdev to allow us to set correct audio information */ +// m_pProperties[2]->SetReadOnly(true); } diff -Naur mpeg4ip/lib/mp4v2/atom_standard.cpp mpeg4ip-patched/lib/mp4v2/atom_standard.cpp --- mpeg4ip/lib/mp4v2/atom_standard.cpp 2004-12-14 16:35:35.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/atom_standard.cpp 2008-01-17 12:04:09.000000000 -0500 @@ -138,6 +138,11 @@ /* * g??? */ + } else if (ATOMID(type) == ATOMID("gmhd")) { + ExpectChildAtom("gmin", Required, OnlyOne); + ExpectChildAtom("tmcd", Optional, OnlyOne); + ExpectChildAtom("text", Optional, OnlyOne); + } else if (ATOMID(type) == ATOMID("gnre")) { // Apple iTunes ExpectChildAtom("data", Optional, OnlyOne); @@ -221,6 +226,7 @@ ExpectChildAtom("smhd", Optional, OnlyOne); ExpectChildAtom("hmhd", Optional, OnlyOne); ExpectChildAtom("nmhd", Optional, OnlyOne); + ExpectChildAtom("gmhd", Optional, OnlyOne); ExpectChildAtom("dinf", Required, OnlyOne); ExpectChildAtom("stbl", Required, OnlyOne); @@ -366,6 +372,7 @@ ExpectChildAtom("ipir", Optional, OnlyOne); ExpectChildAtom("mpod", Optional, OnlyOne); ExpectChildAtom("sync", Optional, OnlyOne); + ExpectChildAtom("chap", Optional, OnlyOne); } else if (ATOMID(type) == ATOMID("trex")) { AddVersionAndFlags(); /* 0, 1 */ diff -Naur mpeg4ip/lib/mp4v2/atom_stsd.cpp mpeg4ip-patched/lib/mp4v2/atom_stsd.cpp --- mpeg4ip/lib/mp4v2/atom_stsd.cpp 2004-07-13 17:07:50.000000000 -0400 +++ mpeg4ip-patched/lib/mp4v2/atom_stsd.cpp 2008-01-17 12:07:00.000000000 -0500 @@ -49,6 +49,8 @@ ExpectChildAtom("sawb", Optional, Many); // For AMR-WB ExpectChildAtom("s263", Optional, Many); // For H.263 ExpectChildAtom("avc1", Optional, Many); + ExpectChildAtom("text", Optional, Many); + ExpectChildAtom("pasp", Optional, Many); } void MP4StsdAtom::Read() diff -Naur mpeg4ip/lib/mp4v2/atom_text.cpp mpeg4ip-patched/lib/mp4v2/atom_text.cpp --- mpeg4ip/lib/mp4v2/atom_text.cpp 1969-12-31 19:00:00.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/atom_text.cpp 2008-01-17 12:04:09.000000000 -0500 @@ -0,0 +1,132 @@ +/* + * 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" + +MP4TextAtom::MP4TextAtom() + : MP4Atom("text") +{ + // The atom type "text" is used in two complete unrelated ways + // i.e. it's real two atoms with the same name + // To handle that we need to postpone property creation until + // we know who our parent atom is (stsd or gmhd) which gives us + // the context info we need to know who we are +} + +void MP4TextAtom::AddPropertiesStsdType() +{ + + AddReserved("reserved1", 6); /* 0 */ + + AddProperty(new MP4Integer16Property("dataReferenceIndex"));/* 1 */ + + AddProperty(new MP4Integer32Property("displayFlags")); /* 2 */ + AddProperty(new MP4Integer32Property("textJustification")); /* 3 */ + + AddProperty(new MP4Integer16Property("bgColorRed")); /* 4 */ + AddProperty(new MP4Integer16Property("bgColorGreen")); /* 5 */ + AddProperty(new MP4Integer16Property("bgColorBlue")); /* 6 */ + + AddProperty(new MP4Integer16Property("defTextBoxTop")); /* 7 */ + AddProperty(new MP4Integer16Property("defTextBoxLeft")); /* 8 */ + AddProperty(new MP4Integer16Property("defTextBoxBottom")); /* 9 */ + AddProperty(new MP4Integer16Property("defTextBoxRight")); /* 10 */ + + AddReserved("reserved2", 8); /* 11 */ + + AddProperty(new MP4Integer16Property("fontNumber")); /* 12 */ + AddProperty(new MP4Integer16Property("fontFace")); /* 13 */ + + AddReserved("reserved3", 1); /* 14 */ + AddReserved("reserved4", 2); /* 15 */ + + AddProperty(new MP4Integer16Property("foreColorRed")); /* 16 */ + AddProperty(new MP4Integer16Property("foreColorGreen")); /* 17 */ + AddProperty(new MP4Integer16Property("foreColorBlue")); /* 18 */ + +} + +void MP4TextAtom::AddPropertiesGmhdType() +{ + + AddProperty(new MP4BytesProperty("textData", 36)); /* 0 */ + +} + + +void MP4TextAtom::Generate() +{ + + if (!strcmp(m_pParentAtom->GetType(), "stsd")) { + AddPropertiesStsdType(); + GenerateStsdType(); + } else if (!strcmp(m_pParentAtom->GetType(), "gmhd")) { + AddPropertiesGmhdType(); + GenerateGmhdType(); + } else { + VERBOSE_WARNING(m_pFile->GetVerbosity(), + printf("Warning: text atom in unexpected context, can not generate")); + } + +} + +void MP4TextAtom::GenerateStsdType() +{ + // generate children + MP4Atom::Generate(); + + ((MP4Integer16Property*)m_pProperties[1])->SetValue(1); + + ((MP4Integer32Property*)m_pProperties[2])->SetValue(1); + ((MP4Integer32Property*)m_pProperties[3])->SetValue(1); + +} + +void MP4TextAtom::GenerateGmhdType() +{ + MP4Atom::Generate(); + + // property 0 has non-zero fixed values + static u_int8_t textData[36] = { + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x40, 0x00, + 0x00, 0x00, + }; + ((MP4BytesProperty*)m_pProperties[0])->SetValue(textData, sizeof(textData)); + +} + + diff -Naur mpeg4ip/lib/mp4v2/atom_tkhd.cpp mpeg4ip-patched/lib/mp4v2/atom_tkhd.cpp --- mpeg4ip/lib/mp4v2/atom_tkhd.cpp 2003-11-20 00:46:11.000000000 +0100 +++ mpeg4ip/lib/mp4v2/atom_tkhd.cpp 2008-01-19 12:41:13.000000000 +0100 @@ -53,23 +53,29 @@ new MP4Integer32Property("duration")); } - AddReserved("reserved2", 12); /* 7 */ - + AddReserved("reserved2", 8); /* 7 */ + + AddProperty( /* 8 */ + new MP4Integer16Property("layer")); + AddProperty( /* 9 */ + new MP4Integer16Property("alternate_group")); + MP4Float32Property* pProp; pProp = new MP4Float32Property("volume"); pProp->SetFixed16Format(); - AddProperty(pProp); /* 8 */ + AddProperty(pProp); /* 10 */ - AddReserved("reserved3", 38); /* 9 */ + /* patched by maurj to enable us to set the matrix for anamorphic display */ + AddProperty(new MP4BytesProperty("reserved3", 38)); /* 11 */ pProp = new MP4Float32Property("width"); pProp->SetFixed32Format(); - AddProperty(pProp); /* 10 */ + AddProperty(pProp); /* 12 */ pProp = new MP4Float32Property("height"); pProp->SetFixed32Format(); - AddProperty(pProp); /* 11 */ + AddProperty(pProp); /* 13 */ } void MP4TkhdAtom::Generate() @@ -103,10 +109,11 @@ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, }; - m_pProperties[9]->SetReadOnly(false); - ((MP4BytesProperty*)m_pProperties[9])-> + m_pProperties[11]->SetReadOnly(false); + ((MP4BytesProperty*)m_pProperties[11])-> SetValue(reserved3, sizeof(reserved3)); - m_pProperties[9]->SetReadOnly(true); + /* patched by maurj to enable us to set the matrix for anamorphic display */ + /* m_pProperties[9]->SetReadOnly(true);*/ } void MP4TkhdAtom::Read() diff -Naur mpeg4ip/lib/mp4v2/atoms.h mpeg4ip-patched/lib/mp4v2/atoms.h --- mpeg4ip/lib/mp4v2/atoms.h 2005-03-10 13:31:34.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/atoms.h 2008-01-17 12:07:00.000000000 -0500 @@ -206,6 +206,12 @@ void Read(); }; +class MP4GminAtom : public MP4Atom { +public: + MP4GminAtom(); + void Generate(); +}; + class MP4HdlrAtom : public MP4Atom { public: MP4HdlrAtom(); @@ -327,6 +333,19 @@ void Write(); }; +class MP4TextAtom : public MP4Atom { +public: + MP4TextAtom(); + void Generate(); + +protected: + void AddPropertiesStsdType(); + void AddPropertiesGmhdType(); + + void GenerateStsdType(); + void GenerateGmhdType(); +}; + class MP4TfhdAtom : public MP4Atom { public: MP4TfhdAtom(); @@ -374,4 +393,10 @@ void Generate(void); }; +class MP4PaspAtom : public MP4Atom { + public: + MP4PaspAtom(); + void Generate(); +}; + #endif /* __MP4_ATOMS_INCLUDED__ */ diff -Naur mpeg4ip/lib/mp4v2/libmp4v260.dsp mpeg4ip-patched/lib/mp4v2/libmp4v260.dsp --- mpeg4ip/lib/mp4v2/libmp4v260.dsp 2005-03-24 17:14:52.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/libmp4v260.dsp 2008-01-17 12:07:00.000000000 -0500 @@ -134,6 +134,10 @@ # End Source File # Begin Source File +SOURCE=.\atom_gmin.cpp +# End Source File +# Begin Source File + SOURCE=.\atom_hdlr.cpp # End Source File # Begin Source File @@ -178,6 +182,10 @@ # End Source File # Begin Source File +SOURCE=.\atom_pasp.cpp +# End Source File +# Begin Source File + SOURCE=.\atom_root.cpp # End Source File # Begin Source File @@ -242,6 +250,10 @@ # End Source File # Begin Source File +SOURCE=.\atom_text.cpp +# End Source File +# Begin Source File + SOURCE=.\atom_udta.cpp # End Source File # Begin Source File diff -Naur mpeg4ip/lib/mp4v2/libmp4v2_st60.dsp mpeg4ip-patched/lib/mp4v2/libmp4v2_st60.dsp --- mpeg4ip/lib/mp4v2/libmp4v2_st60.dsp 2005-03-24 17:14:52.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/libmp4v2_st60.dsp 2008-01-17 12:04:09.000000000 -0500 @@ -133,6 +133,10 @@ # End Source File # Begin Source File +SOURCE=.\atom_gmin.cpp +# End Source File +# Begin Source File + SOURCE=.\atom_hdlr.cpp # End Source File # Begin Source File @@ -241,6 +245,10 @@ # End Source File # Begin Source File +SOURCE=.\atom_text.cpp +# End Source File +# Begin Source File + SOURCE=.\atom_udta.cpp # End Source File # Begin Source File diff -Naur mpeg4ip/lib/mp4v2/mp4.cpp mpeg4ip-patched/lib/mp4v2/mp4.cpp --- mpeg4ip/lib/mp4v2/mp4.cpp 2005-03-30 13:41:58.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/mp4.cpp 2008-01-17 12:07:00.000000000 -0500 @@ -939,6 +939,52 @@ return MP4_INVALID_TRACK_ID; } +extern "C" MP4TrackId MP4AddTextTrack( + MP4FileHandle hFile, MP4TrackId refTrackId) +{ + if (MP4_IS_VALID_FILE_HANDLE(hFile)) { + try { + return ((MP4File*)hFile)->AddTextTrack(refTrackId); + } + catch (MP4Error* e) { + PRINT_ERROR(e); + delete e; + } + } + return MP4_INVALID_TRACK_ID; +} + +extern "C" MP4TrackId MP4AddChapterTextTrack( + MP4FileHandle hFile, MP4TrackId refTrackId) +{ + if (MP4_IS_VALID_FILE_HANDLE(hFile)) { + try { + return ((MP4File*)hFile)->AddChapterTextTrack(refTrackId); + } + catch (MP4Error* e) { + PRINT_ERROR(e); + delete e; + } + } + return MP4_INVALID_TRACK_ID; +} + +extern "C" MP4TrackId MP4AddPixelAspectRatio( + MP4FileHandle hFile, MP4TrackId refTrackId, u_int32_t hSpacing, u_int32_t vSpacing) +{ + if (MP4_IS_VALID_FILE_HANDLE(hFile)) { + try { + return ((MP4File*)hFile)->AddPixelAspectRatio(refTrackId, hSpacing, vSpacing); + } + catch (MP4Error* e) { + PRINT_ERROR(e); + delete e; + } + } + return MP4_INVALID_TRACK_ID; +} + + extern "C" MP4TrackId MP4CloneTrack( MP4FileHandle srcFile, MP4TrackId srcTrackId, diff -Naur mpeg4ip/lib/mp4v2/mp4.h mpeg4ip-patched/lib/mp4v2/mp4.h --- mpeg4ip/lib/mp4v2/mp4.h 2005-03-30 13:41:58.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/mp4.h 2008-01-17 12:07:00.000000000 -0500 @@ -100,6 +100,7 @@ #define MP4_VIDEO_TRACK_TYPE "vide" #define MP4_HINT_TRACK_TYPE "hint" #define MP4_CNTL_TRACK_TYPE "cntl" +#define MP4_TEXT_TRACK_TYPE "text" /* * This second set of track types should be created * via MP4AddSystemsTrack(type) @@ -538,6 +539,20 @@ MP4FileHandle hFile, MP4TrackId refTrackId); +MP4TrackId MP4AddTextTrack( + MP4FileHandle hFile, + MP4TrackId refTrackId); + +MP4TrackId MP4AddChapterTextTrack( + MP4FileHandle hFile, + MP4TrackId refTrackId); + +MP4TrackId MP4AddPixelAspectRatio( + MP4FileHandle hFile, + MP4TrackId refTrackId, + u_int32_t hSpacing, + u_int32_t vSpacing); + MP4TrackId MP4CloneTrack( MP4FileHandle srcFile, MP4TrackId srcTrackId, diff -Naur mpeg4ip/lib/mp4v2/mp4atom.cpp mpeg4ip-patched/lib/mp4v2/mp4atom.cpp --- mpeg4ip/lib/mp4v2/mp4atom.cpp 2005-03-10 13:31:34.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/mp4atom.cpp 2008-01-17 12:11:40.000000000 -0500 @@ -84,6 +84,13 @@ pAtom = new MP4SoundAtom("alaw"); } break; + + case 'c': + if (ATOMID(type) == ATOMID("chap")) { + pAtom = new MP4TrefTypeAtom(type); + } + break; + case 'd': if (ATOMID(type) == ATOMID("d263")) { pAtom = new MP4D263Atom(); @@ -113,6 +120,11 @@ pAtom = new MP4FtypAtom(); } break; + case 'g': + if (ATOMID(type) == ATOMID("gmin")) { + pAtom = new MP4GminAtom(); + } + break; case 'h': if (ATOMID(type) == ATOMID("hdlr")) { pAtom = new MP4HdlrAtom(); @@ -200,7 +212,9 @@ } break; case 't': - if (ATOMID(type) == ATOMID("tkhd")) { + if (ATOMID(type) == ATOMID("text")) { + pAtom = new MP4TextAtom(); + } else if (ATOMID(type) == ATOMID("tkhd")) { pAtom = new MP4TkhdAtom(); } else if (ATOMID(type) == ATOMID("tfhd")) { pAtom = new MP4TfhdAtom(); @@ -238,6 +252,12 @@ pAtom = new MP4SmiAtom(); } break; + case 'p': + if (ATOMID(type) == ATOMID("pasp")) { + pAtom = new MP4PaspAtom(); + } + break; + } } diff -Naur mpeg4ip/lib/mp4v2/mp4file.cpp mpeg4ip-patched/lib/mp4v2/mp4file.cpp --- mpeg4ip/lib/mp4v2/mp4file.cpp 2005-03-30 13:41:58.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/mp4file.cpp 2008-01-17 12:07:00.000000000 -0500 @@ -1869,6 +1869,81 @@ return trackId; } +MP4TrackId MP4File::AddTextTrack(MP4TrackId refTrackId) +{ + // validate reference track id + FindTrackIndex(refTrackId); + + MP4TrackId trackId = + AddTrack(MP4_TEXT_TRACK_TYPE, GetTrackTimeScale(refTrackId)); + + InsertChildAtom(MakeTrackName(trackId, "mdia.minf"), "gmhd", 0); + + AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "text"); + + // 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 text atom + MP4Integer32Property* pStsdCountProperty; + FindIntegerProperty( + MakeTrackName(trackId, "mdia.minf.stbl.stsd.entryCount"), + (MP4Property**)&pStsdCountProperty); + pStsdCountProperty->IncrementValue(); + + return trackId; +} + +MP4TrackId MP4File::AddChapterTextTrack(MP4TrackId refTrackId) +{ + // validate reference track id + FindTrackIndex(refTrackId); + + MP4TrackId trackId = + AddTrack(MP4_TEXT_TRACK_TYPE, GetTrackTimeScale(refTrackId)); + + InsertChildAtom(MakeTrackName(trackId, "mdia.minf"), "gmhd", 0); + + AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "text"); + + // 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 text atom + MP4Integer32Property* pStsdCountProperty; + FindIntegerProperty( + MakeTrackName(trackId, "mdia.minf.stbl.stsd.entryCount"), + (MP4Property**)&pStsdCountProperty); + pStsdCountProperty->IncrementValue(); + + /* add the magic "text" atom to the generic media header */ + AddChildAtom(MakeTrackName(trackId, "mdia.minf.gmhd"), "text"); + + AddDescendantAtoms(MakeTrackName(refTrackId, NULL), "tref.chap"); + + AddTrackReference(MakeTrackName(refTrackId, "tref.chap"), trackId); + + return trackId; +} + +MP4TrackId MP4File::AddPixelAspectRatio(MP4TrackId trackId, u_int32_t hSpacing, u_int32_t vSpacing) +{ + // validate reference track id + (void)FindTrackIndex(trackId); + const char *format = GetTrackMediaDataName (trackId); + + if (!strcasecmp(format, "avc1")) + { + (void)AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd.avc1"), "pasp"); + SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.avc1.pasp.hSpacing", hSpacing); + SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.avc1.pasp.vSpacing", vSpacing); + } + else if (!strcasecmp(format, "mp4v")) + { + (void)AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd.mp4v"), "pasp"); + SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.mp4v.pasp.hSpacing", hSpacing); + SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.mp4v.pasp.vSpacing", vSpacing); + } + + return trackId; +} + void MP4File::DeleteTrack(MP4TrackId trackId) { ProtectWriteOperation("MP4DeleteTrack"); diff -Naur mpeg4ip/lib/mp4v2/mp4file.h mpeg4ip-patched/lib/mp4v2/mp4file.h --- mpeg4ip/lib/mp4v2/mp4file.h 2005-03-30 13:41:58.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/mp4file.h 2008-01-17 12:07:00.000000000 -0500 @@ -296,6 +296,10 @@ const uint8_t *pPicture, uint16_t pictureLen); MP4TrackId AddHintTrack(MP4TrackId refTrackId); + MP4TrackId AddTextTrack(MP4TrackId refTrackId); + MP4TrackId AddChapterTextTrack(MP4TrackId refTrackId); + + MP4TrackId AddPixelAspectRatio(MP4TrackId trackId, u_int32_t hSpacing, u_int32_t vSpacing); MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId); diff -Naur mpeg4ip/lib/mp4v2/atom_pasp.cpp mpeg4ip-patched/lib/mp4v2/atom_pasp.cpp --- mpeg4ip/lib/mp4v2/atom_pasp.cpp 1969-12-31 19:00:00.000000000 -0500 +++ mpeg4ip-patched/lib/mp4v2/atom_pasp.cpp 2008-01-17 12:07:00.000000000 -0500 @@ -0,0 +1,42 @@ +/* + * 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. + * + * Contributer has declined to give copyright information, and gives + * it freely to the world. + * + * Contributor(s): + */ + +#include "mp4common.h" + +MP4PaspAtom::MP4PaspAtom() + : MP4Atom("pasp") +{ + + AddProperty( /* 0 */ + new MP4Integer32Property("hSpacing")); + + AddProperty( /* 1 */ + new MP4Integer32Property("vSpacing")); + +} + +void MP4PaspAtom::Generate() +{ + + MP4Atom::Generate(); + + ((MP4Integer32Property*)m_pProperties[0])->SetValue(1); + ((MP4Integer32Property*)m_pProperties[1])->SetValue(1); + +} diff -Naur mpeg4ip-patched/lib/mp4v2/Makefile.in mpeg4ip/lib/mp4v2/Makefile.in --- mpeg4ip-patched/lib/mp4v2/Makefile.in 2008-01-17 12:04:09.000000000 -0500 +++ mpeg4ip/lib/mp4v2/Makefile.in 2008-01-17 13:20:50.000000000 -0500 @@ -58,7 +58,7 @@ atom_gmin.lo atom_text.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_root.lo \ + atom_mp4s.lo atom_mp4v.lo atom_mvhd.lo atom_pasp.lo atom_root.lo \ atom_rtp.lo atom_s263.lo atom_sdp.lo atom_smi.lo atom_sound.lo \ atom_standard.lo atom_stbl.lo atom_stdp.lo atom_stsc.lo \ atom_stsd.lo atom_stsz.lo atom_tfhd.lo atom_tkhd.lo \ @@ -96,6 +96,7 @@ @AMDEP_TRUE@ ./$(DEPDIR)/atom_mp4v.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_mvhd.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_root.Plo ./$(DEPDIR)/atom_rtp.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/atom_pasp.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_s263.Plo ./$(DEPDIR)/atom_sdp.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_smi.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/atom_sound.Plo \ @@ -364,6 +365,7 @@ atom_mp4s.cpp \ atom_mp4v.cpp \ atom_mvhd.cpp \ + atom_pasp.cpp \ atom_root.cpp \ atom_rtp.cpp \ atom_s263.cpp \ @@ -518,6 +520,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_mp4s.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_mp4v.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_mvhd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_pasp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_root.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_rtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_s263.Plo@am__quote@