Index: webrtc/modules/video_coding/generic_decoder.cc |
diff --git a/webrtc/modules/video_coding/generic_decoder.cc b/webrtc/modules/video_coding/generic_decoder.cc |
index 2121ab63067acdafe71e7f1cb7ceaf90c3b1196d..f5d9cfe07396ab03d9767a6ec6ac0fa38ed6c1dc 100644 |
--- a/webrtc/modules/video_coding/generic_decoder.cc |
+++ b/webrtc/modules/video_coding/generic_decoder.cc |
@@ -87,7 +87,7 @@ |
decodedImage.set_timestamp_us( |
frameInfo->renderTimeMs * rtc::kNumMicrosecsPerMillisec); |
decodedImage.set_rotation(frameInfo->rotation); |
- _receiveCallback->FrameToRender(decodedImage, qp); |
+ _receiveCallback->FrameToRender(decodedImage, qp, frameInfo->content_type); |
} |
int32_t VCMDecodedFrameCallback::ReceivedDecodedReferenceFrame( |
@@ -131,7 +131,8 @@ |
_decoder(decoder), |
_codecType(kVideoCodecUnknown), |
_isExternal(isExternal), |
- _keyFrameDecoded(false) {} |
+ _keyFrameDecoded(false), |
+ _last_keyframe_content_type(VideoContentType::UNSPECIFIED) {} |
VCMGenericDecoder::~VCMGenericDecoder() {} |
@@ -149,6 +150,15 @@ |
_frameInfos[_nextFrameInfoIdx].decodeStartTimeMs = nowMs; |
_frameInfos[_nextFrameInfoIdx].renderTimeMs = frame.RenderTimeMs(); |
_frameInfos[_nextFrameInfoIdx].rotation = frame.rotation(); |
+ // Set correctly only for key frames. Thus, use latest key frame |
+ // content type. If the corresponding key frame was lost, decode will fail |
+ // and content type will be ignored. |
+ if (frame.FrameType() == kVideoFrameKey) { |
+ _frameInfos[_nextFrameInfoIdx].content_type = frame.contentType(); |
+ _last_keyframe_content_type = frame.contentType(); |
+ } else { |
+ _frameInfos[_nextFrameInfoIdx].content_type = _last_keyframe_content_type; |
+ } |
_callback->Map(frame.TimeStamp(), &_frameInfos[_nextFrameInfoIdx]); |
_nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength; |