diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/Makefile.am mpeg4ip/lib/mp4v2/Makefile.am
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/Makefile.am	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/Makefile.am	2008-06-17 16:21:54.000000000 -0700
@@ -14,6 +14,7 @@
 	atom_amr.cpp \
 	atom_avc1.cpp \
 	atom_avcC.cpp \
+	atom_colr.cpp \
 	atom_d263.cpp \
 	atom_damr.cpp \
 	atom_dref.cpp \
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/Makefile.in mpeg4ip/lib/mp4v2/Makefile.in
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/Makefile.in	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/Makefile.in	2008-06-17 16:21:54.000000000 -0700
@@ -53,7 +53,7 @@
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libmp4v2_la_LIBADD =
 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_colr.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_ac3.lo \
 	atom_hdlr.lo atom_hinf.lo atom_hnti.lo atom_href.lo \
@@ -76,6 +76,7 @@
 @AMDEP_TRUE@	./$(DEPDIR)/atom_ac3.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/atom_avc1.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/atom_avcC.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/atom_colr.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/atom_d263.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/atom_damr.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/atom_dref.Plo \
@@ -347,6 +348,7 @@
 	atom_amr.cpp \
 	atom_avc1.cpp \
 	atom_avcC.cpp \
+	atom_colr.cpp \
 	atom_d263.cpp \
 	atom_damr.cpp \
 	atom_dref.cpp \
@@ -503,6 +505,7 @@
 @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@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_colr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_d263.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_damr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom_dref.Plo@am__quote@
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/atom_colr.cpp mpeg4ip/lib/mp4v2/atom_colr.cpp
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/atom_colr.cpp	1969-12-31 16:00:00.000000000 -0800
+++ mpeg4ip/lib/mp4v2/atom_colr.cpp	2008-06-18 13:51:37.000000000 -0700
@@ -0,0 +1,45 @@
+/*
+ * 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"
+
+MP4ColrAtom::MP4ColrAtom() 
+	: MP4Atom("colr") 
+{
+    MP4StringProperty* cpt = new MP4StringProperty("colorParameterType");
+    cpt->SetFixedLength(4);
+    AddProperty(cpt); /* 0 */
+
+	AddProperty( /* 1 */ new MP4Integer16Property("primariesIndex"));
+
+	AddProperty( /* 2 */ new MP4Integer16Property("transferFunctionIndex")); 
+
+	AddProperty( /* 3 */ new MP4Integer16Property("matrixIndex")); 
+}
+
+void MP4ColrAtom::Generate()
+{
+	MP4Atom::Generate();
+
+	((MP4StringProperty*)m_pProperties[0])->SetValue("nclc");
+    // default to ITU BT.709 values
+	((MP4Integer16Property*)m_pProperties[1])->SetValue(1);
+	((MP4Integer16Property*)m_pProperties[2])->SetValue(1);
+	((MP4Integer16Property*)m_pProperties[3])->SetValue(1);
+}
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/atom_stsd.cpp mpeg4ip/lib/mp4v2/atom_stsd.cpp
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/atom_stsd.cpp	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/atom_stsd.cpp	2008-06-17 16:21:54.000000000 -0700
@@ -52,6 +52,7 @@
 	ExpectChildAtom("text", Optional, Many);
 	ExpectChildAtom("pasp", Optional, Many);
 	ExpectChildAtom("ac-3", Optional, Many);
+	ExpectChildAtom("colr", Optional, Many);
 }
 
 void MP4StsdAtom::Read() 
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/atoms.h mpeg4ip/lib/mp4v2/atoms.h
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/atoms.h	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/atoms.h	2008-06-17 16:21:54.000000000 -0700
@@ -406,4 +406,10 @@
     void Generate();
 };
 
+class MP4ColrAtom : public MP4Atom {
+ public:
+    MP4ColrAtom();
+    void Generate();
+};
+
 #endif /* __MP4_ATOMS_INCLUDED__ */
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4.cpp mpeg4ip/lib/mp4v2/mp4.cpp
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4.cpp	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/mp4.cpp	2008-06-17 16:21:54.000000000 -0700
@@ -1003,6 +1003,21 @@
 	return MP4_INVALID_TRACK_ID;
 }
 
