| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|