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);