diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index 4feabcec6e..b4b7e3e223 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -1427,10 +1427,11 @@ bool CvCapture_MSMF::setAudioProperties(const cv::VideoCaptureParameters& params } if (params.has(CAP_PROP_AUDIO_SAMPLES_PER_SECOND)) { + static const int MSMF_MAX_AUDIO_SAMPLES_PER_SECOND = 384000; // highest rate used by real PCM audio hardware int value = params.get(CAP_PROP_AUDIO_SAMPLES_PER_SECOND); - if (value < 0) + if (value < 0 || value > MSMF_MAX_AUDIO_SAMPLES_PER_SECOND) { - CV_LOG_ERROR(NULL, "VIDEOIO/MSMF: CAP_PROP_AUDIO_SAMPLES_PER_SECOND parameter can't be negative: " << value); + CV_LOG_ERROR(NULL, "VIDEOIO/MSMF: CAP_PROP_AUDIO_SAMPLES_PER_SECOND parameter value is invalid/unsupported: " << value); return false; } else @@ -1727,7 +1728,7 @@ bool CvCapture_MSMF::grabAudioFrame() else if (flags & MF_SOURCE_READERF_ENDOFSTREAM) { aEOS = true; - if (videoStream != -1 && !vEOS) + if (videoStream != -1) returnFlag = true; if (videoStream == -1) audioSamplePos += chunkLengthOfBytes/((captureAudioFormat.bit_per_sample/8)*captureAudioFormat.nChannels); diff --git a/modules/videoio/test/test_audio.cpp b/modules/videoio/test/test_audio.cpp index ec702ceba9..332ebe88f7 100644 --- a/modules/videoio/test/test_audio.cpp +++ b/modules/videoio/test/test_audio.cpp @@ -40,7 +40,7 @@ protected: for (unsigned int nCh = 0; nCh < audioData.size(); nCh++) { #ifdef _WIN32 - if (audioData[nCh].size() == 132924 && numberOfSamples == 131819 && fileName == "test_audio.mp4") + if ((audioData[nCh].size() == 132924 || audioData[nCh].size() == 133104) && numberOfSamples == 131819 && fileName == "test_audio.mp4") throw SkipTestException("Detected failure observed on legacy Windows versions. SKIP"); #endif ASSERT_EQ(numberOfSamples, audioData[nCh].size()) << "nCh=" << nCh;