| Index: webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| diff --git a/webrtc/modules/video_coding/jitter_buffer_unittest.cc b/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| index c7108c11d822ecb30e20843c804fa87db4fb5d29..425a4e9745839a8f6f03cdb570dcb5b6222380b1 100644
|
| --- a/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| +++ b/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| @@ -12,9 +12,9 @@
|
|
|
| #include <list>
|
| #include <memory>
|
| +#include <vector>
|
|
|
| -#include "webrtc/test/gtest.h"
|
| -#include "webrtc/test/gmock.h"
|
| +#include "webrtc/common_video/h264/h264_common.h"
|
| #include "webrtc/modules/video_coding/frame_buffer.h"
|
| #include "webrtc/modules/video_coding/jitter_buffer.h"
|
| #include "webrtc/modules/video_coding/media_opt_util.h"
|
| @@ -26,6 +26,8 @@
|
| #include "webrtc/system_wrappers/include/metrics.h"
|
| #include "webrtc/system_wrappers/include/metrics_default.h"
|
| #include "webrtc/test/field_trial.h"
|
| +#include "webrtc/test/gmock.h"
|
| +#include "webrtc/test/gtest.h"
|
|
|
| namespace webrtc {
|
|
|
| @@ -1160,6 +1162,89 @@ TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| +TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
|
| + jitter_buffer_->SetDecodeErrorMode(kNoErrors);
|
| +
|
| + packet_->timestamp = timestamp_;
|
| + packet_->frameType = kVideoFrameKey;
|
| + packet_->isFirstPacket = true;
|
| + packet_->markerBit = true;
|
| + packet_->codec = kVideoCodecH264;
|
| + packet_->video_header.codec = kRtpVideoH264;
|
| + packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
|
| + packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
|
| + packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
|
| + packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus_length = 1;
|
| + bool retransmitted = false;
|
| + EXPECT_EQ(kCompleteSession,
|
| + jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| + // Not decodable since sps and pps are missing.
|
| + EXPECT_EQ(nullptr, DecodeCompleteFrame());
|
| +
|
| + timestamp_ += 3000;
|
| + packet_->timestamp = timestamp_;
|
| + ++seq_num_;
|
| + packet_->seqNum = seq_num_;
|
| + packet_->frameType = kVideoFrameKey;
|
| + packet_->isFirstPacket = true;
|
| + packet_->markerBit = false;
|
| + packet_->codec = kVideoCodecH264;
|
| + packet_->video_header.codec = kRtpVideoH264;
|
| + packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
|
| + packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
|
| + packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
|
| + packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
|
| + packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus_length = 2;
|
| + // Not complete since the marker bit hasn't been received.
|
| + EXPECT_EQ(kIncomplete,
|
| + jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| +
|
| + ++seq_num_;
|
| + packet_->seqNum = seq_num_;
|
| + packet_->frameType = kVideoFrameKey;
|
| + packet_->isFirstPacket = false;
|
| + packet_->markerBit = true;
|
| + packet_->codec = kVideoCodecH264;
|
| + packet_->video_header.codec = kRtpVideoH264;
|
| + packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
|
| + packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
|
| + packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
|
| + packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus_length = 1;
|
| + // Complete and decodable since the pps and sps are received in the first
|
| + // packet of this frame.
|
| + EXPECT_EQ(kCompleteSession,
|
| + jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| + VCMEncodedFrame* frame_out = DecodeCompleteFrame();
|
| + ASSERT_NE(nullptr, frame_out);
|
| + jitter_buffer_->ReleaseFrame(frame_out);
|
| +
|
| + timestamp_ += 3000;
|
| + packet_->timestamp = timestamp_;
|
| + ++seq_num_;
|
| + packet_->seqNum = seq_num_;
|
| + packet_->frameType = kVideoFrameDelta;
|
| + packet_->isFirstPacket = true;
|
| + packet_->markerBit = true;
|
| + packet_->codec = kVideoCodecH264;
|
| + packet_->video_header.codec = kRtpVideoH264;
|
| + packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
|
| + packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
|
| + packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
|
| + packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
|
| + packet_->video_header.codecHeader.H264.nalus_length = 1;
|
| + // Complete and decodable since sps, pps and key frame has been received.
|
| + EXPECT_EQ(kCompleteSession,
|
| + jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| + frame_out = DecodeCompleteFrame();
|
| + ASSERT_NE(nullptr, frame_out);
|
| + jitter_buffer_->ReleaseFrame(frame_out);
|
| +}
|
| +
|
| // Test threshold conditions of decodable state.
|
| TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
|
| jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
|
| @@ -2633,5 +2718,4 @@ TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
|
| nack_list = jitter_buffer_->GetNackList(&extended);
|
| EXPECT_EQ(0u, nack_list.size());
|
| }
|
| -
|
| } // namespace webrtc
|
|
|