From 2da1f9181a0c3a5f3b67a29670080a515bf1cf7d Mon Sep 17 00:00:00 2001 From: Jong Sin Kim Date: Thu, 2 Dec 2021 22:48:11 +0900 Subject: [PATCH] Merge pull request #21170 from JJJoonngg:4.x Check buffer size when frameWidth * frameHeight bigger than allocated buffer size --- modules/videoio/src/cap_android_mediandk.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_android_mediandk.cpp b/modules/videoio/src/cap_android_mediandk.cpp index 4fb4a82..c7f2855 100644 --- a/modules/videoio/src/cap_android_mediandk.cpp +++ b/modules/videoio/src/cap_android_mediandk.cpp @@ -97,10 +97,29 @@ public: LOGV("buffer size: %zu", bufferSize); LOGV("width (frame): %d", frameWidth); LOGV("height (frame): %d", frameHeight); - if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) { + if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) + { LOGV("output EOS"); sawOutputEOS = true; } + if ((size_t)frameWidth * frameHeight * 3 / 2 > bufferSize) + { + if (bufferSize == 3110400 && frameWidth == 1920 && frameHeight == 1088) + { + frameHeight = 1080; + LOGV("Buffer size is too small, force using height = %d", frameHeight); + } + else if(bufferSize == 3110400 && frameWidth == 1088 && frameHeight == 1920) + { + frameWidth = 1080; + LOGV("Buffer size is too small, force using width = %d", frameWidth); + } + else + { + LOGE("Buffer size is too small. Frame is ignored. Enable verbose logging to see actual values of parameters"); + return false; + } + } AMediaCodec_releaseOutputBuffer(mediaCodec.get(), bufferIndex, info.size != 0); return true; } else if (bufferIndex == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) { -- 2.7.4