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@
