先调用视频解码器Flush。
int32_t ret = OH_VideoDecoder_Flush(video_codec_);
ret = OH_VideoDecoder_Start(video_codec_);
然后调用start,之后收到解码器
void OhosVideoDecoder::OnNeedInputBuffer(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *buffer, void *userData) { XLOG_INFO("index: %d, buffer: %p", index, buffer);
的回调,打印的log:
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 2, buffer: 0x5c8eeffbf0
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 1, buffer: 0x5c84ef18d0
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 2, buffer: 0x5c84ef1840
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 3, buffer: 0x5c84ef1990
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 4, buffer: 0x5c95b62350
看index是2的回调了两次,并且两次的buffer地址也不一样。开始从上面返回的index和buffer中塞视频帧
XLOG_INFO("info.pts: %lld, info.size: %d, info.flags: %d, index: %d", info.pts, info.size, info.flags, index);
OH_AVBuffer_SetBufferAttr(buffer, &info);
int32_t ret = OH_VideoDecoder_PushInputBuffer(video_codec_, index);
log输出:
[ohos_video_decoder.cpp][234][TryDecode]: info.pts: 0, info.size: 147054, info.flags: 0, index: 1
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 1, buffer: 0x5c84ef18d0
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][234][TryDecode]: info.pts: 33000, info.size: 95116, info.flags: 0, index: 2
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 2, buffer: 0x5c84ef1840
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][234][TryDecode]: info.pts: 67000, info.size: 83603, info.flags: 0, index: 3
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 3, buffer: 0x5c84ef1990
继续
[ohos_video_decoder.cpp][234][TryDecode]: info.pts: 1567000, info.size: 65027, info.flags: 0, index: 4
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 4, buffer: 0x5c95b62350
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][190][TryDecode]:
[ohos_video_decoder.cpp][234][TryDecode]: info.pts: 1600000, info.size: 162304, info.flags: 10, index: 2
[ohos_video_decoder.cpp][22][OnNeedInputBuffer]: index: 2, buffer: 0x5c84ef1840
[ohos_video_decoder.cpp][190][TryDecode]:
直到现在才有output的回调。
[ohos_video_decoder.cpp][37][OnNewOutputBuffer]:
[ohos_video_decoder.cpp][52][OnFrameAvailable]:
[ohos_video_decoder.cpp][59][operator()]:
[ohos_video_decoder.cpp][71][operator()]: xxx pts_ms: 1600000
这个时间是从surfacetexture中取到的。
int64_t pts_ms = OH_NativeImage_GetTimestamp(decoder->native_image_); // 输出单位是微妙
XLOG_INFO("xxx pts_ms: %lld", pts_ms);
运行了应用(抓取no filter日志)。得到以下错误信息:
以上日志说明pushinputbuffer时,size没设或设成0。
以上日志说明push时,没用回调给的index,而是用的正在解码的buffer的index,所以提示buffer的所有者是omx。请参考上面的错误说明,修改代码。