2013-03-19 126 views
0

我一直試圖使用OMXCodecStagefright。我已經實現了Android的ICS版本的代碼.I有兩個類CustomDataSource,其衍生MediaSource,另一個是CustomOmxCodec,它調用OMXCodec::Create方法並執行讀取操作以解碼h264幀。我已經在具有omx.google.video.avc軟件解碼器的設備上測試了這個實現,它工作正常。現在,當我嘗試在帶有硬件h264解碼的android手機上運行相同的實現時,它會在讀取調用時返回錯誤。該錯誤是如下:OMXCodec :: onEvent - OMX Bad Parameter

[OMX.MTK.VIDEO.DECODER.AVC] ERROR (0x80001005, 0) 

0x80001005OMX_ErrorBadParameter。 ,我在讀操作時得到錯誤代碼-1103。 我嘗試了各種參數,但沒有成功。

完整的日誌如下:

[OMX.MTK.VIDEO.DECODER.AVC] mVideoInputErrorRate (0.000000) 

[email protected]@!>>create tid (21087) O<XCodec mOMXLivesLocally=0, mIsVideoDecoder (1), mIsVideoEncoder (0), mime(video/avc) 

[OMX.MTK.VIDEO.DECODER.AVC] video dimensions are 640X480 

mSupportesPartialFrames 1 err 0 

[OMX.MTK.VIDEO.DECODER.AVC] allocating 10 buffers of size 65536 on input port. 

[OMX.MTK.VIDEO.DECODER.AVC] mMemHeapBase = 0x00E8C288, mOutputBufferPoolMemBase=0x51F8E000, size = 9578848 

[OMX.MTK.VIDEO.DECODER.AVC] ERROR (0x80001005, 0) 

OMXCodec::onEvent--OMX Bad Parameter!! 

Read Error : -1103 

我倒是感謝有這方面的方向。

回答

2

從這個問題出發,硬件編解碼器(即OMX.MTK.VIDEO.DECODER.AVC)不支持作爲配置步驟的一部分傳遞的參數之一。

OMXCodec::create,configureCodec將被調用,它在內部調用很多其他函數。由於錯誤是OMXCodec::onEvent的一部分,所以可能的情況之一可能是該組件在解碼第一幀的前幾個字節時遇到錯誤。

具體來說,當組件遇到SPSPPS(編解碼器特定數據的一部分)時,組件通常會觸發portSettingsChanged。從你的迴應中,我覺得在這個過程中,有一些錯誤,因此已經觸發了。

請分享更多日誌進一步分析。

+0

感謝您的回覆。我沒有設置kKeyAVCC參數。是否有必要或建議定義kKeyAVCC?我正在整合stagefright來逐幀解碼。我從我的幀集合解析編碼幀,而不是從mp4或任何其他媒體容器。那麼在這種情況下,是否可以將sps和pps設置爲kKeyAVCC?將在某個時間共享更多日誌。 – sam18 2013-03-19 10:13:00

+0

@ sam18模擬器和硬件的android代碼應該相同。因此,我認爲kKeyAVCC已經作爲解碼器的第一個緩衝區被傳遞。這個問題似乎源於別的東西。從您的日誌中,錯誤似乎在創建輸出緩衝區期間發生。你能分享完整的日誌嗎? – Ganesh 2013-03-19 14:06:21

0

從日誌和映射相同的所實施的代碼,我覺得以下是發生

[OMX.MTK.VIDEO.DECODER.AVC] allocating 10 buffers of size 65536 on input port. 

該步驟分配解碼器的輸入端口

從流上的緩衝器代碼,在分配輸入端口緩衝區後,輸出端口上的緩衝區將從nativeWindowallocateOutputBuffersFromNativeWindow分配。

作爲此方法實現的一部分,其中一個步驟是將輸出端口上的緩衝區數量增加2,並將其設置爲OMX組件,如here所示。

我覺得你的錯誤可能是從這個特定點所產生的nBufferSize只讀OMX_IndexParamPortDefinition指標的參數。請參閱OMX Standard的第3.1.3.12.1頁第83頁,其中明確顯示nBufferSize只讀參數。

看來您的OMX組件可能嚴格爲OMX兼容組件,而在從ICS開始的Android中,預計會出現某些偏差。這可能是您的錯誤的潛在原因之一。

P.S:如果您可以分享更多信息,我們可以提供更多幫助。

+0

非常感謝深度信息。我可以深入挖掘您的信息。我粘貼了我在logcat中找到的所有日誌。有沒有辦法生成omx特定的日誌? – sam18 2013-03-19 16:14:12

+0

@ sam18您可以在'OMXCodec'中添加更多日誌,並且還可以在OMXNodeInstance中啓用日誌。請使用'OMXCodec'中的'Codec_LOGV'構造來區分不同的編解碼器打印。如果你可以聯繫'OMX'組件開發者,請檢查OMX組件是否支持我在文章中提到的偏差。 – Ganesh 2013-03-19 16:17:03

+0

你說第一次讀操作時,輸出緩衝區創建過程中存在問題。這讓我猜猜問題的原因。在使用OMXCodec :: Create方法創建視頻源時,我沒有將sp 的指針作爲最後一個參數傳遞,而是傳遞null。因爲我想在我的控制下渲染表面。這可以成爲我的問題的原因嗎?由於沒有硬件解碼器可以分配輸出緩衝區的表面,所以它失敗,錯誤代碼爲-1103,併爲ERR錯誤參數拋出(0x80001005,0)。 – sam18 2013-03-20 07:02:13

0

MTK H264解碼器需要參數csd-0和csd-1來初始化解碼器(您可以在http://developer.android.com/reference/android/media/MediaCodec.html處獲得一些信息)。 csd-0和csd-1代表SPS和H264的PPS。我問過一位MTK工程師,他說我們可以使用下面的代碼來設置這兩個參數。

byte[] sps = {0,0,0,1,103,100,0,40,-84,52,-59,1,-32,17,31,120,11,80,16,16,31 
       ,0,0,3,3,-23,0,0,-22,96,-108}; 
byte[] pps = {0,0,0,1,104,-18,60,-128}; 
MediaFormat mFormat = MediaFormat.createVideoFormat("video/avc", width, height); 
mFormat.setByteBuffer("csd-0", ByteBuffer.wrap(sps)); 
mFormat.setByteBuffer("csd-1", ByteBuffer.wrap(pps)); 

也許這是我們得到的OMX錯誤參數錯誤信息。

+0

但我得到了錯誤:'E/MtkOmxVenc(6724):錯誤:BufferType不是Gralloc Source !!!!'作爲您的建議。 – 2015-09-08 04:04:24