/* * (C) 2008-2013 see Authors.txt * * This file is part of MPC-HC. * * MPC-HC is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * MPC-HC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #pragma once #include "Mpeg2Def.h" enum BDVM_VideoFormat { BDVM_VideoFormat_Unknown = 0, BDVM_VideoFormat_480i = 1, BDVM_VideoFormat_576i = 2, BDVM_VideoFormat_480p = 3, BDVM_VideoFormat_1080i = 4, BDVM_VideoFormat_720p = 5, BDVM_VideoFormat_1080p = 6, BDVM_VideoFormat_576p = 7 }; enum BDVM_FrameRate { BDVM_FrameRate_Unknown = 0, BDVM_FrameRate_23_976 = 1, BDVM_FrameRate_24 = 2, BDVM_FrameRate_25 = 3, BDVM_FrameRate_29_97 = 4, BDVM_FrameRate_50 = 6, BDVM_FrameRate_59_94 = 7 }; enum BDVM_AspectRatio { BDVM_AspectRatio_Unknown = 0, BDVM_AspectRatio_4_3 = 2, BDVM_AspectRatio_16_9 = 3, BDVM_AspectRatio_2_21 = 4 }; enum BDVM_ChannelLayout { BDVM_ChannelLayout_Unknown = 0, BDVM_ChannelLayout_MONO = 1, BDVM_ChannelLayout_STEREO = 3, BDVM_ChannelLayout_MULTI = 6, BDVM_ChannelLayout_COMBO = 12 }; enum BDVM_SampleRate { BDVM_SampleRate_Unknown = 0, BDVM_SampleRate_48 = 1, BDVM_SampleRate_96 = 4, BDVM_SampleRate_192 = 5, BDVM_SampleRate_48_192 = 12, BDVM_SampleRate_48_96 = 14 }; class CHdmvClipInfo { public: struct Stream { Stream() { ZeroMemory(this, sizeof(*this)); } short m_PID; PES_STREAM_TYPE m_Type; char m_LanguageCode[4]; LCID m_LCID; // Valid for video types BDVM_VideoFormat m_VideoFormat; BDVM_FrameRate m_FrameRate; BDVM_AspectRatio m_AspectRatio; // Valid for audio types BDVM_ChannelLayout m_ChannelLayout; BDVM_SampleRate m_SampleRate; LPCTSTR Format(); }; struct PlaylistItem { CString m_strFileName; REFERENCE_TIME m_rtIn; REFERENCE_TIME m_rtOut; REFERENCE_TIME Duration() const { return m_rtOut - m_rtIn; } bool operator == (const PlaylistItem& pi) const { return pi.m_strFileName == m_strFileName; } }; 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(); ~CHdmvClipInfo(); HRESULT ReadInfo(LPCTSTR strFile); Stream* FindStream(short wPID); bool IsHdmv() const { return m_bIsHdmv; }; size_t GetStreamNumber() { return m_Streams.GetCount(); }; Stream* GetStreamByIndex(size_t nIndex) { return (nIndex < m_Streams.GetCount()) ? &m_Streams[nIndex] : nullptr; }; HRESULT FindMainMovie(LPCTSTR strFolder, CString& strPlaylistFile, CAtlList& MainPlaylist, CAtlList& MPLSPlaylists); HRESULT ReadPlaylist(CString strPlaylistFile, REFERENCE_TIME& rtDuration, CAtlList& Playlist); HRESULT ReadChapters(CString strPlaylistFile, CAtlList& PlaylistItems, CAtlList& Chapters); private: DWORD SequenceInfo_start_address; DWORD ProgramInfo_start_address; HANDLE m_hFile; CAtlArray m_Streams; bool m_bIsHdmv; DWORD ReadDword(); short ReadShort(); BYTE ReadByte(); void ReadBuffer(BYTE* pBuff, DWORD nLen); HRESULT ReadProgramInfo(); HRESULT CloseFile(HRESULT hr); };