diff options
Diffstat (limited to 'contrib/patch-mpeg4ip.patch')
-rw-r--r-- | contrib/patch-mpeg4ip.patch | 585 |
1 files changed, 582 insertions, 3 deletions
diff --git a/contrib/patch-mpeg4ip.patch b/contrib/patch-mpeg4ip.patch index 8a55c5da2..d025e5750 100644 --- a/contrib/patch-mpeg4ip.patch +++ b/contrib/patch-mpeg4ip.patch @@ -1,6 +1,317 @@ -diff -Naur mpeg4ip/lib/mp4v2/atom_tkhd.cpp mpeg4ip_patched/lib/mp4v2/atom_tkhd.cpp ---- mpeg4ip/lib/mp4v2/atom_tkhd.cpp 2003-11-19 23:46:11.000000000 +0000 -+++ mpeg4ip_patched/lib/mp4v2/atom_tkhd.cpp 2007-02-15 15:58:06.000000000 +0000 +diff -Naur mpeg4ip.orig/lib/mp4v2/Makefile.am mpeg4ip.patched/lib/mp4v2/Makefile.am +--- mpeg4ip.orig/lib/mp4v2/Makefile.am 2005-03-10 18:31:34.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/Makefile.am 2007-03-21 17:55:46.000000000 +0000 +@@ -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 \ +@@ -45,6 +46,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.orig/lib/mp4v2/Makefile.in mpeg4ip.patched/lib/mp4v2/Makefile.in +--- mpeg4ip.orig/lib/mp4v2/Makefile.in 2005-05-18 23:03:05.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/Makefile.in 2007-03-21 17:56:20.000000000 +0000 +@@ -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.orig/lib/mp4v2/atom_gmin.cpp mpeg4ip.patched/lib/mp4v2/atom_gmin.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_gmin.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/atom_gmin.cpp 2007-03-21 14:41:32.000000000 +0000 +@@ -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 [email protected] ++ */ ++ ++#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.orig/lib/mp4v2/atom_standard.cpp mpeg4ip.patched/lib/mp4v2/atom_standard.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_standard.cpp 2004-12-14 21:35:35.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/atom_standard.cpp 2007-03-21 23:14:04.000000000 +0000 +@@ -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.orig/lib/mp4v2/atom_stsd.cpp mpeg4ip.patched/lib/mp4v2/atom_stsd.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_stsd.cpp 2004-07-13 22:07:50.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/atom_stsd.cpp 2007-03-21 17:20:24.000000000 +0000 +@@ -49,6 +49,7 @@ + ExpectChildAtom("sawb", Optional, Many); // For AMR-WB + ExpectChildAtom("s263", Optional, Many); // For H.263 + ExpectChildAtom("avc1", Optional, Many); ++ ExpectChildAtom("text", Optional, Many); + } + + void MP4StsdAtom::Read() +diff -Naur mpeg4ip.orig/lib/mp4v2/atom_text.cpp mpeg4ip.patched/lib/mp4v2/atom_text.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_text.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/atom_text.cpp 2007-03-22 00:35:53.000000000 +0000 +@@ -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 [email protected] ++ */ ++ ++#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.orig/lib/mp4v2/atom_tkhd.cpp mpeg4ip.patched/lib/mp4v2/atom_tkhd.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_tkhd.cpp 2003-11-19 23:46:11.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/atom_tkhd.cpp 2007-03-22 00:42:40.000000000 +0000 @@ -61,7 +61,8 @@ pProp->SetFixed16Format(); AddProperty(pProp); /* 8 */ @@ -21,3 +332,271 @@ diff -Naur mpeg4ip/lib/mp4v2/atom_tkhd.cpp mpeg4ip_patched/lib/mp4v2/atom_tkhd.c } void MP4TkhdAtom::Read() +diff -Naur mpeg4ip.orig/lib/mp4v2/atoms.h mpeg4ip.patched/lib/mp4v2/atoms.h +--- mpeg4ip.orig/lib/mp4v2/atoms.h 2005-03-10 18:31:34.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/atoms.h 2007-03-22 00:41:38.000000000 +0000 +@@ -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(); +diff -Naur mpeg4ip.orig/lib/mp4v2/libmp4v260.dsp mpeg4ip.patched/lib/mp4v2/libmp4v260.dsp +--- mpeg4ip.orig/lib/mp4v2/libmp4v260.dsp 2005-03-24 22:14:52.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/libmp4v260.dsp 2007-03-21 17:28:47.000000000 +0000 +@@ -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 +@@ -242,6 +246,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.orig/lib/mp4v2/libmp4v2_st60.dsp mpeg4ip.patched/lib/mp4v2/libmp4v2_st60.dsp +--- mpeg4ip.orig/lib/mp4v2/libmp4v2_st60.dsp 2005-03-24 22:14:52.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/libmp4v2_st60.dsp 2007-03-21 17:29:12.000000000 +0000 +@@ -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.orig/lib/mp4v2/mp4.cpp mpeg4ip.patched/lib/mp4v2/mp4.cpp +--- mpeg4ip.orig/lib/mp4v2/mp4.cpp 2005-03-30 19:41:58.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/mp4.cpp 2007-03-21 23:40:06.000000000 +0000 +@@ -939,6 +939,37 @@ + 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 MP4CloneTrack( + MP4FileHandle srcFile, + MP4TrackId srcTrackId, +diff -Naur mpeg4ip.orig/lib/mp4v2/mp4.h mpeg4ip.patched/lib/mp4v2/mp4.h +--- mpeg4ip.orig/lib/mp4v2/mp4.h 2005-03-30 19:41:58.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/mp4.h 2007-03-21 23:32:28.000000000 +0000 +@@ -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,14 @@ + MP4FileHandle hFile, + MP4TrackId refTrackId); + ++MP4TrackId MP4AddTextTrack( ++ MP4FileHandle hFile, ++ MP4TrackId refTrackId); ++ ++MP4TrackId MP4AddChapterTextTrack( ++ MP4FileHandle hFile, ++ MP4TrackId refTrackId); ++ + MP4TrackId MP4CloneTrack( + MP4FileHandle srcFile, + MP4TrackId srcTrackId, +diff -Naur mpeg4ip.orig/lib/mp4v2/mp4atom.cpp mpeg4ip.patched/lib/mp4v2/mp4atom.cpp +--- mpeg4ip.orig/lib/mp4v2/mp4atom.cpp 2005-03-10 18:31:34.000000000 +0000 ++++ mpeg4ip.patched/lib/mp4v2/mp4atom.cpp 2007-03-21 23:18:57.000000000 +0000 +@@ -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(); +diff -Naur mpeg4ip.orig/lib/mp4v2/mp4file.cpp mpeg4ip.patched/lib/mp4v2/mp4file.cpp +--- mpeg4ip.orig/lib/mp4v2/mp4file.cpp 2005-03-30 19:41:58.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/mp4file.cpp 2007-03-22 00:28:42.000000000 +0000 +@@ -1869,6 +1869,59 @@ + 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; ++} ++ + void MP4File::DeleteTrack(MP4TrackId trackId) + { + ProtectWriteOperation("MP4DeleteTrack"); +diff -Naur mpeg4ip.orig/lib/mp4v2/mp4file.h mpeg4ip.patched/lib/mp4v2/mp4file.h +--- mpeg4ip.orig/lib/mp4v2/mp4file.h 2005-03-30 19:41:58.000000000 +0100 ++++ mpeg4ip.patched/lib/mp4v2/mp4file.h 2007-03-21 23:33:12.000000000 +0000 +@@ -296,6 +296,8 @@ + const uint8_t *pPicture, + uint16_t pictureLen); + MP4TrackId AddHintTrack(MP4TrackId refTrackId); ++ MP4TrackId AddTextTrack(MP4TrackId refTrackId); ++ MP4TrackId AddChapterTextTrack(MP4TrackId refTrackId); + + MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId); + |