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 |
11 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" | 11 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" |
12 | 12 |
13 #include <string.h> | 13 #include <string.h> |
14 | 14 |
15 #include <limits> | 15 #include <limits> |
16 #include <memory> | 16 #include <memory> |
17 #include <utility> | 17 #include <utility> |
18 #include <vector> | 18 #include <vector> |
19 | 19 |
20 #include "webrtc/api/video/i420_buffer.h" | 20 #include "webrtc/api/video/i420_buffer.h" |
21 #include "webrtc/common_types.h" | 21 #include "webrtc/common_types.h" |
22 #include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h" | 22 #include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h" |
23 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" | 23 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" |
24 #include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h" | 24 #include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h" |
25 #include "webrtc/rtc_base/checks.h" | 25 #include "webrtc/rtc_base/checks.h" |
26 #include "webrtc/rtc_base/logging.h" | 26 #include "webrtc/rtc_base/logging.h" |
27 #include "webrtc/rtc_base/timeutils.h" | 27 #include "webrtc/rtc_base/timeutils.h" |
28 #include "webrtc/system_wrappers/include/cpu_info.h" | 28 #include "webrtc/system_wrappers/include/cpu_info.h" |
| 29 #include "webrtc/test/gtest.h" |
29 | 30 |
30 namespace webrtc { | 31 namespace webrtc { |
31 namespace test { | 32 namespace test { |
32 | 33 |
33 namespace { | 34 namespace { |
34 | 35 |
35 const int kRtpClockRateHz = 90000; | 36 const int kRtpClockRateHz = 90000; |
36 | 37 |
37 std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator( | 38 std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator( |
38 TestConfig* config) { | 39 TestConfig* config) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 codec_settings.VP9().numberOfSpatialLayers); | 85 codec_settings.VP9().numberOfSpatialLayers); |
85 printf(" Flexible mode : %d\n", codec_settings.VP9().flexibleMode); | 86 printf(" Flexible mode : %d\n", codec_settings.VP9().flexibleMode); |
86 } else if (codec_settings.codecType == kVideoCodecH264) { | 87 } else if (codec_settings.codecType == kVideoCodecH264) { |
87 printf(" Frame dropping : %d\n", codec_settings.H264().frameDroppingOn); | 88 printf(" Frame dropping : %d\n", codec_settings.H264().frameDroppingOn); |
88 printf(" Key frame interval: %d\n", | 89 printf(" Key frame interval: %d\n", |
89 codec_settings.H264().keyFrameInterval); | 90 codec_settings.H264().keyFrameInterval); |
90 printf(" Profile : %d\n", codec_settings.H264().profile); | 91 printf(" Profile : %d\n", codec_settings.H264().profile); |
91 } | 92 } |
92 } | 93 } |
93 | 94 |
| 95 void VerifyQpParser(const EncodedImage& encoded_frame, |
| 96 const TestConfig& config) { |
| 97 if (config.hw_codec) |
| 98 return; |
| 99 |
| 100 int qp; |
| 101 if (config.codec_settings.codecType == kVideoCodecVP8) { |
| 102 ASSERT_TRUE(vp8::GetQp(encoded_frame._buffer, encoded_frame._length, &qp)); |
| 103 } else if (config.codec_settings.codecType == kVideoCodecVP9) { |
| 104 ASSERT_TRUE(vp9::GetQp(encoded_frame._buffer, encoded_frame._length, &qp)); |
| 105 } else { |
| 106 return; |
| 107 } |
| 108 EXPECT_EQ(encoded_frame.qp_, qp) << "Encoder QP != parsed bitstream QP."; |
| 109 } |
| 110 |
94 int GetElapsedTimeMicroseconds(int64_t start_ns, int64_t stop_ns) { | 111 int GetElapsedTimeMicroseconds(int64_t start_ns, int64_t stop_ns) { |
95 int64_t diff_us = (stop_ns - start_ns) / rtc::kNumNanosecsPerMicrosec; | 112 int64_t diff_us = (stop_ns - start_ns) / rtc::kNumNanosecsPerMicrosec; |
96 RTC_DCHECK_GE(diff_us, std::numeric_limits<int>::min()); | 113 RTC_DCHECK_GE(diff_us, std::numeric_limits<int>::min()); |
97 RTC_DCHECK_LE(diff_us, std::numeric_limits<int>::max()); | 114 RTC_DCHECK_LE(diff_us, std::numeric_limits<int>::max()); |
98 return static_cast<int>(diff_us); | 115 return static_cast<int>(diff_us); |
99 } | 116 } |
100 | 117 |
101 } // namespace | 118 } // namespace |
102 | 119 |
103 const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e) { | 120 const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e) { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 config_.codec_settings.maxFramerate = framerate_fps; | 273 config_.codec_settings.maxFramerate = framerate_fps; |
257 int set_rates_result = encoder_->SetRateAllocation( | 274 int set_rates_result = encoder_->SetRateAllocation( |
258 bitrate_allocator_->GetAllocation(bitrate_kbps * 1000, framerate_fps), | 275 bitrate_allocator_->GetAllocation(bitrate_kbps * 1000, framerate_fps), |
259 framerate_fps); | 276 framerate_fps); |
260 RTC_DCHECK_GE(set_rates_result, 0) | 277 RTC_DCHECK_GE(set_rates_result, 0) |
261 << "Failed to update encoder with new rate " << bitrate_kbps << "."; | 278 << "Failed to update encoder with new rate " << bitrate_kbps << "."; |
262 num_dropped_frames_ = 0; | 279 num_dropped_frames_ = 0; |
263 num_spatial_resizes_ = 0; | 280 num_spatial_resizes_ = 0; |
264 } | 281 } |
265 | 282 |
266 int VideoProcessor::GetQpFromEncoder(int frame_number) const { | |
267 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | |
268 RTC_CHECK_LT(frame_number, frame_infos_.size()); | |
269 return frame_infos_[frame_number].qp_encoder; | |
270 } | |
271 | |
272 int VideoProcessor::GetQpFromBitstream(int frame_number) const { | |
273 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | |
274 RTC_CHECK_LT(frame_number, frame_infos_.size()); | |
275 return frame_infos_[frame_number].qp_bitstream; | |
276 } | |
277 | |
278 int VideoProcessor::NumberDroppedFrames() { | 283 int VideoProcessor::NumberDroppedFrames() { |
279 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 284 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
280 return num_dropped_frames_; | 285 return num_dropped_frames_; |
281 } | 286 } |
282 | 287 |
283 int VideoProcessor::NumberSpatialResizes() { | 288 int VideoProcessor::NumberSpatialResizes() { |
284 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); | 289 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_); |
285 return num_spatial_resizes_; | 290 return num_spatial_resizes_; |
286 } | 291 } |
287 | 292 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 } | 330 } |
326 | 331 |
327 last_frame_missing = | 332 last_frame_missing = |
328 (frame_infos_[last_encoded_frame_num_].manipulated_length == 0); | 333 (frame_infos_[last_encoded_frame_num_].manipulated_length == 0); |
329 } | 334 } |
330 // Ensure strict monotonicity. | 335 // Ensure strict monotonicity. |
331 RTC_CHECK_GT(frame_number, last_encoded_frame_num_); | 336 RTC_CHECK_GT(frame_number, last_encoded_frame_num_); |
332 last_encoded_frame_num_ = frame_number; | 337 last_encoded_frame_num_ = frame_number; |
333 | 338 |
334 // Frame is not dropped, so update frame information and statistics. | 339 // Frame is not dropped, so update frame information and statistics. |
| 340 VerifyQpParser(encoded_image, config_); |
335 RTC_CHECK_LT(frame_number, frame_infos_.size()); | 341 RTC_CHECK_LT(frame_number, frame_infos_.size()); |
336 FrameInfo* frame_info = &frame_infos_[frame_number]; | 342 FrameInfo* frame_info = &frame_infos_[frame_number]; |
337 frame_info->qp_encoder = encoded_image.qp_; | |
338 if (codec == kVideoCodecVP8) { | |
339 vp8::GetQp(encoded_image._buffer, encoded_image._length, | |
340 &frame_info->qp_bitstream); | |
341 } else if (codec == kVideoCodecVP9) { | |
342 vp9::GetQp(encoded_image._buffer, encoded_image._length, | |
343 &frame_info->qp_bitstream); | |
344 } | |
345 FrameStatistic* frame_stat = &stats_->stats_[frame_number]; | 343 FrameStatistic* frame_stat = &stats_->stats_[frame_number]; |
346 frame_stat->encode_time_in_us = | 344 frame_stat->encode_time_in_us = |
347 GetElapsedTimeMicroseconds(frame_info->encode_start_ns, encode_stop_ns); | 345 GetElapsedTimeMicroseconds(frame_info->encode_start_ns, encode_stop_ns); |
348 frame_stat->encoding_successful = true; | 346 frame_stat->encoding_successful = true; |
349 frame_stat->encoded_frame_length_in_bytes = encoded_image._length; | 347 frame_stat->encoded_frame_length_in_bytes = encoded_image._length; |
350 frame_stat->frame_number = frame_number; | 348 frame_stat->frame_number = frame_number; |
351 frame_stat->frame_type = encoded_image._frameType; | 349 frame_stat->frame_type = encoded_image._frameType; |
352 frame_stat->qp = encoded_image.qp_; | 350 frame_stat->qp = encoded_image.qp_; |
353 frame_stat->bit_rate_in_kbps = static_cast<int>( | 351 frame_stat->bit_rate_in_kbps = static_cast<int>( |
354 encoded_image._length * config_.codec_settings.maxFramerate * 8 / 1000); | 352 encoded_image._length * config_.codec_settings.maxFramerate * 8 / 1000); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 | 496 |
499 RTC_DCHECK_GT(timestamp, 0); | 497 RTC_DCHECK_GT(timestamp, 0); |
500 const int ticks_per_frame = | 498 const int ticks_per_frame = |
501 kRtpClockRateHz / config_.codec_settings.maxFramerate; | 499 kRtpClockRateHz / config_.codec_settings.maxFramerate; |
502 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0); | 500 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0); |
503 return (timestamp / ticks_per_frame) - 1; | 501 return (timestamp / ticks_per_frame) - 1; |
504 } | 502 } |
505 | 503 |
506 } // namespace test | 504 } // namespace test |
507 } // namespace webrtc | 505 } // namespace webrtc |
OLD | NEW |