| Index: webrtc/modules/video_coding/frame_object.cc
|
| diff --git a/webrtc/modules/video_coding/frame_object.cc b/webrtc/modules/video_coding/frame_object.cc
|
| index ec3e9757b368e05a3ecfeb1f3a4c3cc8cdc90fb0..bfe720fb5b5741f7657a8bcad3ee09f174a013c4 100644
|
| --- a/webrtc/modules/video_coding/frame_object.cc
|
| +++ b/webrtc/modules/video_coding/frame_object.cc
|
| @@ -9,6 +9,7 @@
|
| */
|
|
|
| #include "webrtc/base/checks.h"
|
| +#include "webrtc/common_video/h264/h264_common.h"
|
| #include "webrtc/modules/video_coding/frame_object.h"
|
| #include "webrtc/modules/video_coding/packet_buffer.h"
|
|
|
| @@ -65,7 +66,32 @@ RtpFrameObject::RtpFrameObject(PacketBuffer* packet_buffer,
|
|
|
| _buffer = new uint8_t[_size];
|
| _length = frame_size;
|
| - _frameType = first_packet->frameType;
|
| +
|
| + // For H264 frames we can't determine the frame type by just looking at the
|
| + // first packet. Instead we consider the frame to be a keyframe if it
|
| + // contains an IDR NALU.
|
| + if (codec_type_ == kVideoCodecH264) {
|
| + _frameType = kVideoFrameDelta;
|
| + frame_type_ = kVideoFrameDelta;
|
| + for (uint16_t seq_num = first_seq_num;
|
| + seq_num != last_seq_num + 1 && _frameType == kVideoFrameDelta;
|
| + ++seq_num) {
|
| + VCMPacket* packet = packet_buffer_->GetPacket(seq_num);
|
| + RTC_DCHECK(packet);
|
| + const RTPVideoHeaderH264& header = packet->video_header.codecHeader.H264;
|
| + for (size_t i = 0; i < header.nalus_length; ++i) {
|
| + if (header.nalus[i].type == H264::NaluType::kIdr) {
|
| + _frameType = kVideoFrameKey;
|
| + frame_type_ = kVideoFrameKey;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + } else {
|
| + _frameType = first_packet->frameType;
|
| + frame_type_ = first_packet->frameType;
|
| + }
|
| +
|
| GetBitstream(_buffer);
|
| _encodedWidth = first_packet->width;
|
| _encodedHeight = first_packet->height;
|
|
|