Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h

Issue 2695653002: Add support for creating HW codecs in VideoProcessor tests. (Closed)
Patch Set: kjellander comments 1. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H _ 11 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H _
12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H _ 12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H _
13 13
14 #include <math.h> 14 #include <math.h>
15 15
16 #include <memory> 16 #include <memory>
17 #include <string> 17 #include <string>
18 18
19 #if defined(WEBRTC_ANDROID)
20 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h"
21 #include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h"
22 #include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h"
23 #elif defined(WEBRTC_IOS)
24 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h"
25 #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h"
26 #endif
27
28 #include "webrtc/media/engine/webrtcvideodecoderfactory.h"
29 #include "webrtc/media/engine/webrtcvideoencoderfactory.h"
19 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 30 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
20 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h" 31 #include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
21 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h" 32 #include "webrtc/modules/video_coding/codecs/test/videoprocessor.h"
22 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 33 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
23 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" 34 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
24 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h" 35 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
25 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 36 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
26 #include "webrtc/modules/video_coding/include/video_codec_interface.h" 37 #include "webrtc/modules/video_coding/include/video_codec_interface.h"
27 #include "webrtc/modules/video_coding/include/video_coding.h" 38 #include "webrtc/modules/video_coding/include/video_coding.h"
28 #include "webrtc/test/gtest.h" 39 #include "webrtc/test/gtest.h"
(...skipping 14 matching lines...) Expand all
43 const int kBaseKeyFrameInterval = 3000; 54 const int kBaseKeyFrameInterval = 3000;
44 55
45 // Default sequence is foreman (CIF): may be better to use VGA for resize test. 56 // Default sequence is foreman (CIF): may be better to use VGA for resize test.
46 const int kCifWidth = 352; 57 const int kCifWidth = 352;
47 const int kCifHeight = 288; 58 const int kCifHeight = 288;
48 const char kFilenameForemanCif[] = "foreman_cif"; 59 const char kFilenameForemanCif[] = "foreman_cif";
49 60
50 // Codec and network settings. 61 // Codec and network settings.
51 struct CodecConfigPars { 62 struct CodecConfigPars {
52 VideoCodecType codec_type; 63 VideoCodecType codec_type;
64 bool hw_codec;
53 float packet_loss; 65 float packet_loss;
54 int num_temporal_layers; 66 int num_temporal_layers;
55 int key_frame_interval; 67 int key_frame_interval;
56 bool error_concealment_on; 68 bool error_concealment_on;
57 bool denoising_on; 69 bool denoising_on;
58 bool frame_dropper_on; 70 bool frame_dropper_on;
59 bool spatial_resize_on; 71 bool spatial_resize_on;
60 int width; 72 int width;
61 int height; 73 int height;
62 std::string filename; 74 std::string filename;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 // writes it to the output directory. After completion, quality metrics 122 // writes it to the output directory. After completion, quality metrics
111 // (PSNR and SSIM) and rate control metrics are computed to verify that the 123 // (PSNR and SSIM) and rate control metrics are computed to verify that the
112 // quality and encoder response is acceptable. The rate control tests allow us 124 // quality and encoder response is acceptable. The rate control tests allow us
113 // to verify the behavior for changing bitrate, changing frame rate, frame 125 // to verify the behavior for changing bitrate, changing frame rate, frame
114 // dropping/spatial resize, and temporal layers. The limits for the rate 126 // dropping/spatial resize, and temporal layers. The limits for the rate
115 // control metrics are set to be fairly conservative, so failure should only 127 // control metrics are set to be fairly conservative, so failure should only
116 // happen when some significant regression or breakdown occurs. 128 // happen when some significant regression or breakdown occurs.
117 class VideoProcessorIntegrationTest : public testing::Test { 129 class VideoProcessorIntegrationTest : public testing::Test {
118 protected: 130 protected:
119 std::unique_ptr<VideoEncoder> encoder_; 131 std::unique_ptr<VideoEncoder> encoder_;
132 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> external_encoder_factory_;
120 std::unique_ptr<VideoDecoder> decoder_; 133 std::unique_ptr<VideoDecoder> decoder_;
134 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> external_decoder_factory_;
121 std::unique_ptr<test::FrameReader> frame_reader_; 135 std::unique_ptr<test::FrameReader> frame_reader_;
122 std::unique_ptr<test::FrameWriter> frame_writer_; 136 std::unique_ptr<test::FrameWriter> frame_writer_;
123 test::PacketReader packet_reader_; 137 test::PacketReader packet_reader_;
124 std::unique_ptr<test::PacketManipulator> packet_manipulator_; 138 std::unique_ptr<test::PacketManipulator> packet_manipulator_;
125 test::Stats stats_; 139 test::Stats stats_;
126 test::TestConfig config_; 140 test::TestConfig config_;
127 VideoCodec codec_settings_; 141 VideoCodec codec_settings_;
142 // Must be destroyed before |encoder_| and |decoder_|.
128 std::unique_ptr<test::VideoProcessor> processor_; 143 std::unique_ptr<test::VideoProcessor> processor_;
129 TemporalLayersFactory tl_factory_; 144 TemporalLayersFactory tl_factory_;
130 145
131 // Quantities defined/updated for every encoder rate update. 146 // Quantities defined/updated for every encoder rate update.
132 // Some quantities defined per temporal layer (at most 3 layers in this test). 147 // Some quantities defined per temporal layer (at most 3 layers in this test).
133 int num_frames_per_update_[3]; 148 int num_frames_per_update_[3];
134 float sum_frame_size_mismatch_[3]; 149 float sum_frame_size_mismatch_[3];
135 float sum_encoded_frame_size_[3]; 150 float sum_encoded_frame_size_[3];
136 float encoding_bitrate_[3]; 151 float encoding_bitrate_[3];
137 float per_frame_bandwidth_[3]; 152 float per_frame_bandwidth_[3];
138 float bit_rate_layer_[3]; 153 float bit_rate_layer_[3];
139 float frame_rate_layer_[3]; 154 float frame_rate_layer_[3];
140 int num_frames_total_; 155 int num_frames_total_;
141 float sum_encoded_frame_size_total_; 156 float sum_encoded_frame_size_total_;
142 float encoding_bitrate_total_; 157 float encoding_bitrate_total_;
143 float perc_encoding_rate_mismatch_; 158 float perc_encoding_rate_mismatch_;
144 int num_frames_to_hit_target_; 159 int num_frames_to_hit_target_;
145 bool encoding_rate_within_target_; 160 bool encoding_rate_within_target_;
146 int bit_rate_; 161 int bit_rate_;
147 int frame_rate_; 162 int frame_rate_;
148 int layer_; 163 int layer_;
149 float target_size_key_frame_initial_; 164 float target_size_key_frame_initial_;
150 float target_size_key_frame_; 165 float target_size_key_frame_;
151 float sum_key_frame_size_mismatch_; 166 float sum_key_frame_size_mismatch_;
152 int num_key_frames_; 167 int num_key_frames_;
153 float start_bitrate_; 168 float start_bitrate_;
154 169
155 // Codec and network settings. 170 // Codec and network settings.
156 VideoCodecType codec_type_; 171 VideoCodecType codec_type_;
172 bool hw_codec_;
157 float packet_loss_; 173 float packet_loss_;
158 int num_temporal_layers_; 174 int num_temporal_layers_;
159 int key_frame_interval_; 175 int key_frame_interval_;
160 bool error_concealment_on_; 176 bool error_concealment_on_;
161 bool denoising_on_; 177 bool denoising_on_;
162 bool frame_dropper_on_; 178 bool frame_dropper_on_;
163 bool spatial_resize_on_; 179 bool spatial_resize_on_;
164 180
165 VideoProcessorIntegrationTest() {} 181 VideoProcessorIntegrationTest() {
166 virtual ~VideoProcessorIntegrationTest() {} 182 #if defined(WEBRTC_ANDROID)
183 InitializeAndroidObjects();
184
185 external_encoder_factory_.reset(
186 new webrtc_jni::MediaCodecVideoEncoderFactory());
187 external_decoder_factory_.reset(
188 new webrtc_jni::MediaCodecVideoDecoderFactory());
189 #endif
190 }
191 virtual ~VideoProcessorIntegrationTest() {
192 #if defined(WEBRTC_ANDROID)
193 FreeAndroidObjects();
194 #endif
195 }
167 196
168 void SetUpCodecConfig(const std::string& filename, 197 void SetUpCodecConfig(const std::string& filename,
169 int width, 198 int width,
170 int height, 199 int height,
171 bool verbose_logging) { 200 bool verbose_logging) {
172 if (codec_type_ == kVideoCodecH264) { 201 if (hw_codec_) {
173 encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264"))); 202 #if defined(WEBRTC_ANDROID)
174 decoder_.reset(H264Decoder::Create()); 203 // In general, external codecs should be destroyed by the factories that
175 VideoCodingModule::Codec(kVideoCodecH264, &codec_settings_); 204 // allocated them. For the particular case of the Android
176 } else if (codec_type_ == kVideoCodecVP8) { 205 // MediaCodecVideo{En,De}coderFactory's, however, it turns out that it is
177 encoder_.reset(VP8Encoder::Create()); 206 // fine for the std::unique_ptr to destroy the owned codec directly.
178 decoder_.reset(VP8Decoder::Create()); 207 if (codec_type_ == kVideoCodecH264) {
179 VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_); 208 encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
180 } else if (codec_type_ == kVideoCodecVP9) { 209 cricket::VideoCodec(cricket::kH264CodecName)));
181 encoder_.reset(VP9Encoder::Create()); 210 decoder_.reset(
182 decoder_.reset(VP9Decoder::Create()); 211 external_decoder_factory_->CreateVideoDecoder(kVideoCodecH264));
183 VideoCodingModule::Codec(kVideoCodecVP9, &codec_settings_); 212 } else if (codec_type_ == kVideoCodecVP8) {
213 encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
214 cricket::VideoCodec(cricket::kVp8CodecName)));
215 decoder_.reset(
216 external_decoder_factory_->CreateVideoDecoder(kVideoCodecVP8));
217 } else if (codec_type_ == kVideoCodecVP9) {
218 encoder_.reset(external_encoder_factory_->CreateVideoEncoder(
219 cricket::VideoCodec(cricket::kVp9CodecName)));
220 decoder_.reset(
221 external_decoder_factory_->CreateVideoDecoder(kVideoCodecVP9));
222 }
223 #elif defined(WEBRTC_IOS)
224 RTC_DCHECK_EQ(kVideoCodecH264, codec_type_)
225 << "iOS HW codecs only support H264.";
226 encoder_.reset(new H264VideoToolboxEncoder(
227 cricket::VideoCodec(cricket::kH264CodecName)));
228 decoder_.reset(new H264VideoToolboxDecoder());
229 #else
230 RTC_NOTREACHED() << "Only support HW codecs on Android and iOS.";
231 #endif
232 RTC_DCHECK(encoder_) << "HW encoder not successfully created.";
233 RTC_DCHECK(decoder_) << "HW decoder not successfully created.";
234 } else {
235 // SW codecs.
236 if (codec_type_ == kVideoCodecH264) {
237 encoder_.reset(
238 H264Encoder::Create(cricket::VideoCodec(cricket::kH264CodecName)));
239 decoder_.reset(H264Decoder::Create());
240 } else if (codec_type_ == kVideoCodecVP8) {
241 encoder_.reset(VP8Encoder::Create());
242 decoder_.reset(VP8Decoder::Create());
243 } else if (codec_type_ == kVideoCodecVP9) {
244 encoder_.reset(VP9Encoder::Create());
245 decoder_.reset(VP9Decoder::Create());
246 }
184 } 247 }
185 248
249 VideoCodingModule::Codec(codec_type_, &codec_settings_);
250
186 // Configure input filename. 251 // Configure input filename.
187 config_.input_filename = test::ResourcePath(filename, "yuv"); 252 config_.input_filename = test::ResourcePath(filename, "yuv");
188 if (verbose_logging) 253 if (verbose_logging)
189 printf("Filename: %s\n", filename.c_str()); 254 printf("Filename: %s\n", filename.c_str());
190 // Generate an output filename in a safe way. 255 // Generate an output filename in a safe way.
191 config_.output_filename = test::TempFilename( 256 config_.output_filename = test::TempFilename(
192 test::OutputPath(), "videoprocessor_integrationtest"); 257 test::OutputPath(), "videoprocessor_integrationtest");
193 config_.frame_length_in_bytes = CalcBufferSize(kI420, width, height); 258 config_.frame_length_in_bytes = CalcBufferSize(kI420, width, height);
194 config_.verbose = verbose_logging; 259 config_.verbose = verbose_logging;
195 // Only allow encoder/decoder to use single core, for predictability. 260 // Only allow encoder/decoder to use single core, for predictability.
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 } 492 }
428 } 493 }
429 494
430 // Processes all frames in the clip and verifies the result. 495 // Processes all frames in the clip and verifies the result.
431 void ProcessFramesAndVerify(QualityMetrics quality_metrics, 496 void ProcessFramesAndVerify(QualityMetrics quality_metrics,
432 RateProfile rate_profile, 497 RateProfile rate_profile,
433 CodecConfigPars process, 498 CodecConfigPars process,
434 RateControlMetrics* rc_metrics) { 499 RateControlMetrics* rc_metrics) {
435 // Codec/config settings. 500 // Codec/config settings.
436 codec_type_ = process.codec_type; 501 codec_type_ = process.codec_type;
502 hw_codec_ = process.hw_codec;
437 start_bitrate_ = rate_profile.target_bit_rate[0]; 503 start_bitrate_ = rate_profile.target_bit_rate[0];
438 packet_loss_ = process.packet_loss; 504 packet_loss_ = process.packet_loss;
439 key_frame_interval_ = process.key_frame_interval; 505 key_frame_interval_ = process.key_frame_interval;
440 num_temporal_layers_ = process.num_temporal_layers; 506 num_temporal_layers_ = process.num_temporal_layers;
441 error_concealment_on_ = process.error_concealment_on; 507 error_concealment_on_ = process.error_concealment_on;
442 denoising_on_ = process.denoising_on; 508 denoising_on_ = process.denoising_on;
443 frame_dropper_on_ = process.frame_dropper_on; 509 frame_dropper_on_ = process.frame_dropper_on;
444 spatial_resize_on_ = process.spatial_resize_on; 510 spatial_resize_on_ = process.spatial_resize_on;
445 SetUpCodecConfig(process.filename, process.width, process.height, 511 SetUpCodecConfig(process.filename, process.width, process.height,
446 process.verbose_logging); 512 process.verbose_logging);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 int frame_rate, 603 int frame_rate,
538 int frame_index_rate_update) { 604 int frame_index_rate_update) {
539 rate_profile->target_bit_rate[update_index] = bit_rate; 605 rate_profile->target_bit_rate[update_index] = bit_rate;
540 rate_profile->input_frame_rate[update_index] = frame_rate; 606 rate_profile->input_frame_rate[update_index] = frame_rate;
541 rate_profile->frame_index_rate_update[update_index] = 607 rate_profile->frame_index_rate_update[update_index] =
542 frame_index_rate_update; 608 frame_index_rate_update;
543 } 609 }
544 610
545 static void SetCodecParameters(CodecConfigPars* process_settings, 611 static void SetCodecParameters(CodecConfigPars* process_settings,
546 VideoCodecType codec_type, 612 VideoCodecType codec_type,
613 bool hw_codec,
547 float packet_loss, 614 float packet_loss,
548 int key_frame_interval, 615 int key_frame_interval,
549 int num_temporal_layers, 616 int num_temporal_layers,
550 bool error_concealment_on, 617 bool error_concealment_on,
551 bool denoising_on, 618 bool denoising_on,
552 bool frame_dropper_on, 619 bool frame_dropper_on,
553 bool spatial_resize_on, 620 bool spatial_resize_on,
554 int width, 621 int width,
555 int height, 622 int height,
556 const std::string& filename, 623 const std::string& filename,
557 bool verbose_logging) { 624 bool verbose_logging) {
558 process_settings->codec_type = codec_type; 625 process_settings->codec_type = codec_type;
626 process_settings->hw_codec = hw_codec;
559 process_settings->packet_loss = packet_loss; 627 process_settings->packet_loss = packet_loss;
560 process_settings->key_frame_interval = key_frame_interval; 628 process_settings->key_frame_interval = key_frame_interval;
561 process_settings->num_temporal_layers = num_temporal_layers, 629 process_settings->num_temporal_layers = num_temporal_layers,
562 process_settings->error_concealment_on = error_concealment_on; 630 process_settings->error_concealment_on = error_concealment_on;
563 process_settings->denoising_on = denoising_on; 631 process_settings->denoising_on = denoising_on;
564 process_settings->frame_dropper_on = frame_dropper_on; 632 process_settings->frame_dropper_on = frame_dropper_on;
565 process_settings->spatial_resize_on = spatial_resize_on; 633 process_settings->spatial_resize_on = spatial_resize_on;
566 process_settings->width = width; 634 process_settings->width = width;
567 process_settings->height = height; 635 process_settings->height = height;
568 process_settings->filename = filename; 636 process_settings->filename = filename;
569 process_settings->verbose_logging = verbose_logging; 637 process_settings->verbose_logging = verbose_logging;
570 } 638 }
571 639
572 static void SetCodecParameters(CodecConfigPars* process_settings, 640 static void SetCodecParameters(CodecConfigPars* process_settings,
573 VideoCodecType codec_type, 641 VideoCodecType codec_type,
642 bool hw_codec,
574 float packet_loss, 643 float packet_loss,
575 int key_frame_interval, 644 int key_frame_interval,
576 int num_temporal_layers, 645 int num_temporal_layers,
577 bool error_concealment_on, 646 bool error_concealment_on,
578 bool denoising_on, 647 bool denoising_on,
579 bool frame_dropper_on, 648 bool frame_dropper_on,
580 bool spatial_resize_on) { 649 bool spatial_resize_on) {
581 SetCodecParameters(process_settings, codec_type, packet_loss, 650 SetCodecParameters(process_settings, codec_type, hw_codec, packet_loss,
582 key_frame_interval, num_temporal_layers, 651 key_frame_interval, num_temporal_layers,
583 error_concealment_on, denoising_on, frame_dropper_on, 652 error_concealment_on, denoising_on, frame_dropper_on,
584 spatial_resize_on, kCifWidth, kCifHeight, 653 spatial_resize_on, kCifWidth, kCifHeight,
585 kFilenameForemanCif, false /* verbose_logging */); 654 kFilenameForemanCif, false /* verbose_logging */);
586 } 655 }
587 656
588 static void SetQualityMetrics(QualityMetrics* quality_metrics, 657 static void SetQualityMetrics(QualityMetrics* quality_metrics,
589 double minimum_avg_psnr, 658 double minimum_avg_psnr,
590 double minimum_min_psnr, 659 double minimum_min_psnr,
591 double minimum_avg_ssim, 660 double minimum_avg_ssim,
(...skipping 23 matching lines...) Expand all
615 rc_metrics[update_index].max_time_hit_target = max_time_hit_target; 684 rc_metrics[update_index].max_time_hit_target = max_time_hit_target;
616 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes; 685 rc_metrics[update_index].num_spatial_resizes = num_spatial_resizes;
617 rc_metrics[update_index].num_key_frames = num_key_frames; 686 rc_metrics[update_index].num_key_frames = num_key_frames;
618 } 687 }
619 }; 688 };
620 689
621 } // namespace test 690 } // namespace test
622 } // namespace webrtc 691 } // namespace webrtc
623 692
624 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES T_H_ 693 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTES T_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698