要转换为 RGB 的 YUV 缓冲区的内存分配

Memory allocation for YUV buffer to convert into RGB

本文关键字:缓冲区 内存 分配 YUV RGB 转换      更新时间:2023-10-16

我在从DecodeFrame2()复制数据时在少数Android设备上遇到问题

这是我的代码:

uint8_t* m_yuvData[3];
SBufferInfo yuvDataInfo;
memset(&yuvDataInfo, 0, sizeof(SBufferInfo));
m_yuvData[0] = NULL;
m_yuvData[1] = NULL;
m_yuvData[2] = NULL;
DECODING_STATE decodingState = m_decoder->DecodeFrame2(bufferData, bufferDataSize, m_yuvData, &yuvDataInfo);
if(yuvDataInfo.iBufferStatus == 1)
{
        int yStride = yuvDataInfo->UsrData.sSystemBuffer.iStride[0];
        int uvStride = yuvDataInfo->UsrData.sSystemBuffer.iStride[1];
        uint32_t width = yuvDataInfo->UsrData.sSystemBuffer.iWidth;
       uint32_t height = yuvDataInfo->UsrData.sSystemBuffer.iHeight;
       size_t yDataSize = (width * height) + (height * yStride);
       size_t uvDataSize = (((width * height) / 4) + (height * uvStride));
        size_t requiredSize = yDataSize + (2 * uvDataSize);
        uint8_t* yuvBufferedData = (uint8_t*)malloc(requiredSize);
        // when i move yuvData[0] to another location i am getting crash.
         memcpy(yuvBufferedData, yuvData[0], yDataSize);
         memcpy(yuvBufferedData + yDataSize, yuvData[1], uvDataSize);
        memcpy(yuvBufferedData + yDataSize + uvDataSize, yuvData[2], uvDataSize);
  }

上面的代码片段适用于高端安卓设备。 但是在处理第一帧、第二帧之后,在少数 android 设备上,我在第一个 memcpy() 语句中崩溃。

这段代码出了什么问题?以及如何从DecodeFrame2()的输出中计算缓冲区大小。如果我处理替代帧(而不是 30 帧,只有 15 帧替代帧),它复制得很好。

请帮我解决这个问题?

yDataSize 和 uvDataSize 基于上述公式非常庞大,此问题已通过修改大小得到解决。