+extern "C" MP4TrackId MP4AddColr(
+	MP4FileHandle hFile, MP4TrackId refTrackId, u_int16_t pri, u_int16_t tran, u_int16_t mat)
+{
+	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {
+		try {
+			return ((MP4File*)hFile)->AddColr(refTrackId, pri, tran, mat);
+		}
+		catch (MP4Error* e) {
+			PRINT_ERROR(e);
+			delete e;
+		}
+	}
+	return MP4_INVALID_TRACK_ID;
+}
+
 
 extern "C" MP4TrackId MP4CloneTrack(
 	MP4FileHandle srcFile, 
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4.h mpeg4ip/lib/mp4v2/mp4.h
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4.h	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/mp4.h	2008-06-18 14:03:17.000000000 -0700
@@ -559,6 +559,13 @@
     u_int32_t hSpacing,
     u_int32_t vSpacing);
 
+MP4TrackId MP4AddColr(
+	MP4FileHandle hFile, 
+	MP4TrackId refTrackId,
+    u_int16_t primary,
+    u_int16_t transfer,
+    u_int16_t matrix);
+
 MP4TrackId MP4CloneTrack(
 	MP4FileHandle srcFile, 
 	MP4TrackId srcTrackId,
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4atom.cpp mpeg4ip/lib/mp4v2/mp4atom.cpp
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4atom.cpp	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/mp4atom.cpp	2008-06-17 16:21:54.000000000 -0700
@@ -90,6 +90,8 @@
     case 'c':
       if (ATOMID(type) == ATOMID("chap")) {
 	pAtom = new MP4TrefTypeAtom(type);
+      } else if (ATOMID(type) == ATOMID("colr")) {
+	pAtom = new MP4ColrAtom();
 	  }
 	  break;
 
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4file.cpp mpeg4ip/lib/mp4v2/mp4file.cpp
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4file.cpp	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/mp4file.cpp	2008-06-17 16:21:54.000000000 -0700
@@ -2000,6 +2000,33 @@
 	return trackId;
 }
 
+MP4TrackId MP4File::AddColr(MP4TrackId trackId,
+                            u_int16_t primariesIndex,
+                            u_int16_t transferFunctionIndex,
+                            u_int16_t matrixIndex)
+{
+	// validate reference track id
+  (void)FindTrackIndex(trackId);
+    const char *format = GetTrackMediaDataName (trackId);
+    
+    if (!strcasecmp(format, "avc1"))
+    {
+        AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd.avc1"), "colr");
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.avc1.colr.primariesIndex", primariesIndex);
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.avc1.colr.transferFunctionIndex", transferFunctionIndex);
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.avc1.colr.matrixIndex", matrixIndex);
+    }
+    else if (!strcasecmp(format, "mp4v"))
+    {
+        AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd.mp4v"), "colr");
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.mp4v.colr.primariesIndex", primariesIndex);
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.mp4v.colr.transferFunctionIndex", transferFunctionIndex);
+        SetTrackIntegerProperty(trackId, "mdia.minf.stbl.stsd.mp4v.colr.matrixIndex", matrixIndex);
+    }
+
+	return trackId;
+}
+
 void MP4File::DeleteTrack(MP4TrackId trackId)
 {
 	ProtectWriteOperation("MP4DeleteTrack");
diff -Nur -x Makefile -x config.log -x config.status -x libtool -x '*.Plo' -x '*.lo' ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4file.h mpeg4ip/lib/mp4v2/mp4file.h
--- ../handbrake/contrib/mpeg4ip/lib/mp4v2/mp4file.h	2008-06-13 11:22:55.000000000 -0700
+++ mpeg4ip/lib/mp4v2/mp4file.h	2008-06-17 16:21:54.000000000 -0700
@@ -305,6 +305,7 @@
 	MP4TrackId AddChapterTextTrack(MP4TrackId refTrackId);
 
 	MP4TrackId AddPixelAspectRatio(MP4TrackId trackId, u_int32_t hSpacing, u_int32_t vSpacing);
+	MP4TrackId AddColr(MP4TrackId trackId, u_int16_t pri, u_int16_t tran, u_int16_t mat);
 
 	MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId);
 
