diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index 12be9867a2..fbcdba24fd 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -558,9 +558,11 @@ CVAPI(int) cvGetCaptureDomain( CvCapture* capture); /* "black box" video file writer structure */ typedef struct CvVideoWriter CvVideoWriter; +#define CV_FOURCC_MACRO(c1, c2, c3, c4) ((c1 & 255) + ((c2 & 255) << 8) + ((c3 & 255) << 16) + ((c4 & 255) << 24)) + CV_INLINE int CV_FOURCC(char c1, char c2, char c3, char c4) { - return (c1 & 255) + ((c2 & 255) << 8) + ((c3 & 255) << 16) + ((c4 & 255) << 24); + return CV_FOURCC_MACRO(c1, c2, c3, c4); } #define CV_FOURCC_PROMPT -1 /* Open Codec Selection Dialog (Windows only) */ diff --git a/modules/highgui/src/cap.cpp b/modules/highgui/src/cap.cpp index 8db8731020..cc92da3d0c 100644 --- a/modules/highgui/src/cap.cpp +++ b/modules/highgui/src/cap.cpp @@ -199,15 +199,6 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) switch (domains[i]) { -#ifdef HAVE_MSMF - case CV_CAP_MSMF: - printf("Creating Media foundation capture\n"); - capture = cvCreateCameraCapture_MSMF (index); - printf("Capture address %p\n", capture); - if (capture) - return capture; - break; -#endif #ifdef HAVE_DSHOW case CV_CAP_DSHOW: capture = cvCreateCameraCapture_DShow (index); @@ -215,7 +206,13 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) return capture; break; #endif - +#ifdef HAVE_MSMF + case CV_CAP_MSMF: + capture = cvCreateCameraCapture_MSMF (index); + if (capture) + return capture; + break; +#endif #ifdef HAVE_TYZX case CV_CAP_STEREO: capture = cvCreateCameraCapture_TYZX (index); @@ -223,14 +220,12 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) return capture; break; #endif - - case CV_CAP_VFW: #ifdef HAVE_VFW + case CV_CAP_VFW: capture = cvCreateCameraCapture_VFW (index); if (capture) return capture; #endif - #if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO capture = cvCreateCameraCapture_V4L (index); if (capture) @@ -363,20 +358,16 @@ CV_IMPL CvCapture * cvCreateFileCapture (const char * filename) if (! result) result = cvCreateFileCapture_FFMPEG_proxy (filename); -#ifdef HAVE_MSMF - if (! result) - { - printf("Creating Media foundation based reader\n"); - result = cvCreateFileCapture_MSMF (filename); - printf("Construction result %p\n", result); - } -#endif - #ifdef HAVE_VFW if (! result) result = cvCreateFileCapture_VFW (filename); #endif +#ifdef HAVE_MSMF + if (! result) + result = cvCreateFileCapture_MSMF (filename); +#endif + #ifdef HAVE_XINE if (! result) result = cvCreateFileCapture_XINE (filename); @@ -422,14 +413,12 @@ CV_IMPL CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, if(!fourcc || !fps) result = cvCreateVideoWriter_Images(filename); -#ifdef HAVE_FFMPEG if(!result) result = cvCreateVideoWriter_FFMPEG_proxy (filename, fourcc, fps, frameSize, is_color); -#endif #ifdef HAVE_VFW if(!result) - return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color); + result = cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color); #endif #ifdef HAVE_MSMF diff --git a/modules/highgui/src/cap_msmf.cpp b/modules/highgui/src/cap_msmf.cpp index 814fb75beb..7af85382b7 100644 --- a/modules/highgui/src/cap_msmf.cpp +++ b/modules/highgui/src/cap_msmf.cpp @@ -840,9 +840,11 @@ LPCWSTR GetGUIDNameConstNew(const GUID& guid) IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); // WAVE_FORMAT_MPEG_ADTS_AAC return NULL; } + FormatReader::FormatReader(void) { } + MediaType FormatReader::Read(IMFMediaType *pType) { UINT32 count = 0; @@ -888,9 +890,9 @@ ImageGrabber::ImageGrabber(unsigned int deviceID, bool synchronous): ig_RIE(true), ig_Close(false), ig_Synchronous(synchronous), - ig_hFrameReady(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFrameReady"): 0), - ig_hFrameGrabbed(synchronous ? CreateEvent(NULL, FALSE, TRUE, "ig_hFrameGrabbed"): 0), - ig_hFinish(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFinish") : 0) + ig_hFrameReady(synchronous ? CreateEvent(NULL, FALSE, FALSE, NULL): 0), + ig_hFrameGrabbed(synchronous ? CreateEvent(NULL, FALSE, TRUE, NULL): 0), + ig_hFinish(CreateEvent(NULL, TRUE, FALSE, NULL)) {} ImageGrabber::~ImageGrabber(void) @@ -898,15 +900,16 @@ ImageGrabber::~ImageGrabber(void) printf("ImageGrabber::~ImageGrabber()\n"); if (ig_pSession) { - printf("ig_pSession->Shutdown()"); + printf("ig_pSession->Shutdown()\n"); ig_pSession->Shutdown(); } + CloseHandle(ig_hFinish); + if (ig_Synchronous) { CloseHandle(ig_hFrameReady); CloseHandle(ig_hFrameGrabbed); - CloseHandle(ig_hFinish); } SafeRelease(&ig_pSession); @@ -1061,7 +1064,6 @@ HRESULT ImageGrabber::startGrabbing(void) hr = S_OK; goto done; } - printf("media foundation event: %d\n", met); if (met == MESessionEnded) { DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: MESessionEnded \n", ig_DeviceID); @@ -1088,13 +1090,7 @@ HRESULT ImageGrabber::startGrabbing(void) DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing \n", ig_DeviceID); done: - if (ig_Synchronous) - { - SetEvent(ig_hFinish); - } - - SafeRelease(&ig_pSession); - SafeRelease(&ig_pTopology); + SetEvent(ig_hFinish); return hr; } @@ -1109,7 +1105,7 @@ void ImageGrabber::resumeGrabbing() HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo) { - ComPtr pTopology = NULL; + IMFTopology* pTopology = NULL; ComPtr pPD = NULL; ComPtr pSD = NULL; ComPtr pHandler = NULL; @@ -1117,7 +1113,7 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink ComPtr pNode2 = NULL; HRESULT hr = S_OK; DWORD cStreams = 0; - CHECK_HR(hr = MFCreateTopology(pTopology.GetAddressOf())); + CHECK_HR(hr = MFCreateTopology(&pTopology)); CHECK_HR(hr = pSource->CreatePresentationDescriptor(pPD.GetAddressOf())); CHECK_HR(hr = pPD->GetStreamDescriptorCount(&cStreams)); for (DWORD i = 0; i < cStreams; i++) @@ -1130,8 +1126,8 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink CHECK_HR(hr = pHandler->GetMajorType(&majorType)); if (majorType == MFMediaType_Video && fSelected) { - CHECK_HR(hr = AddSourceNode(pTopology.Get(), pSource, pPD.Get(), pSD.Get(), pNode1.GetAddressOf())); - CHECK_HR(hr = AddOutputNode(pTopology.Get(), pSinkActivate, 0, pNode2.GetAddressOf())); + CHECK_HR(hr = AddSourceNode(pTopology, pSource, pPD.Get(), pSD.Get(), pNode1.GetAddressOf())); + CHECK_HR(hr = AddOutputNode(pTopology, pSinkActivate, 0, pNode2.GetAddressOf())); CHECK_HR(hr = pNode1->ConnectOutput(0, pNode2.Get(), 0)); break; } @@ -1140,7 +1136,7 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink CHECK_HR(hr = pPD->DeselectStream(i)); } } - *ppTopo = pTopology.Get(); + *ppTopo = pTopology; (*ppTopo)->AddRef(); done: @@ -1286,9 +1282,15 @@ STDMETHODIMP ImageGrabber::OnProcessSample(REFGUID guidMajorMediaType, DWORD dwS (void)llSampleDuration; (void)dwSampleSize; - WaitForSingleObject(ig_hFrameGrabbed, INFINITE); + //printf("ImageGrabber::OnProcessSample() -- begin\n"); + HANDLE tmp[] = {ig_hFinish, ig_hFrameGrabbed, NULL}; - printf("ImageGrabber::OnProcessSample() -- begin\n"); + DWORD status = WaitForMultipleObjects(2, tmp, FALSE, INFINITE); + if (status == WAIT_OBJECT_0) + { + printf("OnProcessFrame called after ig_hFinish event\n"); + return S_OK; + } if(ig_RIE) { @@ -1300,25 +1302,24 @@ STDMETHODIMP ImageGrabber::OnProcessSample(REFGUID guidMajorMediaType, DWORD dwS ig_RISecond->fastCopy(pSampleBuffer); ig_RIOut = ig_RISecond; } - ig_RIE = !ig_RIE; - printf("ImageGrabber::OnProcessSample() -- end\n"); + //printf("ImageGrabber::OnProcessSample() -- end\n"); if (ig_Synchronous) { SetEvent(ig_hFrameReady); } + else + { + ig_RIE = !ig_RIE; + } return S_OK; } STDMETHODIMP ImageGrabber::OnShutdown() { - if (ig_Synchronous) - { - SetEvent(ig_hFrameGrabbed); - } - + SetEvent(ig_hFinish); return S_OK; } @@ -1387,6 +1388,8 @@ ImageGrabberThread::~ImageGrabberThread(void) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Destroing ImageGrabberThread\n", igt_DeviceID); + if (igt_Handle) + WaitForSingleObject(igt_Handle, INFINITE); delete igt_pImageGrabber; } @@ -1431,7 +1434,6 @@ void ImageGrabberThread::run() DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Emergency Stop thread\n", igt_DeviceID); if(igt_func) { - printf("Calling Emergency stop even handler\n"); igt_func(igt_DeviceID, igt_userData); } } @@ -3045,6 +3047,7 @@ CvCaptureFile_MSMF::CvCaptureFile_MSMF(): CvCaptureFile_MSMF::~CvCaptureFile_MSMF() { + close(); MFShutdown(); } @@ -3109,7 +3112,7 @@ void CvCaptureFile_MSMF::close() if (grabberThread) { isOpened = false; - SetEvent(grabberThread->getImageGrabber()->ig_hFrameReady); + SetEvent(grabberThread->getImageGrabber()->ig_hFinish); grabberThread->stop(); delete grabberThread; } @@ -3289,12 +3292,12 @@ bool CvCaptureFile_MSMF::grabFrame() DWORD waitResult; if (isOpened) { + SetEvent(grabberThread->getImageGrabber()->ig_hFrameGrabbed); HANDLE tmp[] = {grabberThread->getImageGrabber()->ig_hFrameReady, grabberThread->getImageGrabber()->ig_hFinish, 0}; waitResult = WaitForMultipleObjects(2, tmp, FALSE, INFINITE); - SetEvent(grabberThread->getImageGrabber()->ig_hFrameGrabbed); } - return isOpened && (waitResult == WAIT_OBJECT_0); + return isOpened && grabberThread->getImageGrabber()->getRawImage()->isNew() && (waitResult == WAIT_OBJECT_0); } IplImage* CvCaptureFile_MSMF::retrieveFrame(int) @@ -3443,7 +3446,8 @@ private: HRESULT WriteFrame(DWORD *videoFrameBuffer, const LONGLONG& rtStart, const LONGLONG& rtDuration); }; -CvVideoWriter_MSMF::CvVideoWriter_MSMF() +CvVideoWriter_MSMF::CvVideoWriter_MSMF(): + initiated(false) { } @@ -3456,47 +3460,47 @@ const GUID CvVideoWriter_MSMF::FourCC2GUID(int fourcc) { switch(fourcc) { - case 'dv25': + case CV_FOURCC_MACRO('d', 'v', '2', '5'): return MFVideoFormat_DV25; break; - case 'dv50': + case CV_FOURCC_MACRO('d', 'v', '5', '0'): return MFVideoFormat_DV50; break; - case 'dvc ': + case CV_FOURCC_MACRO('d', 'v', 'c', ' '): return MFVideoFormat_DVC; break; - case 'dvh1': + case CV_FOURCC_MACRO('d', 'v', 'h', '1'): return MFVideoFormat_DVH1; break; - case 'dvhd': + case CV_FOURCC_MACRO('d', 'v', 'h', 'd'): return MFVideoFormat_DVHD; break; - case 'dvsd': + case CV_FOURCC_MACRO('d', 'v', 's', 'd'): return MFVideoFormat_DVSD; break; - case 'dvsl': + case CV_FOURCC_MACRO('d', 'v', 's', 'l'): return MFVideoFormat_DVSL; break; - case 'H263': + case CV_FOURCC_MACRO('H', '2', '6', '3'): return MFVideoFormat_H263; break; - case 'H264': + case CV_FOURCC_MACRO('H', '2', '6', '4'): return MFVideoFormat_H264; break; - case 'M4S2': + case CV_FOURCC_MACRO('M', '4', 'S', '2'): return MFVideoFormat_M4S2; break; - case 'MJPG': + case CV_FOURCC_MACRO('M', 'J', 'P', 'G'): return MFVideoFormat_MJPG; break; - case 'MP43': + case CV_FOURCC_MACRO('M', 'P', '4', '3'): return MFVideoFormat_MP43; break; - case 'MP4S': + case CV_FOURCC_MACRO('M', 'P', '4', 'S'): return MFVideoFormat_MP4S; break; - case 'MP4V': + case CV_FOURCC_MACRO('M', 'P', '4', 'V'): return MFVideoFormat_MP4V; break; - case 'MPG1': + case CV_FOURCC_MACRO('M', 'P', 'G', '1'): return MFVideoFormat_MPG1; break; - case 'MSS1': + case CV_FOURCC_MACRO('M', 'S', 'S', '1'): return MFVideoFormat_MSS1; break; - case 'MSS2': + case CV_FOURCC_MACRO('M', 'S', 'S', '2'): return MFVideoFormat_MSS2; break; - case 'WMV1': + case CV_FOURCC_MACRO('W', 'M', 'V', '1'): return MFVideoFormat_WMV1; break; - case 'WMV2': + case CV_FOURCC_MACRO('W', 'M', 'V', '2'): return MFVideoFormat_WMV2; break; - case 'WMV3': + case CV_FOURCC_MACRO('W', 'M', 'V', '3'): return MFVideoFormat_WMV3; break; - case 'WVC1': + case CV_FOURCC_MACRO('W', 'V', 'C', '1'): return MFVideoFormat_WVC1; break; default: return MFVideoFormat_H264; @@ -3516,19 +3520,15 @@ bool CvVideoWriter_MSMF::open( const char* filename, int fourcc, HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (SUCCEEDED(hr)) { - printf("CoInitializeEx is successfull\n"); hr = MFStartup(MF_VERSION); if (SUCCEEDED(hr)) { - printf("MFStartup is successfull\n"); hr = InitializeSinkWriter(filename); if (SUCCEEDED(hr)) { - printf("InitializeSinkWriter is successfull\n"); initiated = true; rtStart = 0; MFFrameRateToAverageTimePerFrame((UINT32)fps, 1, &rtDuration); - printf("duration: %d\n", rtDuration); } } } @@ -3556,13 +3556,9 @@ bool CvVideoWriter_MSMF::writeFrame(const IplImage* img) if (!img) return false; - printf("Writing not empty IplImage\n"); - int length = img->width * img->height * 4; - printf("Image: %dx%d, %d\n", img->width, img->height, length); DWORD* target = new DWORD[length]; - printf("Before for loop\n"); for (int rowIdx = 0; rowIdx < img->height; rowIdx++) { char* rowStart = img->imageData + rowIdx*img->widthStep; @@ -3577,9 +3573,7 @@ bool CvVideoWriter_MSMF::writeFrame(const IplImage* img) } // Send frame to the sink writer. - printf("Before private WriteFrame call\n"); HRESULT hr = WriteFrame(target, rtStart, rtDuration); - printf("After private WriteFrame call\n"); if (FAILED(hr)) { printf("Private WriteFrame failed\n"); @@ -3588,8 +3582,6 @@ bool CvVideoWriter_MSMF::writeFrame(const IplImage* img) } rtStart += rtDuration; - printf("End of writing IplImage\n"); - delete[] target; return true; @@ -3681,7 +3673,8 @@ HRESULT CvVideoWriter_MSMF::InitializeSinkWriter(const char* filename) { hr = MFSetAttributeRatio(mediaTypeIn.Get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1); } - if (SUCCEEDED(hr)) + + if (SUCCEEDED(hr)) { hr = sinkWriter->SetInputMediaType(streamIndex, mediaTypeIn.Get(), NULL); } @@ -3697,7 +3690,6 @@ HRESULT CvVideoWriter_MSMF::InitializeSinkWriter(const char* filename) HRESULT CvVideoWriter_MSMF::WriteFrame(DWORD *videoFrameBuffer, const LONGLONG& Start, const LONGLONG& Duration) { - printf("Private WriteFrame(%p, %llu, %llu)\n", videoFrameBuffer, Start, Duration); ComPtr sample; ComPtr buffer; @@ -3712,13 +3704,11 @@ HRESULT CvVideoWriter_MSMF::WriteFrame(DWORD *videoFrameBuffer, const LONGLONG& // Lock the buffer and copy the video frame to the buffer. if (SUCCEEDED(hr)) { - printf("MFCreateMemoryBuffer successfull\n"); hr = buffer->Lock(&pData, NULL, NULL); } if (SUCCEEDED(hr)) { - printf("Before MFCopyImage(%p, %d, %p, %d, %d %d)\n", pData, cbWidth, videoFrameBuffer, cbWidth, cbWidth, videoHeight); hr = MFCopyImage( pData, // Destination buffer. cbWidth, // Destination stride. @@ -3727,21 +3717,16 @@ HRESULT CvVideoWriter_MSMF::WriteFrame(DWORD *videoFrameBuffer, const LONGLONG& cbWidth, // Image width in bytes. videoHeight // Image height in pixels. ); - printf("After MFCopyImage()\n"); } - printf("Before buffer.Get()\n"); if (buffer) { - printf("Before buffer->Unlock\n"); buffer->Unlock(); - printf("After buffer->Unlock\n"); } // Set the data length of the buffer. if (SUCCEEDED(hr)) { - printf("MFCopyImage successfull\n"); hr = buffer->SetCurrentLength(cbBuffer); } @@ -3758,24 +3743,19 @@ HRESULT CvVideoWriter_MSMF::WriteFrame(DWORD *videoFrameBuffer, const LONGLONG& // Set the time stamp and the duration. if (SUCCEEDED(hr)) { - printf("Sample time: %d\n", Start); hr = sample->SetSampleTime(Start); } if (SUCCEEDED(hr)) { - printf("Duration: %d\n", Duration); hr = sample->SetSampleDuration(Duration); } // Send the sample to the Sink Writer. if (SUCCEEDED(hr)) { - printf("Setting writer params successfull\n"); hr = sinkWriter->WriteSample(streamIndex, sample.Get()); } - printf("Private WriteFrame(%d, %p) end with status %u\n", streamIndex, sample.Get(), hr); - return hr; } diff --git a/modules/highgui/src/cap_vfw.cpp b/modules/highgui/src/cap_vfw.cpp index d419a48912..d845953f8e 100644 --- a/modules/highgui/src/cap_vfw.cpp +++ b/modules/highgui/src/cap_vfw.cpp @@ -613,8 +613,10 @@ bool CvVideoWriter_VFW::open( const char* filename, int _fourcc, double _fps, Cv close(); return false; } + return true; } - return true; + else + return false; } diff --git a/modules/highgui/test/test_video_io.cpp b/modules/highgui/test/test_video_io.cpp index 34ec0bdd80..f46235b3e9 100644 --- a/modules/highgui/test/test_video_io.cpp +++ b/modules/highgui/test/test_video_io.cpp @@ -57,27 +57,27 @@ string fourccToString(int fourcc) #ifdef HAVE_MSMF const VideoFormat g_specific_fmt_list[] = { -/* VideoFormat("avi", 'dv25'), - VideoFormat("avi", 'dv50'), - VideoFormat("avi", 'dvc '), - VideoFormat("avi", 'dvh1'), - VideoFormat("avi", 'dvhd'), - VideoFormat("avi", 'dvsd'), - VideoFormat("avi", 'dvsl'), - VideoFormat("avi", 'M4S2'), */ - VideoFormat("wmv", 'WMV3'), - // VideoFormat("avi", 'H264'), - // VideoFormat("avi", 'MJPG'), - // VideoFormat("avi", 'MP43'), - // VideoFormat("avi", 'MP4S'), - // VideoFormat("avi", 'MP4V'), -/* VideoFormat("avi", 'MPG1'), - VideoFormat("avi", 'MSS1'), - VideoFormat("avi", 'MSS2'), - VideoFormat("avi", 'WMV1'), - VideoFormat("avi", 'WMV2'), - VideoFormat("avi", 'WMV3'), - VideoFormat("avi", 'WVC1'), */ + /*VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', '2', '5')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', '5', '0')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', 'c', ' ')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', 'h', '1')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', 'h', 'd')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', 's', 'd')), + VideoFormat("wmv", CV_FOURCC_MACRO('d', 'v', 's', 'l')), + VideoFormat("wmv", CV_FOURCC_MACRO('H', '2', '6', '3')), + VideoFormat("wmv", CV_FOURCC_MACRO('M', '4', 'S', '2')), + VideoFormat("avi", CV_FOURCC_MACRO('M', 'J', 'P', 'G')), + VideoFormat("mp4", CV_FOURCC_MACRO('M', 'P', '4', 'S')), + VideoFormat("mp4", CV_FOURCC_MACRO('M', 'P', '4', 'V')), + VideoFormat("wmv", CV_FOURCC_MACRO('M', 'P', '4', '3')), + VideoFormat("wmv", CV_FOURCC_MACRO('M', 'P', 'G', '1')), + VideoFormat("wmv", CV_FOURCC_MACRO('M', 'S', 'S', '1')), + VideoFormat("wmv", CV_FOURCC_MACRO('M', 'S', 'S', '2')),*/ + //VideoFormat("avi", CV_FOURCC_MACRO('H', '2', '6', '4')), + VideoFormat("wmv", CV_FOURCC_MACRO('W', 'M', 'V', '1')), + VideoFormat("wmv", CV_FOURCC_MACRO('W', 'M', 'V', '2')), + VideoFormat("wmv", CV_FOURCC_MACRO('W', 'M', 'V', '3')), + //VideoFormat("wmv", CV_FOURCC_MACRO('W', 'V', 'C', '1')), VideoFormat() }; #else @@ -269,19 +269,19 @@ void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt for(;;) { - IplImage * img = cvQueryFrame( cap ); + IplImage* img = cvQueryFrame( cap ); if (!img) break; frames.push_back(Mat(img).clone()); - if (writer == 0) + if (writer == NULL) { writer = cvCreateVideoWriter(tmp_name.c_str(), fmt.fourcc, 24, cvGetSize(img)); - if (writer == 0) + if (writer == NULL) { - ts->printf(ts->LOG, "can't create writer (with fourcc : %d)\n", + ts->printf(ts->LOG, "can't create writer (with fourcc : %s)\n", cvtest::fourccToString(fmt.fourcc).c_str()); cvReleaseCapture( &cap ); ts->set_failed_test_info(ts->FAIL_MISMATCH); @@ -317,18 +317,22 @@ void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt double psnr = PSNR(img1, img); if (psnr < thresDbell) { - printf("Too low psnr = %gdb\n", psnr); + ts->printf(ts->LOG, "Too low frame %d psnr = %gdb\n", i, psnr); + ts->set_failed_test_info(ts->FAIL_MISMATCH); + //imwrite("original.png", img); //imwrite("after_test.png", img1); //Mat diff; //absdiff(img, img1, diff); //imwrite("diff.png", diff); - ts->set_failed_test_info(ts->FAIL_MISMATCH); + break; } } + printf("Before saved release for %s\n", tmp_name.c_str()); cvReleaseCapture( &saved ); + printf("After release\n"); ts->printf(ts->LOG, "end test function : ImagesVideo \n"); }