| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 case kExcludeOnlyFirstKeyFrame: | 98 case kExcludeOnlyFirstKeyFrame: |
| 99 return "ExcludeOnlyFirstKeyFrame"; | 99 return "ExcludeOnlyFirstKeyFrame"; |
| 100 case kExcludeAllKeyFrames: | 100 case kExcludeAllKeyFrames: |
| 101 return "ExcludeAllKeyFrames"; | 101 return "ExcludeAllKeyFrames"; |
| 102 default: | 102 default: |
| 103 RTC_NOTREACHED(); | 103 RTC_NOTREACHED(); |
| 104 return "Unknown"; | 104 return "Unknown"; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 VideoProcessorImpl::VideoProcessorImpl(webrtc::VideoEncoder* encoder, | 108 VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder, |
| 109 webrtc::VideoDecoder* decoder, | 109 webrtc::VideoDecoder* decoder, |
| 110 FrameReader* analysis_frame_reader, | 110 FrameReader* analysis_frame_reader, |
| 111 FrameWriter* analysis_frame_writer, | 111 FrameWriter* analysis_frame_writer, |
| 112 PacketManipulator* packet_manipulator, | 112 PacketManipulator* packet_manipulator, |
| 113 const TestConfig& config, | 113 const TestConfig& config, |
| 114 Stats* stats, | 114 Stats* stats, |
| 115 FrameWriter* source_frame_writer, | 115 FrameWriter* source_frame_writer, |
| 116 IvfFileWriter* encoded_frame_writer, | 116 IvfFileWriter* encoded_frame_writer, |
| 117 FrameWriter* decoded_frame_writer) | 117 FrameWriter* decoded_frame_writer) |
| 118 : encoder_(encoder), | 118 : encoder_(encoder), |
| 119 decoder_(decoder), | 119 decoder_(decoder), |
| 120 bitrate_allocator_(CreateBitrateAllocator(config)), | 120 bitrate_allocator_(CreateBitrateAllocator(config)), |
| 121 encode_callback_(new VideoProcessorEncodeCompleteCallback(this)), | 121 encode_callback_(new VideoProcessorEncodeCompleteCallback(this)), |
| 122 decode_callback_(new VideoProcessorDecodeCompleteCallback(this)), | 122 decode_callback_(new VideoProcessorDecodeCompleteCallback(this)), |
| 123 packet_manipulator_(packet_manipulator), | 123 packet_manipulator_(packet_manipulator), |
| 124 config_(config), | 124 config_(config), |
| 125 analysis_frame_reader_(analysis_frame_reader), | 125 analysis_frame_reader_(analysis_frame_reader), |
| 126 analysis_frame_writer_(analysis_frame_writer), | 126 analysis_frame_writer_(analysis_frame_writer), |
| 127 source_frame_writer_(source_frame_writer), | 127 source_frame_writer_(source_frame_writer), |
| 128 encoded_frame_writer_(encoded_frame_writer), | 128 encoded_frame_writer_(encoded_frame_writer), |
| 129 decoded_frame_writer_(decoded_frame_writer), | 129 decoded_frame_writer_(decoded_frame_writer), |
| 130 initialized_(false), | 130 initialized_(false), |
| 131 last_encoded_frame_num_(-1), | 131 last_encoded_frame_num_(-1), |
| 132 last_decoded_frame_num_(-1), | 132 last_decoded_frame_num_(-1), |
| 133 first_key_frame_has_been_excluded_(false), | 133 first_key_frame_has_been_excluded_(false), |
| 134 last_decoded_frame_buffer_(0, analysis_frame_reader->FrameLength()), | 134 last_decoded_frame_buffer_(0, analysis_frame_reader->FrameLength()), |
| 135 stats_(stats), | 135 stats_(stats), |
| 136 num_dropped_frames_(0), | 136 num_dropped_frames_(0), |
| 137 num_spatial_resizes_(0) { | 137 num_spatial_resizes_(0) { |
| 138 RTC_DCHECK(encoder); | 138 RTC_DCHECK(encoder); |
| 139 RTC_DCHECK(decoder); | 139 RTC_DCHECK(decoder); |
| 140 RTC_DCHECK(packet_manipulator); | 140 RTC_DCHECK(packet_manipulator); |
| 141 RTC_DCHECK(analysis_frame_reader); | 141 RTC_DCHECK(analysis_frame_reader); |
| 142 RTC_DCHECK(analysis_frame_writer); | 142 RTC_DCHECK(analysis_frame_writer); |
| 143 RTC_DCHECK(stats); | 143 RTC_DCHECK(stats); |
| 144 frame_infos_.reserve(analysis_frame_reader->NumberOfFrames()); | 144 frame_infos_.reserve(analysis_frame_reader->NumberOfFrames()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 VideoProcessorImpl::~VideoProcessorImpl() { | 147 VideoProcessor::~VideoProcessor() { |
| 148 encoder_->RegisterEncodeCompleteCallback(nullptr); | 148 encoder_->RegisterEncodeCompleteCallback(nullptr); |
| 149 decoder_->RegisterDecodeCompleteCallback(nullptr); | 149 decoder_->RegisterDecodeCompleteCallback(nullptr); |
| 150 } | 150 } |
| 151 | 151 |
| 152 void VideoProcessorImpl::Init() { | 152 void VideoProcessor::Init() { |
| 153 RTC_DCHECK(!initialized_) << "VideoProcessor already initialized."; | 153 RTC_DCHECK(!initialized_) << "VideoProcessor already initialized."; |
| 154 RTC_DCHECK(config_.codec_settings) << "No codec settings supplied."; | 154 RTC_DCHECK(config_.codec_settings) << "No codec settings supplied."; |
| 155 initialized_ = true; | 155 initialized_ = true; |
| 156 | 156 |
| 157 // Setup required callbacks for the encoder and decoder. | 157 // Setup required callbacks for the encoder and decoder. |
| 158 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()), | 158 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()), |
| 159 WEBRTC_VIDEO_CODEC_OK) | 159 WEBRTC_VIDEO_CODEC_OK) |
| 160 << "Failed to register encode complete callback"; | 160 << "Failed to register encode complete callback"; |
| 161 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()), | 161 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()), |
| 162 WEBRTC_VIDEO_CODEC_OK) | 162 WEBRTC_VIDEO_CODEC_OK) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 189 printf(" Codec implementation name : %s_%s\n", | 189 printf(" Codec implementation name : %s_%s\n", |
| 190 CodecTypeToPayloadName(config_.codec_settings->codecType) | 190 CodecTypeToPayloadName(config_.codec_settings->codecType) |
| 191 .value_or("Unknown"), | 191 .value_or("Unknown"), |
| 192 encoder_->ImplementationName()); | 192 encoder_->ImplementationName()); |
| 193 } | 193 } |
| 194 PrintCodecSettings(config_.codec_settings); | 194 PrintCodecSettings(config_.codec_settings); |
| 195 printf("\n"); | 195 printf("\n"); |
| 196 } | 196 } |
| 197 } | 197 } |
| 198 | 198 |
| 199 bool VideoProcessorImpl::ProcessFrame(int frame_number) { | 199 bool VideoProcessor::ProcessFrame(int frame_number) { |
| 200 RTC_DCHECK_GE(frame_number, 0); | 200 RTC_DCHECK_GE(frame_number, 0); |
| 201 RTC_DCHECK_LE(frame_number, frame_infos_.size()) | 201 RTC_DCHECK_LE(frame_number, frame_infos_.size()) |
| 202 << "Must process frames without gaps."; | 202 << "Must process frames without gaps."; |
| 203 RTC_DCHECK(initialized_) << "VideoProcessor not initialized."; | 203 RTC_DCHECK(initialized_) << "VideoProcessor not initialized."; |
| 204 | 204 |
| 205 rtc::scoped_refptr<I420BufferInterface> buffer( | 205 rtc::scoped_refptr<I420BufferInterface> buffer( |
| 206 analysis_frame_reader_->ReadFrame()); | 206 analysis_frame_reader_->ReadFrame()); |
| 207 | 207 |
| 208 if (!buffer) { | 208 if (!buffer) { |
| 209 // Last frame has been reached. | 209 // Last frame has been reached. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 | 246 |
| 247 if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) { | 247 if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) { |
| 248 LOG(LS_WARNING) << "Failed to encode frame " << frame_number | 248 LOG(LS_WARNING) << "Failed to encode frame " << frame_number |
| 249 << ", return code: " << frame_stat->encode_return_code | 249 << ", return code: " << frame_stat->encode_return_code |
| 250 << "."; | 250 << "."; |
| 251 } | 251 } |
| 252 | 252 |
| 253 return true; | 253 return true; |
| 254 } | 254 } |
| 255 | 255 |
| 256 void VideoProcessorImpl::SetRates(int bit_rate, int frame_rate) { | 256 void VideoProcessor::SetRates(int bit_rate, int frame_rate) { |
| 257 config_.codec_settings->maxFramerate = frame_rate; | 257 config_.codec_settings->maxFramerate = frame_rate; |
| 258 int set_rates_result = encoder_->SetRateAllocation( | 258 int set_rates_result = encoder_->SetRateAllocation( |
| 259 bitrate_allocator_->GetAllocation(bit_rate * 1000, frame_rate), | 259 bitrate_allocator_->GetAllocation(bit_rate * 1000, frame_rate), |
| 260 frame_rate); | 260 frame_rate); |
| 261 RTC_DCHECK_GE(set_rates_result, 0) | 261 RTC_DCHECK_GE(set_rates_result, 0) |
| 262 << "Failed to update encoder with new rate " << bit_rate; | 262 << "Failed to update encoder with new rate " << bit_rate; |
| 263 num_dropped_frames_ = 0; | 263 num_dropped_frames_ = 0; |
| 264 num_spatial_resizes_ = 0; | 264 num_spatial_resizes_ = 0; |
| 265 } | 265 } |
| 266 | 266 |
| 267 size_t VideoProcessorImpl::EncodedFrameSize(int frame_number) { | 267 size_t VideoProcessor::EncodedFrameSize(int frame_number) { |
| 268 RTC_DCHECK_LT(frame_number, frame_infos_.size()); | 268 RTC_DCHECK_LT(frame_number, frame_infos_.size()); |
| 269 return frame_infos_[frame_number].encoded_frame_size; | 269 return frame_infos_[frame_number].encoded_frame_size; |
| 270 } | 270 } |
| 271 | 271 |
| 272 FrameType VideoProcessorImpl::EncodedFrameType(int frame_number) { | 272 FrameType VideoProcessor::EncodedFrameType(int frame_number) { |
| 273 RTC_DCHECK_LT(frame_number, frame_infos_.size()); | 273 RTC_DCHECK_LT(frame_number, frame_infos_.size()); |
| 274 return frame_infos_[frame_number].encoded_frame_type; | 274 return frame_infos_[frame_number].encoded_frame_type; |
| 275 } | 275 } |
| 276 | 276 |
| 277 int VideoProcessorImpl::GetQpFromEncoder(int frame_number) { | 277 int VideoProcessor::GetQpFromEncoder(int frame_number) { |
| 278 RTC_DCHECK_LT(frame_number, frame_infos_.size()); | 278 RTC_DCHECK_LT(frame_number, frame_infos_.size()); |
| 279 return frame_infos_[frame_number].qp_encoder; | 279 return frame_infos_[frame_number].qp_encoder; |
| 280 } | 280 } |
| 281 | 281 |
| 282 int VideoProcessorImpl::GetQpFromBitstream(int frame_number) { | 282 int VideoProcessor::GetQpFromBitstream(int frame_number) { |
| 283 RTC_DCHECK_LT(frame_number, frame_infos_.size()); | 283 RTC_DCHECK_LT(frame_number, frame_infos_.size()); |
| 284 return frame_infos_[frame_number].qp_bitstream; | 284 return frame_infos_[frame_number].qp_bitstream; |
| 285 } | 285 } |
| 286 | 286 |
| 287 int VideoProcessorImpl::NumberDroppedFrames() { | 287 int VideoProcessor::NumberDroppedFrames() { |
| 288 return num_dropped_frames_; | 288 return num_dropped_frames_; |
| 289 } | 289 } |
| 290 | 290 |
| 291 int VideoProcessorImpl::NumberSpatialResizes() { | 291 int VideoProcessor::NumberSpatialResizes() { |
| 292 return num_spatial_resizes_; | 292 return num_spatial_resizes_; |
| 293 } | 293 } |
| 294 | 294 |
| 295 void VideoProcessorImpl::FrameEncoded( | 295 void VideoProcessor::FrameEncoded( |
| 296 webrtc::VideoCodecType codec, | 296 webrtc::VideoCodecType codec, |
| 297 const EncodedImage& encoded_image, | 297 const EncodedImage& encoded_image, |
| 298 const webrtc::RTPFragmentationHeader* fragmentation) { | 298 const webrtc::RTPFragmentationHeader* fragmentation) { |
| 299 // For the highest measurement accuracy of the encode time, the start/stop | 299 // For the highest measurement accuracy of the encode time, the start/stop |
| 300 // time recordings should wrap the Encode call as tightly as possible. | 300 // time recordings should wrap the Encode call as tightly as possible. |
| 301 int64_t encode_stop_ns = rtc::TimeNanos(); | 301 int64_t encode_stop_ns = rtc::TimeNanos(); |
| 302 | 302 |
| 303 if (encoded_frame_writer_) { | 303 if (encoded_frame_writer_) { |
| 304 RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec)); | 304 RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec)); |
| 305 } | 305 } |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 analysis_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data())); | 421 analysis_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data())); |
| 422 if (decoded_frame_writer_) { | 422 if (decoded_frame_writer_) { |
| 423 RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(), | 423 RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(), |
| 424 decoded_frame_writer_->FrameLength()); | 424 decoded_frame_writer_->FrameLength()); |
| 425 RTC_CHECK( | 425 RTC_CHECK( |
| 426 decoded_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data())); | 426 decoded_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data())); |
| 427 } | 427 } |
| 428 } | 428 } |
| 429 } | 429 } |
| 430 | 430 |
| 431 void VideoProcessorImpl::FrameDecoded(const VideoFrame& image) { | 431 void VideoProcessor::FrameDecoded(const VideoFrame& image) { |
| 432 // For the highest measurement accuracy of the decode time, the start/stop | 432 // For the highest measurement accuracy of the decode time, the start/stop |
| 433 // time recordings should wrap the Decode call as tightly as possible. | 433 // time recordings should wrap the Decode call as tightly as possible. |
| 434 int64_t decode_stop_ns = rtc::TimeNanos(); | 434 int64_t decode_stop_ns = rtc::TimeNanos(); |
| 435 | 435 |
| 436 // Update frame information and statistics. | 436 // Update frame information and statistics. |
| 437 int frame_number = TimestampToFrameNumber(image.timestamp()); | 437 int frame_number = TimestampToFrameNumber(image.timestamp()); |
| 438 RTC_DCHECK_LT(frame_number, frame_infos_.size()); | 438 RTC_DCHECK_LT(frame_number, frame_infos_.size()); |
| 439 FrameInfo* frame_info = &frame_infos_[frame_number]; | 439 FrameInfo* frame_info = &frame_infos_[frame_number]; |
| 440 frame_info->decoded_width = image.width(); | 440 frame_info->decoded_width = image.width(); |
| 441 frame_info->decoded_height = image.height(); | 441 frame_info->decoded_height = image.height(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 RTC_DCHECK_EQ(extracted_length, analysis_frame_writer_->FrameLength()); | 489 RTC_DCHECK_EQ(extracted_length, analysis_frame_writer_->FrameLength()); |
| 490 RTC_CHECK(analysis_frame_writer_->WriteFrame(extracted_buffer.data())); | 490 RTC_CHECK(analysis_frame_writer_->WriteFrame(extracted_buffer.data())); |
| 491 if (decoded_frame_writer_) { | 491 if (decoded_frame_writer_) { |
| 492 RTC_DCHECK_EQ(extracted_length, decoded_frame_writer_->FrameLength()); | 492 RTC_DCHECK_EQ(extracted_length, decoded_frame_writer_->FrameLength()); |
| 493 RTC_CHECK(decoded_frame_writer_->WriteFrame(extracted_buffer.data())); | 493 RTC_CHECK(decoded_frame_writer_->WriteFrame(extracted_buffer.data())); |
| 494 } | 494 } |
| 495 | 495 |
| 496 last_decoded_frame_buffer_ = std::move(extracted_buffer); | 496 last_decoded_frame_buffer_ = std::move(extracted_buffer); |
| 497 } | 497 } |
| 498 | 498 |
| 499 uint32_t VideoProcessorImpl::FrameNumberToTimestamp(int frame_number) { | 499 uint32_t VideoProcessor::FrameNumberToTimestamp(int frame_number) { |
| 500 RTC_DCHECK_GE(frame_number, 0); | 500 RTC_DCHECK_GE(frame_number, 0); |
| 501 const int ticks_per_frame = | 501 const int ticks_per_frame = |
| 502 kRtpClockRateHz / config_.codec_settings->maxFramerate; | 502 kRtpClockRateHz / config_.codec_settings->maxFramerate; |
| 503 return (frame_number + 1) * ticks_per_frame; | 503 return (frame_number + 1) * ticks_per_frame; |
| 504 } | 504 } |
| 505 | 505 |
| 506 int VideoProcessorImpl::TimestampToFrameNumber(uint32_t timestamp) { | 506 int VideoProcessor::TimestampToFrameNumber(uint32_t timestamp) { |
| 507 RTC_DCHECK_GT(timestamp, 0); | 507 RTC_DCHECK_GT(timestamp, 0); |
| 508 const int ticks_per_frame = | 508 const int ticks_per_frame = |
| 509 kRtpClockRateHz / config_.codec_settings->maxFramerate; | 509 kRtpClockRateHz / config_.codec_settings->maxFramerate; |
| 510 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0); | 510 RTC_DCHECK_EQ(timestamp % ticks_per_frame, 0); |
| 511 return (timestamp / ticks_per_frame) - 1; | 511 return (timestamp / ticks_per_frame) - 1; |
| 512 } | 512 } |
| 513 | 513 |
| 514 } // namespace test | 514 } // namespace test |
| 515 } // namespace webrtc | 515 } // namespace webrtc |
| OLD | NEW |