Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/DSUtil')
-rw-r--r--src/DSUtil/HdmvClipInfo.cpp85
-rw-r--r--src/DSUtil/HdmvClipInfo.h17
2 files changed, 96 insertions, 6 deletions
diff --git a/src/DSUtil/HdmvClipInfo.cpp b/src/DSUtil/HdmvClipInfo.cpp
index b10b3a2ba..9d3a0e112 100644
--- a/src/DSUtil/HdmvClipInfo.cpp
+++ b/src/DSUtil/HdmvClipInfo.cpp
@@ -279,13 +279,15 @@ HRESULT CHdmvClipInfo::ReadPlaylist(CString strPlaylistFile, REFERENCE_TIME& rtD
DWORD dwTemp;
SHORT nPlaylistItems;
- dwPos = ReadDword();
- SetFilePointer(m_hFile, dwPos, NULL, FILE_BEGIN);
+ dwPos = ReadDword(); // PlayList_start_address
+ ReadDword(); // PlayListMark_start_address
- ReadDword();
- ReadShort();
- nPlaylistItems = ReadShort();
- ReadShort();
+ // PlayList()
+ SetFilePointer(m_hFile, dwPos, NULL, FILE_BEGIN);
+ ReadDword(); // length
+ ReadShort(); // reserved_for_future_use
+ nPlaylistItems = ReadShort(); // number_of_PlayItems
+ ReadShort(); // number_of_SubPaths
dwPos += 10;
for (size_t i=0; i<nPlaylistItems; i++) {
@@ -324,6 +326,77 @@ HRESULT CHdmvClipInfo::ReadPlaylist(CString strPlaylistFile, REFERENCE_TIME& rtD
return AmHresultFromWin32(GetLastError());
}
+HRESULT CHdmvClipInfo::ReadChapters(CString strPlaylistFile, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<PlaylistChapter>& Chapters)
+{
+ BYTE Buff[100];
+ CPath Path (strPlaylistFile);
+ bool bDuplicate = false;
+
+ // Get BDMV folder
+ Path.RemoveFileSpec();
+ Path.RemoveFileSpec();
+
+ m_hFile = CreateFile(strPlaylistFile, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_READONLY|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+
+ if(m_hFile != INVALID_HANDLE_VALUE)
+ {
+ REFERENCE_TIME* rtOffset = new REFERENCE_TIME[PlaylistItems.GetCount()];
+ REFERENCE_TIME rtSum = 0;
+ int nIndex = 0;
+
+ POSITION pos = PlaylistItems.GetHeadPosition();
+ while(pos)
+ {
+ CHdmvClipInfo::PlaylistItem& PI = PlaylistItems.GetNext(pos);
+
+ rtOffset[nIndex] = rtSum - PI.m_rtIn;
+ rtSum = rtSum + PI.Duration();
+ nIndex++;
+ }
+
+ ReadBuffer(Buff, 4);
+ if (memcmp (Buff, "MPLS", 4)) return CloseFile(VFW_E_INVALID_FILE_FORMAT);
+
+ ReadBuffer(Buff, 4);
+ if ((memcmp (Buff, "0200", 4)!=0) && (memcmp (Buff, "0100", 4)!=0)) return CloseFile(VFW_E_INVALID_FILE_FORMAT);
+
+ DWORD dwPos;
+ DWORD dwTemp;
+ SHORT nMarkCount;
+
+ ReadDword(); // PlayList_start_address
+ dwPos = ReadDword(); // PlayListMark_start_address
+
+ // PlayListMark()
+ SetFilePointer(m_hFile, dwPos, NULL, FILE_BEGIN);
+ ReadDword(); // length
+ nMarkCount = ReadShort(); // number_of_PlayList_marks
+ for (size_t i=0; i<nMarkCount; i++)
+ {
+ PlaylistChapter Chapter;
+
+ ReadByte(); // reserved_for_future_use
+ Chapter.m_nMarkType = (PlaylistMarkType)ReadByte(); // mark_type
+ Chapter.m_nPlayItemId = ReadShort(); // ref_to_PlayItem_id
+ Chapter.m_rtTimestamp = 20000i64*ReadDword()/90 + rtOffset[Chapter.m_nPlayItemId]; // mark_time_stamp
+ Chapter.m_nEntryPID = ReadShort(); // entry_ES_PID
+ Chapter.m_rtDuration = 20000i64*ReadDword()/90; // duration
+
+ Chapters.AddTail (Chapter);
+
+ // TRACE ("Chapter %d : %S\n", i, ReftimeToString (Chapter.m_rtTimestamp));
+ }
+
+ CloseFile (S_OK);
+ SAFE_DELETE_ARRAY(rtOffset);
+ return bDuplicate ? S_FALSE : S_OK;
+ }
+
+ return AmHresultFromWin32(GetLastError());
+}
+
+
HRESULT CHdmvClipInfo::FindMainMovie(LPCTSTR strFolder, CString& strPlaylistFile, CAtlList<PlaylistItem>& MainPlaylist)
{
HRESULT hr = E_FAIL;
diff --git a/src/DSUtil/HdmvClipInfo.h b/src/DSUtil/HdmvClipInfo.h
index 269a382df..5a0d732f9 100644
--- a/src/DSUtil/HdmvClipInfo.h
+++ b/src/DSUtil/HdmvClipInfo.h
@@ -118,6 +118,22 @@ public:
}
};
+ enum PlaylistMarkType
+ {
+ Reserved = 0x00,
+ EntryMark = 0x01,
+ LinkPoint = 0x02
+ };
+
+ struct PlaylistChapter
+ {
+ SHORT m_nPlayItemId;
+ PlaylistMarkType m_nMarkType;
+ REFERENCE_TIME m_rtTimestamp;
+ SHORT m_nEntryPID;
+ REFERENCE_TIME m_rtDuration;
+ };
+
CHdmvClipInfo(void);
~CHdmvClipInfo();
@@ -135,6 +151,7 @@ public:
HRESULT FindMainMovie(LPCTSTR strFolder, CString& strPlaylistFile, CAtlList<PlaylistItem>& MainPlaylist);
HRESULT ReadPlaylist(CString strPlaylistFile, REFERENCE_TIME& rtDuration, CAtlList<PlaylistItem>& Playlist);
+ HRESULT ReadChapters(CString strPlaylistFile, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<PlaylistChapter>& Chapters);
private :
DWORD SequenceInfo_start_address;