2016-02-13 38 views
0

我在幾個Android設備所面臨的問題,同時從複製DecodeFrame2()數據爲YUV緩衝內存分配轉換成RGB

這是我的代碼:

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設備上工作。但在處理第一幀後,少數Android設備,第二幀起,我在第一個memcpy()語句中崩潰。

什麼是錯誤的代碼?以及如何根據DecodeFrame2()的輸出計算緩衝區大小。 如果我處理替代幀(而不是30,只有15幀替代), 它複製罰款。

請幫我解決這個問題?

+1

這可能是我,但你在談論的memcpy需要yuvBufferedData和yuvData [0]作爲參數,但你千萬不要告訴我們如何將這些定義或者分配發生......所以,沒有...不能幫助。 –

+0

如果你想獲得有用的答案,你必須展示更多的代碼。 – gollum

+0

這是爲640 * 480分辨率。我從相機接收幀,並解壓縮幀(Demux) - >解碼幀(H264) - > YUVtoRGB轉換。這些都發生在單線程中。直到解碼部分工作正常。我已經將解碼器的輸出寫入.yuv文件並在YUV播放器上播放。它打得很好。但是,當我試圖將Decode的輸出複製到另一個緩衝區(用於YUV到RGB轉換)時,它會在低端設備上崩潰。第一幀成功完成所有階段。第二個框架一貫失敗。 – user255212

回答

0

yDataSize和uvDataSize是非常巨大的基於上面的公式, 此問題已被固定通過修改大小。