HRESULT CHdmvClipInfo::FindMainMovie(LPCTSTR strFolder, CString& strPlaylistFile, CPlaylist& MainPlaylist, CPlaylist& MPLSPlaylists) { HRESULT hr = E_FAIL; CString strPath(strFolder); MainPlaylist.RemoveAll(); MPLSPlaylists.RemoveAll(); CPlaylist Playlist; CPlaylist PlaylistArray[1024]; int idx = 0; WIN32_FIND_DATA fd = {0}; HANDLE hFind = FindFirstFile(strPath + L"\\PLAYLIST\\*.mpls", &fd); if (hFind != INVALID_HANDLE_VALUE) { REFERENCE_TIME rtMax = 0; REFERENCE_TIME rtCurrent; CString strCurrentPlaylist; do { strCurrentPlaylist = strPath + L"\\PLAYLIST\\" + fd.cFileName; Playlist.RemoveAll(); // Main movie shouldn't have duplicate M2TS filename ... if (ReadPlaylist(strCurrentPlaylist, rtCurrent, Playlist) == S_OK) { if (rtCurrent > rtMax) { rtMax = rtCurrent; strPlaylistFile = strCurrentPlaylist; MainPlaylist.RemoveAll(); POSITION pos = Playlist.GetHeadPosition(); while (pos) { CAutoPtr<PlaylistItem> Item(DNew PlaylistItem(*Playlist.GetNext(pos))); MainPlaylist.AddTail(Item); } hr = S_OK; } if (rtCurrent >= (REFERENCE_TIME)MIN_LIMIT*600000000) { // Search duplicate playlists ... bool dublicate = false; for (int i = 0; i < idx; i++) { CPlaylist* pl = &PlaylistArray[i]; if (pl->GetCount() != Playlist.GetCount()) { continue; } POSITION pos1 = Playlist.GetHeadPosition(); POSITION pos2 = pl->GetHeadPosition(); dublicate = true; while (pos1 && pos2) { PlaylistItem* pli_1 = Playlist.GetNext(pos1); PlaylistItem* pli_2 = pl->GetNext(pos2); if (*pli_1 == *pli_2) { continue; } dublicate = false; break; } if (dublicate) { break; } } if (dublicate) { continue; } CAutoPtr<PlaylistItem> Item(DNew PlaylistItem); Item->m_strFileName = strCurrentPlaylist; Item->m_rtIn = 0; Item->m_rtOut = rtCurrent; MPLSPlaylists.AddTail(Item); POSITION pos = Playlist.GetHeadPosition(); while (pos) { CAutoPtr<PlaylistItem> Item(DNew PlaylistItem(*Playlist.GetNext(pos))); PlaylistArray[idx].AddTail(Item); } idx++; } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); } if (MPLSPlaylists.GetCount() > 1) { // bubble sort for (size_t j = 0; j < MPLSPlaylists.GetCount(); j++) { for (size_t i = 0; i < MPLSPlaylists.GetCount()-1; i++) { if (MPLSPlaylists.GetAt(MPLSPlaylists.FindIndex(i))->Duration() < MPLSPlaylists.GetAt(MPLSPlaylists.FindIndex(i+1))->Duration()) { MPLSPlaylists.SwapElements(MPLSPlaylists.FindIndex(i), MPLSPlaylists.FindIndex(i+1)); } } } } return hr; }