#include #include #include #include #include #include #include #pragma comment(lib, "shlwapi.lib") SIZE GetFileDimensions(const std::wstring& name, IShellItem* pParent) { IPropertyStore* pStore = NULL; IShellItem2* pItem = NULL; __try { SIZE dims = {0, 0}; HRESULT hr = S_OK; if(FAILED(hr = SHCreateItemFromRelativeName(pParent, name.c_str(), NULL, IID_PPV_ARGS(&pItem)))) { printf("Couldn't create an item for %ls (%#x)\n", name.c_str(), hr); return dims; } if(FAILED(hr = pItem->GetPropertyStore(GPS_DEFAULT, IID_PPV_ARGS(&pStore)))) { printf("Couldn't get PropertyStore for %ls (%#x)\n", name.c_str(), hr); return dims; } PROPVARIANT propVar; if(FAILED(hr = pStore->GetValue(PKEY_Video_FrameWidth, &propVar))) { printf("Couldn't get frame width of %ls (%#x)\n", name.c_str(), hr); return dims; } dims.cx = propVar.uintVal; if(FAILED(hr = pStore->GetValue(PKEY_Video_FrameHeight, &propVar))) { printf("Couldn't get frame height of %ls (%#x)\n", name.c_str(), hr); return dims; } dims.cy = propVar.uintVal; return dims; } __finally { if(pStore) { pStore->Release(); } if(pItem) { pItem->Release(); } } } void GetAllNames(LPCWSTR filter, std::vector& names) { WIN32_FIND_DATA wfd = {0}; HANDLE hFile = FindFirstFile(filter, &wfd); std::wstring string; do { if(wcscmp(wfd.cFileName, L".") == 0 || wcscmp(wfd.cFileName, L"..") == 0) { continue; } names.push_back(wfd.cFileName); } while(FindNextFile(hFile, &wfd)); FindClose(hFile); } void ReConvert(const std::wstring& file, const SIZE& newDims, bool makeMpeg) { std::wstringstream ffmpegArgs; std::wstring mpegFile = file; std::wstring vmdFile = L".\\..\\" + file; std::wstring::size_type offset = vmdFile.find_last_of(L'.'); vmdFile.replace(offset + 1, 3, L"vmd"); offset = mpegFile.find_last_of(L'.'); mpegFile.replace(offset + 1, 3, L"mp4"); ffmpegArgs << L"-y -i " << vmdFile; if(newDims.cx && newDims.cy) { ffmpegArgs << L" -s " << newDims.cx << L'x' << newDims.cy; } ffmpegArgs << L' ' << (makeMpeg ? mpegFile : file); ShellExecute(GetConsoleWindow(), L"open", L".\\..\\ffmpeg\\ffmpeg.exe", ffmpegArgs.str().c_str(), NULL, SW_HIDE); if(makeMpeg) { DeleteFile(file.c_str()); } } void RunCorrectiveProcesses() { CoInitialize(NULL); std::vector files; GetAllNames(L"*.avi", files); IShellItem* pCurFolder = NULL; LPCWSTR pCurDir = _wgetcwd(NULL, 0); HRESULT hr = SHCreateItemFromParsingName(pCurDir, NULL, IID_PPV_ARGS(&pCurFolder)); if(FAILED(hr)) { printf("Couldn't get item for current dir %ls (%#x)\n", pCurDir, hr); } free((void*)pCurDir); for(int i = 0; i < 2; ++i) { for(std::vector::iterator iter = files.begin(), end = files.end(); iter != end; ++iter ) { WIN32_FIND_DATA wfd = {0}; GetFileAttributesEx(iter->c_str(), GetFileExInfoStandard, &wfd); bool hasChanged = false; SIZE size = {0}; if(wfd.nFileSizeLow) { size = GetFileDimensions(*iter, pCurFolder); if(size.cx % 8) { size.cx += (8 - (size.cx % 8)); hasChanged = true; } if(size.cy % 8) { size.cy += (8 - (size.cy % 8)); hasChanged = true; } } else hasChanged = true; if(hasChanged) { ReConvert(*iter, size, wfd.nFileSizeLow == 0); } } files.clear(); GetAllNames(L"*.mp4", files); } pCurFolder->Release(); CoUninitialize(); }