创建新编解码器时,元数据作为OMXCodec::Create 方法的一部分从解析器传递到解码器。我假设在您的实现中,您会注意以普通的 android 实现中指定的 MetaData 格式传递元数据。
例如,请参考AwesomePlayer::initVideoDecoder,其中调用mVideoTrack->getFormat()获取视频轨道的元数据。请注意,这不是 MediaBuffer 的一部分,而是作为单独的对象传递的。
一旦创建解码器,就会调用configureCodec。该方法中OMXCodec读取不同的配置参数来初始化解码器。
kKeyAVCC 对应于 Codec Specific Data 或 csd,本质上是底层 H.264 流的 SPS 和 PPS。
kKeyWidth和kKeyHeight对应视频帧的width和height。为了初始化解码器,您可以设置更多的附加参数。例如,如果你为解码器的输出设置一个特定的colorFormat,你可以通过kKeyColorFormat来设置。
创建解码器后,您必须通过标准openmax 接口传递各个帧。解码器通过调用OMXCodec::read 方法启动,该方法将填充输入和输出缓冲区。
输入缓冲区通过OMXCodec::drainInputBuffer 方法填充,该方法从解析器模块(在您的情况下是您的特定模块)读取MediaBuffer。 MediaBuffer 的内容被复制到填充在OMX 组件的input port 上的缓冲区中。除了这个数据,这个缓冲区的timestamp 也被传递。时间戳信息通过与MediaBuffer 一起传递的kKeyTime 参数读取。
因此,对于在MediaBuffer 中传递的每一帧,您需要确保将有效的timestamp 也传递给底层解码器,该解码器会反映在解码器的输出端口上。
在您的问题中,您曾询问过kKeyIsSyncFrame。此标志由Encoder 设置,作为FillBufferDone 回调的一部分,即当编码器对IDR frame 之类的关键帧进行编码时,它会通过此特定标志传达此信息,作为输出端口上回调的一部分编码器。 对于解码,这无关紧要。
如果您可以在启用OMXCodec 日志的情况下发布更多日志,则可能更容易提供更准确的答案。
附:在 android 框架中,有一个名为Stagefright 的命令行实用程序,它创建解析器和解码器并执行命令行解码,无需任何渲染。这可能是您插入自己的解析器的一个很好的参考。