diff -Naur mp4v2-trunk-r355/include/mp4v2/general.h mp4v2-trunk-r355/include/mp4v2/general.h
--- mp4v2-trunk-r355/include/mp4v2/general.h	2009-05-23 06:09:58.000000000 -0700
+++ mp4v2-trunk-r355/include/mp4v2/general.h	2010-05-23 14:22:21.949288657 -0700
@@ -75,6 +75,7 @@
 #define MP4_CNTL_TRACK_TYPE     "cntl"  /**< Constant: control track. */
 #define MP4_TEXT_TRACK_TYPE     "text"  /**< Constant: text track. */
 #define MP4_SUBTITLE_TRACK_TYPE "sbtl"  /**< Constant: subtitle track. */
+#define MP4_SUBPIC_TRACK_TYPE   "subp"  /**< Constant: subtitle track. */
 /*
  * This second set of track types should be created
  * via MP4AddSystemsTrack(type)
diff -Naur mp4v2-trunk-r355/include/mp4v2/track.h mp4v2-trunk-r355/include/mp4v2/track.h
--- mp4v2-trunk-r355/include/mp4v2/track.h	2009-05-23 06:21:49.000000000 -0700
+++ mp4v2-trunk-r355/include/mp4v2/track.h	2010-05-23 15:43:47.249286008 -0700
@@ -310,6 +310,13 @@
     uint16_t      height );
 
 MP4V2_EXPORT
+MP4TrackId MP4AddSubpicTrack(
+    MP4FileHandle hFile,
+    uint32_t      timescale,
+    uint16_t      width,
+    uint16_t      height );
+
+MP4V2_EXPORT
 MP4TrackId MP4AddPixelAspectRatio(
     MP4FileHandle hFile,
     MP4TrackId    refTrackId,
diff -Naur mp4v2-trunk-r355/src/descriptors.h mp4v2-trunk-r355/src/descriptors.h
--- mp4v2-trunk-r355/src/descriptors.h	2009-05-20 19:52:32.000000000 -0700
+++ mp4v2-trunk-r355/src/descriptors.h	2010-05-23 16:29:34.800935677 -0700
@@ -119,6 +119,7 @@
 // ES objectTypeId
 const uint8_t MP4SystemsV1ObjectType            = 0x01;
 const uint8_t MP4SystemsV2ObjectType            = 0x02;
+const uint8_t MP4SubpicObjectType               = 0xe0;
 
 // ES streamType
 const uint8_t MP4ObjectDescriptionStreamType    = 0x01;
@@ -131,6 +132,7 @@
 const uint8_t MP4OCIStreamType                  = 0x08;
 const uint8_t MP4MPEGJStreamType                = 0x09;
 const uint8_t MP4UserPrivateStreamType          = 0x20;
+const uint8_t MP4NeroSubpicStreamType           = 0x38;
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff -Naur mp4v2-trunk-r355/src/mp4.cpp mp4v2-trunk-r355/src/mp4.cpp
--- mp4v2-trunk-r355/src/mp4.cpp	2009-05-23 06:29:37.000000000 -0700
+++ mp4v2-trunk-r355/src/mp4.cpp	2010-05-23 15:45:28.852222074 -0700
@@ -1174,6 +1174,23 @@
         return MP4_INVALID_TRACK_ID;
     }
 
+    MP4TrackId MP4AddSubpicTrack(MP4FileHandle hFile,
+                                   uint32_t timescale,
+                                   uint16_t width,
+                                   uint16_t height)
+    {
+        if (MP4_IS_VALID_FILE_HANDLE(hFile)) {
+            try {
+                return ((MP4File*)hFile)->AddSubpicTrack(timescale, width, height);
+            }
+            catch (MP4Error* e) {
+                PRINT_ERROR(e);
+                delete e;
+            }
+        }
+        return MP4_INVALID_TRACK_ID;
+    }
+
     MP4TrackId MP4AddChapterTextTrack(
         MP4FileHandle hFile, MP4TrackId refTrackId, uint32_t timescale)
     {
diff -Naur mp4v2-trunk-r355/src/mp4file.cpp mp4v2-trunk-r355/src/mp4file.cpp
--- mp4v2-trunk-r355/src/mp4file.cpp	2009-05-26 19:34:56.000000000 -0700
+++ mp4v2-trunk-r355/src/mp4file.cpp	2010-05-23 16:32:52.654220633 -0700
@@ -2095,6 +2095,50 @@
     return trackId;
 }
 
+MP4TrackId MP4File::AddSubpicTrack(uint32_t timescale,
+                                     uint16_t width,
+                                     uint16_t height)
+{
+    MP4TrackId trackId =
+        AddTrack(MP4_SUBPIC_TRACK_TYPE, timescale);
+
+    InsertChildAtom(MakeTrackName(trackId, "mdia.minf"), "nmhd", 0);
+
+    (void)AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "mp4s");
+
+    SetTrackFloatProperty(trackId, "tkhd.width", width);
+    SetTrackFloatProperty(trackId, "tkhd.height", height);
+    SetTrackIntegerProperty(trackId, "tkhd.layer", 0);
+
+    // 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 mp4s atom
+    MP4Integer32Property* pStsdCountProperty;
+    FindIntegerProperty(
+        MakeTrackName(trackId, "mdia.minf.stbl.stsd.entryCount"),
+        (MP4Property**)&pStsdCountProperty);
+    pStsdCountProperty->IncrementValue();
+
+    SetTrackIntegerProperty(trackId,
+                            "mdia.minf.stbl.stsd.mp4s.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.mp4s.esds.decConfigDescr.objectTypeId",
+                            MP4SubpicObjectType);
+
+    SetTrackIntegerProperty(trackId,
+                            "mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr.streamType",
+                            MP4NeroSubpicStreamType);
+    return trackId;
+}
+
 MP4TrackId MP4File::AddChapterTextTrack(MP4TrackId refTrackId, uint32_t timescale)
 {
     // validate reference track id
diff -Naur mp4v2-trunk-r355/src/mp4file.h mp4v2-trunk-r355/src/mp4file.h
--- mp4v2-trunk-r355/src/mp4file.h	2009-05-23 06:29:37.000000000 -0700
+++ mp4v2-trunk-r355/src/mp4file.h	2010-05-23 15:44:57.568026299 -0700
@@ -388,6 +388,10 @@
                                 uint16_t width,
                                 uint16_t height);
 
+    MP4TrackId AddSubpicTrack(uint32_t timescale,
+                                uint16_t width,
+                                uint16_t height);
+
     MP4TrackId AddPixelAspectRatio(MP4TrackId trackId, uint32_t hSpacing, uint32_t vSpacing);
     MP4TrackId AddColr(MP4TrackId trackId, uint16_t pri, uint16_t tran, uint16_t mat);
 
