2014-02-12 23 views
1

轉儲YUV我想從OMXCodec解碼輸出轉儲YUV數據。 這是MediaBuffer類型。訪問data()指針是不可能的。如何從OMXCodec解碼輸出

如果我試圖訪問數據,崩潰發生由於下面的校驗碼。

frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed. 

請讓我知道解決這個MediaBuffer提取YUV數據。

回答

0

你在使用什麼平臺?

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。

0

在某些平臺上,硬件解碼器默認不會創建用戶空間YUV。你可以嘗試

OMXCodec::Create(…, 
    flags | OMXCodec::kClientNeedsFramebuffer); 
1

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

+0

非常感謝。 從您的評論中,我可以從MediaBuffer中提取YUV數據。 但是,此顏色格式爲「OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka」。 我需要將它轉換爲YUV420Planar。 我可以找到轉換功能嗎? – user2453912

+0

@ user2453912。請檢查我的評論在這個問題:HTTP://stackoverflow.com/questions/21797923/qomx-color-formatyuv420packedsemiplanar64x32tile2m8ka-converter。我相信你只會問同樣的 – Ganesh

+0

@ user2453912 ..如果它回答你的問題,你能接受答案嗎? – Ganesh