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

Side by Side Diff: webrtc/modules/video_coding/codecs/test/videoprocessor.cc

Issue 2996253002: VideoProcessor: make it runnable on a task queue. (Closed)
Patch Set: Created 3 years, 4 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
« no previous file with comments | « webrtc/modules/video_coding/codecs/test/videoprocessor.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 114
115 VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder, 115 VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder,
116 webrtc::VideoDecoder* decoder, 116 webrtc::VideoDecoder* decoder,
117 FrameReader* analysis_frame_reader, 117 FrameReader* analysis_frame_reader,
118 FrameWriter* analysis_frame_writer, 118 FrameWriter* analysis_frame_writer,
119 PacketManipulator* packet_manipulator, 119 PacketManipulator* packet_manipulator,
120 const TestConfig& config, 120 const TestConfig& config,
121 Stats* stats, 121 Stats* stats,
122 IvfFileWriter* encoded_frame_writer, 122 IvfFileWriter* encoded_frame_writer,
123 FrameWriter* decoded_frame_writer) 123 FrameWriter* decoded_frame_writer)
124 : config_(config), 124 : initialized_(false),
125 config_(config),
125 encoder_(encoder), 126 encoder_(encoder),
126 decoder_(decoder), 127 decoder_(decoder),
127 bitrate_allocator_(CreateBitrateAllocator(&config_)), 128 bitrate_allocator_(CreateBitrateAllocator(&config_)),
128 encode_callback_(this), 129 encode_callback_(this),
129 decode_callback_(this), 130 decode_callback_(this),
130 packet_manipulator_(packet_manipulator), 131 packet_manipulator_(packet_manipulator),
131 analysis_frame_reader_(analysis_frame_reader), 132 analysis_frame_reader_(analysis_frame_reader),
132 analysis_frame_writer_(analysis_frame_writer), 133 analysis_frame_writer_(analysis_frame_writer),
133 encoded_frame_writer_(encoded_frame_writer), 134 encoded_frame_writer_(encoded_frame_writer),
134 decoded_frame_writer_(decoded_frame_writer), 135 decoded_frame_writer_(decoded_frame_writer),
135 initialized_(false),
136 last_encoded_frame_num_(-1), 136 last_encoded_frame_num_(-1),
137 last_decoded_frame_num_(-1), 137 last_decoded_frame_num_(-1),
138 first_key_frame_has_been_excluded_(false), 138 first_key_frame_has_been_excluded_(false),
139 last_decoded_frame_buffer_(analysis_frame_reader->FrameLength()), 139 last_decoded_frame_buffer_(analysis_frame_reader->FrameLength()),
140 stats_(stats), 140 stats_(stats),
141 num_dropped_frames_(0), 141 num_dropped_frames_(0),
142 num_spatial_resizes_(0) { 142 num_spatial_resizes_(0) {
143 RTC_DCHECK(encoder); 143 RTC_DCHECK(encoder);
144 RTC_DCHECK(decoder); 144 RTC_DCHECK(decoder);
145 RTC_DCHECK(packet_manipulator); 145 RTC_DCHECK(packet_manipulator);
146 RTC_DCHECK(analysis_frame_reader); 146 RTC_DCHECK(analysis_frame_reader);
147 RTC_DCHECK(analysis_frame_writer); 147 RTC_DCHECK(analysis_frame_writer);
148 RTC_DCHECK(stats); 148 RTC_DCHECK(stats);
149 frame_infos_.reserve(analysis_frame_reader->NumberOfFrames()); 149 frame_infos_.reserve(analysis_frame_reader->NumberOfFrames());
150 } 150 }
151 151
152 VideoProcessor::~VideoProcessor() = default; 152 VideoProcessor::~VideoProcessor() = default;
153 153
154 void VideoProcessor::Init() { 154 void VideoProcessor::Init() {
155 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
155 RTC_DCHECK(!initialized_) << "VideoProcessor already initialized."; 156 RTC_DCHECK(!initialized_) << "VideoProcessor already initialized.";
156 initialized_ = true; 157 initialized_ = true;
157 158
158 // Setup required callbacks for the encoder and decoder. 159 // Setup required callbacks for the encoder and decoder.
159 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(&encode_callback_), 160 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(&encode_callback_),
160 WEBRTC_VIDEO_CODEC_OK) 161 WEBRTC_VIDEO_CODEC_OK)
161 << "Failed to register encode complete callback"; 162 << "Failed to register encode complete callback";
162 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(&decode_callback_), 163 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(&decode_callback_),
163 WEBRTC_VIDEO_CODEC_OK) 164 WEBRTC_VIDEO_CODEC_OK)
164 << "Failed to register decode complete callback"; 165 << "Failed to register decode complete callback";
(...skipping 26 matching lines...) Expand all
191 CodecTypeToPayloadName(config_.codec_settings.codecType) 192 CodecTypeToPayloadName(config_.codec_settings.codecType)
192 .value_or("Unknown"), 193 .value_or("Unknown"),
193 encoder_->ImplementationName()); 194 encoder_->ImplementationName());
194 } 195 }
195 PrintCodecSettings(config_.codec_settings); 196 PrintCodecSettings(config_.codec_settings);
196 printf("\n"); 197 printf("\n");
197 } 198 }
198 } 199 }
199 200
200 void VideoProcessor::Release() { 201 void VideoProcessor::Release() {
202 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
203
201 RTC_CHECK_EQ(encoder_->Release(), WEBRTC_VIDEO_CODEC_OK); 204 RTC_CHECK_EQ(encoder_->Release(), WEBRTC_VIDEO_CODEC_OK);
202 RTC_CHECK_EQ(decoder_->Release(), WEBRTC_VIDEO_CODEC_OK); 205 RTC_CHECK_EQ(decoder_->Release(), WEBRTC_VIDEO_CODEC_OK);
203 206
204 encoder_->RegisterEncodeCompleteCallback(nullptr); 207 encoder_->RegisterEncodeCompleteCallback(nullptr);
205 decoder_->RegisterDecodeCompleteCallback(nullptr); 208 decoder_->RegisterDecodeCompleteCallback(nullptr);
206 209
207 initialized_ = false; 210 initialized_ = false;
208 } 211 }
209 212
210 void VideoProcessor::ProcessFrame(int frame_number) { 213 void VideoProcessor::ProcessFrame(int frame_number) {
214 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
211 RTC_DCHECK_EQ(frame_number, frame_infos_.size()) 215 RTC_DCHECK_EQ(frame_number, frame_infos_.size())
212 << "Must process frames in sequence."; 216 << "Must process frames in sequence.";
213 RTC_DCHECK(initialized_) << "VideoProcessor not initialized."; 217 RTC_DCHECK(initialized_) << "VideoProcessor not initialized.";
214 218
215 // Get frame from file. 219 // Get frame from file.
216 rtc::scoped_refptr<I420BufferInterface> buffer( 220 rtc::scoped_refptr<I420BufferInterface> buffer(
217 analysis_frame_reader_->ReadFrame()); 221 analysis_frame_reader_->ReadFrame());
218 RTC_CHECK(buffer) << "Tried to read too many frames from the file."; 222 RTC_CHECK(buffer) << "Tried to read too many frames from the file.";
219 const int64_t kNoRenderTime = 0; 223 const int64_t kNoRenderTime = 0;
220 VideoFrame source_frame(buffer, FrameNumberToTimestamp(frame_number), 224 VideoFrame source_frame(buffer, FrameNumberToTimestamp(frame_number),
(...skipping 20 matching lines...) Expand all
241 encoder_->Encode(source_frame, nullptr, &frame_types); 245 encoder_->Encode(source_frame, nullptr, &frame_types);
242 246
243 if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) { 247 if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) {
244 LOG(LS_WARNING) << "Failed to encode frame " << frame_number 248 LOG(LS_WARNING) << "Failed to encode frame " << frame_number
245 << ", return code: " << frame_stat->encode_return_code 249 << ", return code: " << frame_stat->encode_return_code
246 << "."; 250 << ".";
247 } 251 }
248 } 252 }
249 253
250 void VideoProcessor::SetRates(int bitrate_kbps, int framerate_fps) { 254 void VideoProcessor::SetRates(int bitrate_kbps, int framerate_fps) {
255 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
256
251 config_.codec_settings.maxFramerate = framerate_fps; 257 config_.codec_settings.maxFramerate = framerate_fps;
252 int set_rates_result = encoder_->SetRateAllocation( 258 int set_rates_result = encoder_->SetRateAllocation(
253 bitrate_allocator_->GetAllocation(bitrate_kbps * 1000, framerate_fps), 259 bitrate_allocator_->GetAllocation(bitrate_kbps * 1000, framerate_fps),
254 framerate_fps); 260 framerate_fps);
255 RTC_DCHECK_GE(set_rates_result, 0) 261 RTC_DCHECK_GE(set_rates_result, 0)
256 << "Failed to update encoder with new rate " << bitrate_kbps << "."; 262 << "Failed to update encoder with new rate " << bitrate_kbps << ".";
257 num_dropped_frames_ = 0; 263 num_dropped_frames_ = 0;
258 num_spatial_resizes_ = 0; 264 num_spatial_resizes_ = 0;
259 } 265 }
260 266
261 int VideoProcessor::GetQpFromEncoder(int frame_number) const { 267 int VideoProcessor::GetQpFromEncoder(int frame_number) const {
268 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
262 RTC_CHECK_LT(frame_number, frame_infos_.size()); 269 RTC_CHECK_LT(frame_number, frame_infos_.size());
263 return frame_infos_[frame_number].qp_encoder; 270 return frame_infos_[frame_number].qp_encoder;
264 } 271 }
265 272
266 int VideoProcessor::GetQpFromBitstream(int frame_number) const { 273 int VideoProcessor::GetQpFromBitstream(int frame_number) const {
274 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
267 RTC_CHECK_LT(frame_number, frame_infos_.size()); 275 RTC_CHECK_LT(frame_number, frame_infos_.size());
268 return frame_infos_[frame_number].qp_bitstream; 276 return frame_infos_[frame_number].qp_bitstream;
269 } 277 }
270 278
271 int VideoProcessor::NumberDroppedFrames() { 279 int VideoProcessor::NumberDroppedFrames() {
280 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
272 return num_dropped_frames_; 281 return num_dropped_frames_;
273 } 282 }
274 283
275 int VideoProcessor::NumberSpatialResizes() { 284 int VideoProcessor::NumberSpatialResizes() {
285 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
276 return num_spatial_resizes_; 286 return num_spatial_resizes_;
277 } 287 }
278 288
279 void VideoProcessor::FrameEncoded( 289 void VideoProcessor::FrameEncoded(
280 webrtc::VideoCodecType codec, 290 webrtc::VideoCodecType codec,
281 const EncodedImage& encoded_image, 291 const EncodedImage& encoded_image,
282 const webrtc::RTPFragmentationHeader* fragmentation) { 292 const webrtc::RTPFragmentationHeader* fragmentation) {
293 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
294
283 // For the highest measurement accuracy of the encode time, the start/stop 295 // For the highest measurement accuracy of the encode time, the start/stop
284 // time recordings should wrap the Encode call as tightly as possible. 296 // time recordings should wrap the Encode call as tightly as possible.
285 int64_t encode_stop_ns = rtc::TimeNanos(); 297 int64_t encode_stop_ns = rtc::TimeNanos();
286 298
287 if (encoded_frame_writer_) { 299 if (encoded_frame_writer_) {
288 RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec)); 300 RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec));
289 } 301 }
290 302
291 // Timestamp is proportional to frame number, so this gives us number of 303 // Timestamp is proportional to frame number, so this gives us number of
292 // dropped frames. 304 // dropped frames.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 if (decoded_frame_writer_) { 416 if (decoded_frame_writer_) {
405 RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(), 417 RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(),
406 decoded_frame_writer_->FrameLength()); 418 decoded_frame_writer_->FrameLength());
407 RTC_CHECK( 419 RTC_CHECK(
408 decoded_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data())); 420 decoded_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data()));
409 } 421 }
410 } 422 }
411 } 423 }
412 424
413 void VideoProcessor::FrameDecoded(const VideoFrame& image) { 425 void VideoProcessor::FrameDecoded(const VideoFrame& image) {
426 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
427
414 // For the highest measurement accuracy of the decode time, the start/stop 428 // For the highest measurement accuracy of the decode time, the start/stop
415 // time recordings should wrap the Decode call as tightly as possible. 429 // time recordings should wrap the Decode call as tightly as possible.
416 int64_t decode_stop_ns = rtc::TimeNanos(); 430 int64_t decode_stop_ns = rtc::TimeNanos();
417 431
418 // Update frame information and statistics. 432 // Update frame information and statistics.
419 int frame_number = TimestampToFrameNumber(image.timestamp()); 433 int frame_number = TimestampToFrameNumber(image.timestamp());
420 RTC_DCHECK_LT(frame_number, frame_infos_.size()); 434 RTC_DCHECK_LT(frame_number, frame_infos_.size());
421 FrameInfo* frame_info = &frame_infos_[frame_number]; 435 FrameInfo* frame_info = &frame_infos_[frame_number];
422 frame_info->decoded_width = image.width(); 436 frame_info->decoded_width = image.width();
423 frame_info->decoded_height = image.height(); 437 frame_info->decoded_height = image.height();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 RTC_CHECK(analysis_frame_writer_->WriteFrame(extracted_buffer.data())); 486 RTC_CHECK(analysis_frame_writer_->WriteFrame(extracted_buffer.data()));
473 if (decoded_frame_writer_) { 487 if (decoded_frame_writer_) {
474 RTC_DCHECK_EQ(extracted_length, decoded_frame_writer_->FrameLength()); 488 RTC_DCHECK_EQ(extracted_length, decoded_frame_writer_->FrameLength());
475 RTC_CHECK(decoded_frame_writer_->WriteFrame(extracted_buffer.data())); 489 RTC_CHECK(decoded_frame_writer_->WriteFrame(extracted_buffer.data()));
476 } 490 }
477 491
478 last_decoded_frame_buffer_ = std::move(extracted_buffer); 492 last_decoded_frame_buffer_ = std::move(extracted_buffer);
479 } 493 }
480 494
481 uint32_t VideoProcessor::FrameNumberToTimestamp(int frame_number) const { 495 uint32_t VideoProcessor::FrameNumberToTimestamp(int frame_number) const {
496 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
497
482 RTC_DCHECK_GE(frame_number, 0); 498 RTC_DCHECK_GE(frame_number, 0);
483 const int ticks_per_frame = 499 const int ticks_per_frame =
484 kRtpClockRateHz / config_.codec_settings.maxFramerate; 500 kRtpClockRateHz / config_.codec_settings.maxFramerate;
485 return (frame_number + 1) * ticks_per_frame; 501 return (frame_number + 1) * ticks_per_frame;
486 } 502 }
487 503
488 int VideoProcessor::TimestampToFrameNumber(uint32_t timestamp) const { 504 int VideoProcessor::TimestampToFrameNumber(uint32_t timestamp) const {
505 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
506
489 RTC_DCHECK_GT(timestamp, 0); 507 RTC_DCHECK_GT(timestamp, 0);
490 const int ticks_per_frame = 508 const int ticks_per_frame =
491 kRtpClockRateHz / config_.codec_settings.maxFramerate; 509 kRtpClockRateHz / config_.codec_settings.maxFramerate;
492 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0); 510 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0);
493 return (timestamp / ticks_per_frame) - 1; 511 return (timestamp / ticks_per_frame) - 1;
494 } 512 }
495 513
496 } // namespace test 514 } // namespace test
497 } // namespace webrtc 515 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/codecs/test/videoprocessor.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698