1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-21 19:33:03 +04:00

videoio(MSMF): fix audio sample-rate validation and dropped last frame (#27438)

This commit is contained in:
Varun Jaiswal
2026-07-10 12:42:12 +05:30
committed by Alexander Smorkalov
parent 87af90b847
commit 4533beab85
2 changed files with 5 additions and 4 deletions
+4 -3
View File
@@ -1427,10 +1427,11 @@ bool CvCapture_MSMF::setAudioProperties(const cv::VideoCaptureParameters& params
} }
if (params.has(CAP_PROP_AUDIO_SAMPLES_PER_SECOND)) 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<int>(CAP_PROP_AUDIO_SAMPLES_PER_SECOND); int value = params.get<int>(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; return false;
} }
else else
@@ -1727,7 +1728,7 @@ bool CvCapture_MSMF::grabAudioFrame()
else if (flags & MF_SOURCE_READERF_ENDOFSTREAM) else if (flags & MF_SOURCE_READERF_ENDOFSTREAM)
{ {
aEOS = true; aEOS = true;
if (videoStream != -1 && !vEOS) if (videoStream != -1)
returnFlag = true; returnFlag = true;
if (videoStream == -1) if (videoStream == -1)
audioSamplePos += chunkLengthOfBytes/((captureAudioFormat.bit_per_sample/8)*captureAudioFormat.nChannels); audioSamplePos += chunkLengthOfBytes/((captureAudioFormat.bit_per_sample/8)*captureAudioFormat.nChannels);
+1 -1
View File
@@ -40,7 +40,7 @@ protected:
for (unsigned int nCh = 0; nCh < audioData.size(); nCh++) for (unsigned int nCh = 0; nCh < audioData.size(); nCh++)
{ {
#ifdef _WIN32 #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"); throw SkipTestException("Detected failure observed on legacy Windows versions. SKIP");
#endif #endif
ASSERT_EQ(numberOfSamples, audioData[nCh].size()) << "nCh=" << nCh; ASSERT_EQ(numberOfSamples, audioData[nCh].size()) << "nCh=" << nCh;