Add end-to-end H.264 packetization test. Also correctly wires up H.264 packetization in the new Call api. R=pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/20079004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6835 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 8b64f14..44c41b1 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc
@@ -209,6 +209,57 @@ DestroyStreams(); } +TEST_F(EndToEndTest, SendsAndReceivesH264) { + class H264Observer : public test::EndToEndTest, public VideoRenderer { + public: + H264Observer() + : EndToEndTest(2 * kDefaultTimeoutMs), + fake_encoder_(Clock::GetRealTimeClock()), + frame_counter_(0) {} + + virtual void PerformTest() OVERRIDE { + EXPECT_EQ(kEventSignaled, Wait()) + << "Timed out while waiting for enough frames to be decoded."; + } + + virtual void ModifyConfigs( + VideoSendStream::Config* send_config, + std::vector<VideoReceiveStream::Config>* receive_configs, + std::vector<VideoStream>* video_streams) { + send_config->encoder_settings.encoder = &fake_encoder_; + send_config->encoder_settings.payload_name = "H264"; + send_config->encoder_settings.payload_type = kFakeSendPayloadType; + (*video_streams)[0].min_bitrate_bps = 50000; + (*video_streams)[0].target_bitrate_bps = + (*video_streams)[0].max_bitrate_bps = 2000000; + + (*receive_configs)[0].renderer = this; + VideoCodec codec = + test::CreateDecoderVideoCodec(send_config->encoder_settings); + (*receive_configs)[0].codecs.resize(1); + (*receive_configs)[0].codecs[0] = codec; + (*receive_configs)[0].external_decoders.resize(1); + (*receive_configs)[0].external_decoders[0].payload_type = + send_config->encoder_settings.payload_type; + (*receive_configs)[0].external_decoders[0].decoder = &fake_decoder_; + } + + virtual void RenderFrame(const I420VideoFrame& video_frame, + int time_to_render_ms) OVERRIDE { + const int kRequiredFrames = 500; + if (++frame_counter_ == kRequiredFrames) + observation_complete_->Set(); + } + + private: + test::FakeH264Decoder fake_decoder_; + test::FakeH264Encoder fake_encoder_; + int frame_counter_; + } test; + + RunBaseTest(&test); +} + TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { class SyncRtcpObserver : public test::EndToEndTest { public:
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc index 4e6b2ba..6597029 100644 --- a/webrtc/video/video_send_stream.cc +++ b/webrtc/video/video_send_stream.cc
@@ -304,9 +304,13 @@ VideoCodec video_codec; memset(&video_codec, 0, sizeof(video_codec)); - video_codec.codecType = - (config_.encoder_settings.payload_name == "VP8" ? kVideoCodecVP8 - : kVideoCodecGeneric); + if (config_.encoder_settings.payload_name == "VP8") { + video_codec.codecType = kVideoCodecVP8; + } else if (config_.encoder_settings.payload_name == "H264") { + video_codec.codecType = kVideoCodecH264; + } else { + video_codec.codecType = kVideoCodecGeneric; + } if (video_codec.codecType == kVideoCodecVP8) { video_codec.codecSpecific.VP8.resilience = kResilientStream; @@ -316,6 +320,10 @@ video_codec.codecSpecific.VP8.automaticResizeOn = false; video_codec.codecSpecific.VP8.frameDroppingOn = true; video_codec.codecSpecific.VP8.keyFrameInterval = 3000; + } else if (video_codec.codecType == kVideoCodecH264) { + video_codec.codecSpecific.H264.profile = kProfileBase; + video_codec.codecSpecific.H264.frameDroppingOn = true; + video_codec.codecSpecific.H264.keyFrameInterval = 3000; } if (video_codec.codecType == kVideoCodecVP8) {