0

我一直在尝试使用OMXCodecthrough Stagefright。我已经实现了ICSAndroid 版本的代码。我有两个CustomDataSource派生类,MediaSource另一个是CustomOmxCodec调用OMXCodec::Create方法并执行读取操作以解码 h264 帧。我已经在带有omx.google.video.avc软件解码器的设备上测试了这个实现,它工作正常。现在,当我尝试在具有硬件 h264 解码的 android 手机上运行相同的实现时,它在读取调用时返回错误。错误如下:

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

0x80001005是为OMX_ErrorBadParameter-1103我在读取操作时收到错误代码。我尝试了各种参数,但没有成功。

完整的日志如下:

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

!@@!>>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

我很感激这方面的任何指导。

4

3 回答 3

2

从问题来看,硬件编解码器OMX.MTK.VIDEO.DECODER.AVC不支持作为配置步骤的一部分传递的参数之一。

From OMXCodec::create,configureCodec将被调用,它在内部调用了许多其他函数。由于错误是 的一部分OMXCodec::onEvent,因此可能的情况之一是组件在解码第一帧的前几个字节时遇到错误。

具体来说,当组件遇到SPSPPS(编解码器特定数据的一部分)时,组件通常会触发portSettingsChanged. 从您的回复中,我觉得在这个过程中,出现了一些错误,因此onEvent被触发了。

请分享更多日志以进一步分析。

于 2013-03-19T09:44:07.833 回答
1

MTK H264 解码器需要参数 csd-0 和 csd-1 来初始化解码器(您可以在http://developer.android.com/reference/android/media/MediaCodec.html获得一些信息)。csd-0和csd-1代表H264的SPS和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 Bad Parameter 错误消息的原因。

于 2014-07-18T06:27:16.570 回答
0

从日志和映射到实现的代码,我觉得发生了以下情况

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

此步骤在解码器的输入端口上分配缓冲区

从代码流来看,输入端口缓冲区分配后,输出端口上的缓冲区是从分配nativeWindow到的allocateOutputBuffersFromNativeWindow

作为该方法实现的一部分,其中一个步骤是将输出端口上的缓冲区数量增加 2,并将其设置为组件,如此OMX所示。

我觉得您的错误可能源于这一特定点,因为 index.jsnBufferSize只读参数也是如此OMX_IndexParamPortDefinition。请参阅OMX 标准,第 3.1.3.12.1 节,第 83 页,清楚地表明这nBufferSize是一个只读参数。

看起来您的OMX组件可能是严格OMX兼容的组件,而从 AndroidICS开始,某些偏差是可以预料的。这可能是您的错误的潜在原因之一。

PS:如果您可以分享更多信息,我们可以提供更多帮助。

于 2013-03-19T14:34:41.183 回答