硬件解码器超时,导致通过 StagefrightMetadataRetriever::getFrameAtTim e()截图失败
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
弊司默认视频播放器不自带截图功能,若贵司有通过StagefrightMetadataRetriever::getFrameAtTime()开发截图功能时,遇到截图失败的情况,并且有下述log打印出来。
可以参考下面的solution,解决HW Decoder timeout的问题。
D StagefrightMetadataRetriever: StagefrightMetadataRetriever()
D StagefrightMetadataRetriever: getFrameAtTime: 125887000 us option: 3
E OMXCodec: [OMX.mtk.VIDEO.DECODER.AVC] +waitForBufferFilled_l: 0/0
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] Timed out waiting for output buffers: 0/0
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] -waitForBufferFilled_l
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] timeout in 4 state
//HW Decoder解码超时失败
D StagefrightMetadataRetriever: decoding frame failed.
//再尝试用google SW decoder
D StagefrightMetadataRetriever: HW decoder failed to extract thumbnail, trying SW decoder.
//google SW decoder解码也失败
E SoftAVC : Decoder failed: -2
D StagefrightMetadataRetriever: decoding frame failed.
D StagefrightMetadataRetriever: getframeattime time summary(us),extractor time: 67679,get frame time 6133537,total time: 6201216
//HW和SW解码都失败了,最后截图失败
E MetadataRetrieverCLIent: failed to capture a video frame
[SOLUTION]
针对HW Decoder解码失败,贵司可以尝试做下面修改:
alps\php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\av\media\libstagefright\StagefrightMetadataRetriever.cpp
static VideoFrame *extractVideoFrameWithCodecFlags() 这个函数里
原本 sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
改成
#ifdef MTK_AOSP_ENHANCEMENT
if(frameTimeUs < 0)
{
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
}
else
{
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags);
}
#else
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
#endif
该修改方法会增大截图时所需要的buffer数量,是否添加请贵司自己考量决定。
弊司默认视频播放器不自带截图功能,若贵司有通过StagefrightMetadataRetriever::getFrameAtTime()开发截图功能时,遇到截图失败的情况,并且有下述log打印出来。
可以参考下面的solution,解决HW Decoder timeout的问题。
D StagefrightMetadataRetriever: StagefrightMetadataRetriever()
D StagefrightMetadataRetriever: getFrameAtTime: 125887000 us option: 3
E OMXCodec: [OMX.mtk.VIDEO.DECODER.AVC] +waitForBufferFilled_l: 0/0
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] Timed out waiting for output buffers: 0/0
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] -waitForBufferFilled_l
E OMXCodec: [OMX.MTK.VIDEO.DECODER.AVC] timeout in 4 state
//HW Decoder解码超时失败
D StagefrightMetadataRetriever: decoding frame failed.
//再尝试用google SW decoder
D StagefrightMetadataRetriever: HW decoder failed to extract thumbnail, trying SW decoder.
//google SW decoder解码也失败
E SoftAVC : Decoder failed: -2
D StagefrightMetadataRetriever: decoding frame failed.
D StagefrightMetadataRetriever: getframeattime time summary(us),extractor time: 67679,get frame time 6133537,total time: 6201216
//HW和SW解码都失败了,最后截图失败
E MetadataRetrieverCLIent: failed to capture a video frame
[SOLUTION]
针对HW Decoder解码失败,贵司可以尝试做下面修改:
alps\php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\av\media\libstagefright\StagefrightMetadataRetriever.cpp
static VideoFrame *extractVideoFrameWithCodecFlags() 这个函数里
原本 sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
改成
#ifdef MTK_AOSP_ENHANCEMENT
if(frameTimeUs < 0)
{
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
}
else
{
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags);
}
#else
sp<MediaSource> decoder =
OMXCodec::Create(
client->interface(), format, false, source,
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
#endif
该修改方法会增大截图时所需要的buffer数量,是否添加请贵司自己考量决定。
