Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" | 24 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" |
| 25 #include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h" | 25 #include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h" |
| 26 #include "webrtc/modules/video_coding/utility/simulcast_rate_allocator.h" | 26 #include "webrtc/modules/video_coding/utility/simulcast_rate_allocator.h" |
| 27 #include "webrtc/system_wrappers/include/cpu_info.h" | 27 #include "webrtc/system_wrappers/include/cpu_info.h" |
| 28 | 28 |
| 29 namespace webrtc { | 29 namespace webrtc { |
| 30 namespace test { | 30 namespace test { |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 const int k90khzTimestampFrameDiff = 3000; // Assuming 30 fps. | 33 const int k90khzTimestampFrameDiff = 3000; // Assuming 30 fps. |
| 34 | |
| 35 std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator( | |
| 36 const TestConfig& config) { | |
| 37 std::unique_ptr<TemporalLayersFactory> tl_factory; | |
| 38 if (config.codec_settings->codecType == VideoCodecType::kVideoCodecVP8) { | |
| 39 tl_factory.reset(new TemporalLayersFactory()); | |
| 40 config.codec_settings->VP8()->tl_factory = tl_factory.get(); | |
| 41 } | |
| 42 return VideoCodecInitializer::CreateBitrateAllocator(*config.codec_settings, | |
|
åsapersson
2017/02/24 08:27:07
return std::unique_ptr<VideoBitrateAllocator>(Vide
brandtr
2017/02/28 13:59:54
Done.
| |
| 43 std::move(tl_factory)); | |
| 44 } | |
| 45 | |
| 34 } // namespace | 46 } // namespace |
| 35 | 47 |
| 36 const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e) { | 48 const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e) { |
| 37 switch (e) { | 49 switch (e) { |
| 38 case kExcludeOnlyFirstKeyFrame: | 50 case kExcludeOnlyFirstKeyFrame: |
| 39 return "ExcludeOnlyFirstKeyFrame"; | 51 return "ExcludeOnlyFirstKeyFrame"; |
| 40 case kExcludeAllKeyFrames: | 52 case kExcludeAllKeyFrames: |
| 41 return "ExcludeAllKeyFrames"; | 53 return "ExcludeAllKeyFrames"; |
| 42 default: | 54 default: |
| 43 RTC_NOTREACHED(); | 55 RTC_NOTREACHED(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 67 FrameReader* analysis_frame_reader, | 79 FrameReader* analysis_frame_reader, |
| 68 FrameWriter* analysis_frame_writer, | 80 FrameWriter* analysis_frame_writer, |
| 69 PacketManipulator* packet_manipulator, | 81 PacketManipulator* packet_manipulator, |
| 70 const TestConfig& config, | 82 const TestConfig& config, |
| 71 Stats* stats, | 83 Stats* stats, |
| 72 FrameWriter* source_frame_writer, | 84 FrameWriter* source_frame_writer, |
| 73 IvfFileWriter* encoded_frame_writer, | 85 IvfFileWriter* encoded_frame_writer, |
| 74 FrameWriter* decoded_frame_writer) | 86 FrameWriter* decoded_frame_writer) |
| 75 : encoder_(encoder), | 87 : encoder_(encoder), |
| 76 decoder_(decoder), | 88 decoder_(decoder), |
| 89 bitrate_allocator_(CreateBitrateAllocator(config)), | |
| 90 encode_callback_(new VideoProcessorEncodeCompleteCallback(this)), | |
| 91 decode_callback_(new VideoProcessorDecodeCompleteCallback(this)), | |
| 92 packet_manipulator_(packet_manipulator), | |
| 93 config_(config), | |
| 77 analysis_frame_reader_(analysis_frame_reader), | 94 analysis_frame_reader_(analysis_frame_reader), |
| 78 analysis_frame_writer_(analysis_frame_writer), | 95 analysis_frame_writer_(analysis_frame_writer), |
| 79 packet_manipulator_(packet_manipulator), | |
| 80 config_(config), | |
| 81 stats_(stats), | |
| 82 source_frame_writer_(source_frame_writer), | 96 source_frame_writer_(source_frame_writer), |
| 83 encoded_frame_writer_(encoded_frame_writer), | 97 encoded_frame_writer_(encoded_frame_writer), |
| 84 decoded_frame_writer_(decoded_frame_writer), | 98 decoded_frame_writer_(decoded_frame_writer), |
| 85 first_key_frame_has_been_excluded_(false), | 99 first_key_frame_has_been_excluded_(false), |
| 86 last_frame_missing_(false), | 100 last_frame_missing_(false), |
| 87 initialized_(false), | 101 initialized_(false), |
| 88 encoded_frame_size_(0), | 102 encoded_frame_size_(0), |
| 89 encoded_frame_type_(kVideoFrameKey), | 103 encoded_frame_type_(kVideoFrameKey), |
| 90 prev_time_stamp_(0), | 104 prev_time_stamp_(0), |
| 105 last_encoder_frame_width_(0), | |
| 106 last_encoder_frame_height_(0), | |
| 107 stats_(stats), | |
| 91 num_dropped_frames_(0), | 108 num_dropped_frames_(0), |
| 92 num_spatial_resizes_(0), | 109 num_spatial_resizes_(0), |
| 93 last_encoder_frame_width_(0), | |
| 94 last_encoder_frame_height_(0), | |
| 95 bit_rate_factor_(0.0), | 110 bit_rate_factor_(0.0), |
| 96 encode_start_ns_(0), | 111 encode_start_ns_(0), |
| 97 decode_start_ns_(0) { | 112 decode_start_ns_(0) { |
| 98 std::unique_ptr<TemporalLayersFactory> tl_factory; | |
| 99 if (config_.codec_settings->codecType == VideoCodecType::kVideoCodecVP8) { | |
| 100 tl_factory.reset(new TemporalLayersFactory()); | |
| 101 config.codec_settings->VP8()->tl_factory = tl_factory.get(); | |
| 102 } | |
| 103 bitrate_allocator_ = VideoCodecInitializer::CreateBitrateAllocator( | |
| 104 *config.codec_settings, std::move(tl_factory)); | |
| 105 RTC_DCHECK(encoder); | 113 RTC_DCHECK(encoder); |
| 106 RTC_DCHECK(decoder); | 114 RTC_DCHECK(decoder); |
| 115 RTC_DCHECK(packet_manipulator); | |
| 107 RTC_DCHECK(analysis_frame_reader); | 116 RTC_DCHECK(analysis_frame_reader); |
| 108 RTC_DCHECK(analysis_frame_writer); | 117 RTC_DCHECK(analysis_frame_writer); |
| 109 RTC_DCHECK(packet_manipulator); | |
| 110 RTC_DCHECK(stats); | 118 RTC_DCHECK(stats); |
| 111 } | 119 } |
| 112 | 120 |
| 113 bool VideoProcessorImpl::Init() { | 121 bool VideoProcessorImpl::Init() { |
| 114 // Calculate a factor used for bit rate calculations. | 122 // Calculate a factor used for bit rate calculations. |
| 115 bit_rate_factor_ = config_.codec_settings->maxFramerate * 0.001 * 8; // bits | 123 bit_rate_factor_ = config_.codec_settings->maxFramerate * 0.001 * 8; // bits |
| 116 | 124 |
| 117 // Initialize data structures used by the encoder/decoder APIs. | 125 // Initialize data structures used by the encoder/decoder APIs. |
| 118 size_t frame_length_in_bytes = analysis_frame_reader_->FrameLength(); | 126 size_t frame_length_in_bytes = analysis_frame_reader_->FrameLength(); |
| 119 last_successful_frame_buffer_.reset(new uint8_t[frame_length_in_bytes]); | 127 last_successful_frame_buffer_.reset(new uint8_t[frame_length_in_bytes]); |
| 120 | 128 |
| 121 // Set fixed properties common for all frames. | 129 // Set fixed properties common for all frames. |
| 122 // To keep track of spatial resize actions by encoder. | 130 // To keep track of spatial resize actions by encoder. |
| 123 last_encoder_frame_width_ = config_.codec_settings->width; | 131 last_encoder_frame_width_ = config_.codec_settings->width; |
| 124 last_encoder_frame_height_ = config_.codec_settings->height; | 132 last_encoder_frame_height_ = config_.codec_settings->height; |
| 125 | 133 |
| 126 // Setup required callbacks for the encoder/decoder. | 134 // Setup required callbacks for the encoder/decoder. |
| 127 encode_callback_.reset(new VideoProcessorEncodeCompleteCallback(this)); | |
| 128 decode_callback_.reset(new VideoProcessorDecodeCompleteCallback(this)); | |
| 129 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()), | 135 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()), |
| 130 WEBRTC_VIDEO_CODEC_OK) | 136 WEBRTC_VIDEO_CODEC_OK) |
| 131 << "Failed to register encode complete callback"; | 137 << "Failed to register encode complete callback"; |
| 132 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()), | 138 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()), |
| 133 WEBRTC_VIDEO_CODEC_OK) | 139 WEBRTC_VIDEO_CODEC_OK) |
| 134 << "Failed to register decode complete callback"; | 140 << "Failed to register decode complete callback"; |
| 135 | 141 |
| 136 // Init the encoder and decoder. | 142 // Initialize the encoder and decoder. |
| 137 uint32_t num_cores = | 143 uint32_t num_cores = |
| 138 config_.use_single_core ? 1 : CpuInfo::DetectNumberOfCores(); | 144 config_.use_single_core ? 1 : CpuInfo::DetectNumberOfCores(); |
| 139 RTC_CHECK_EQ( | 145 RTC_CHECK_EQ( |
| 140 encoder_->InitEncode(config_.codec_settings, num_cores, | 146 encoder_->InitEncode(config_.codec_settings, num_cores, |
| 141 config_.networking_config.max_payload_size_in_bytes), | 147 config_.networking_config.max_payload_size_in_bytes), |
| 142 WEBRTC_VIDEO_CODEC_OK) | 148 WEBRTC_VIDEO_CODEC_OK) |
| 143 << "Failed to initialize VideoEncoder"; | 149 << "Failed to initialize VideoEncoder"; |
| 144 | 150 |
| 145 RTC_CHECK_EQ(decoder_->InitDecode(config_.codec_settings, num_cores), | 151 RTC_CHECK_EQ(decoder_->InitDecode(config_.codec_settings, num_cores), |
| 146 WEBRTC_VIDEO_CODEC_OK) | 152 WEBRTC_VIDEO_CODEC_OK) |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 315 stat.frame_number = frame_number; | 321 stat.frame_number = frame_number; |
| 316 stat.frame_type = encoded_image._frameType; | 322 stat.frame_type = encoded_image._frameType; |
| 317 stat.qp = encoded_image.qp_; | 323 stat.qp = encoded_image.qp_; |
| 318 stat.bit_rate_in_kbps = encoded_image._length * bit_rate_factor_; | 324 stat.bit_rate_in_kbps = encoded_image._length * bit_rate_factor_; |
| 319 stat.total_packets = | 325 stat.total_packets = |
| 320 encoded_image._length / config_.networking_config.packet_size_in_bytes + | 326 encoded_image._length / config_.networking_config.packet_size_in_bytes + |
| 321 1; | 327 1; |
| 322 | 328 |
| 323 // Simulate packet loss. | 329 // Simulate packet loss. |
| 324 bool exclude_this_frame = false; | 330 bool exclude_this_frame = false; |
| 325 // Only keyframes can be excluded. | |
| 326 if (encoded_image._frameType == kVideoFrameKey) { | 331 if (encoded_image._frameType == kVideoFrameKey) { |
| 332 // Only keyframes can be excluded. | |
| 327 switch (config_.exclude_frame_types) { | 333 switch (config_.exclude_frame_types) { |
| 328 case kExcludeOnlyFirstKeyFrame: | 334 case kExcludeOnlyFirstKeyFrame: |
| 329 if (!first_key_frame_has_been_excluded_) { | 335 if (!first_key_frame_has_been_excluded_) { |
| 330 first_key_frame_has_been_excluded_ = true; | 336 first_key_frame_has_been_excluded_ = true; |
| 331 exclude_this_frame = true; | 337 exclude_this_frame = true; |
| 332 } | 338 } |
| 333 break; | 339 break; |
| 334 case kExcludeAllKeyFrames: | 340 case kExcludeAllKeyFrames: |
| 335 exclude_this_frame = true; | 341 exclude_this_frame = true; |
| 336 break; | 342 break; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 459 int VideoProcessorImpl::GetElapsedTimeMicroseconds(int64_t start, | 465 int VideoProcessorImpl::GetElapsedTimeMicroseconds(int64_t start, |
| 460 int64_t stop) { | 466 int64_t stop) { |
| 461 int64_t encode_time = (stop - start) / rtc::kNumNanosecsPerMicrosec; | 467 int64_t encode_time = (stop - start) / rtc::kNumNanosecsPerMicrosec; |
| 462 RTC_DCHECK_GE(encode_time, std::numeric_limits<int>::min()); | 468 RTC_DCHECK_GE(encode_time, std::numeric_limits<int>::min()); |
| 463 RTC_DCHECK_LE(encode_time, std::numeric_limits<int>::max()); | 469 RTC_DCHECK_LE(encode_time, std::numeric_limits<int>::max()); |
| 464 return static_cast<int>(encode_time); | 470 return static_cast<int>(encode_time); |
| 465 } | 471 } |
| 466 | 472 |
| 467 } // namespace test | 473 } // namespace test |
| 468 } // namespace webrtc | 474 } // namespace webrtc |
| OLD | NEW |