轉儲YUV我想從OMXCodec
解碼輸出轉儲YUV
數據。 這是MediaBuffer
類型。訪問data()指針是不可能的。如何從OMXCodec解碼輸出
如果我試圖訪問數據,崩潰發生由於下面的校驗碼。
frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed.
請讓我知道解決這個MediaBuffer
提取YUV
數據。
轉儲YUV我想從OMXCodec
解碼輸出轉儲YUV
數據。 這是MediaBuffer
類型。訪問data()指針是不可能的。如何從OMXCodec解碼輸出
如果我試圖訪問數據,崩潰發生由於下面的校驗碼。
frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed.
請讓我知道解決這個MediaBuffer
提取YUV
數據。
你在使用什麼平臺?
1)平時要獲取輸出緩存轉儲的最簡單的方法是做它的供應商OMX IL(其中我在那裏工作準備功能/宏這樣做)
2)如果沒有你每一個供應商IMPL應儘量在ACodec onFillBufferDone
轉儲緩衝區(您需要的音頻/視頻進行區分)或onOutputBufferDrained
,你必須得到mGraphicBuffer
,並從中獲得原始緩衝區 - 封裝是平臺依賴性的,例如對於QC這將是
void const *buf = (void const*)((private_handle_t*)(info->mGraphicBuffer->handle))->base;
假設該信息是(在ACodec :: onOutputBufferDrained)
BufferInfo *info =
mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
在OMXCodec情況下,你可以在OMXCodec年底做出同樣::閱讀 返回的BUF只是保存到文件,大小要寫入會WxHxPixelRatio。
在某些平臺上,硬件解碼器默認不會創建用戶空間YUV。你可以嘗試
OMXCodec::Create(…,
flags | OMXCodec::kClientNeedsFramebuffer);
從MediaBuffer
,我覺得下面應該是功能性的。我還沒有嘗試過,並且與rg2的解決方案一起工作,即直接基於gralloc
句柄,但覺得以下內容也應該起作用。
sp<GraphicBuffer> mCurrGraphicBuffer;
void *vaddr;
err = source->read(&buffer, &options); // Where buffer is of MediaBuffer type
mCurrGraphicBuffer = buffer->graphicBuffer();
width = mCurrGraphicBuffer->getWidth();
height = mCurrGraphicBuffer->getWidth();
format = mCurrGraphicBuffer->getFormat();
mCurrGraphicBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, &vaddr);
//Dump the YUV file based on the vaddr, width, height, format
mCurrGraphicBuffer->unlock();
編輯:
爲了使上述溶液的工作,實際GraphicBuffer
應創建或用適當的使用標誌分配,即在緩衝應與一個暗示,CPU將訪問被創建一樣。否則,將根據documentation in gralloc
返回-EINVAL
。
非常感謝。 從您的評論中,我可以從MediaBuffer中提取YUV數據。 但是,此顏色格式爲「OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka」。 我需要將它轉換爲YUV420Planar。 我可以找到轉換功能嗎? – user2453912
@ user2453912。請檢查我的評論在這個問題:HTTP://stackoverflow.com/questions/21797923/qomx-color-formatyuv420packedsemiplanar64x32tile2m8ka-converter。我相信你只會問同樣的 – Ganesh
@ user2453912 ..如果它回答你的問題,你能接受答案嗎? – Ganesh