Merge pull request #21170 from JJJoonngg:4.x
authorJong Sin Kim <whdtls3878@gmail.com>
Thu, 2 Dec 2021 13:48:11 +0000 (22:48 +0900)
committerGitHub <noreply@github.com>
Thu, 2 Dec 2021 13:48:11 +0000 (13:48 +0000)
Check buffer size when frameWidth * frameHeight bigger than allocated buffer size

modules/videoio/src/cap_android_mediandk.cpp

index 4fb4a82..c7f2855 100644 (file)
@@ -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) {