| Index: webrtc/modules/video_coding/codecs/test/videoprocessor.cc
|
| diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor.cc b/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
|
| index 21fd67fbee84b749d6ed689c0dd8d92c8f28f3d4..8bd8697971379653b17f078f6362721c58c23d25 100644
|
| --- a/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
|
| +++ b/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
|
| @@ -129,16 +129,17 @@ VideoProcessorImpl::VideoProcessorImpl(webrtc::VideoEncoder* encoder,
|
| : encoder_(encoder),
|
| decoder_(decoder),
|
| bitrate_allocator_(CreateBitrateAllocator(config)),
|
| - encode_callback_(new VideoProcessorEncodeCompleteCallback(this)),
|
| - decode_callback_(new VideoProcessorDecodeCompleteCallback(this)),
|
| packet_manipulator_(packet_manipulator),
|
| config_(config),
|
| analysis_frame_reader_(analysis_frame_reader),
|
| analysis_frame_writer_(analysis_frame_writer),
|
| + num_frames_(analysis_frame_reader->NumberOfFrames()),
|
| source_frame_writer_(source_frame_writer),
|
| encoded_frame_writer_(encoded_frame_writer),
|
| decoded_frame_writer_(decoded_frame_writer),
|
| initialized_(false),
|
| + frame_infos_(num_frames_),
|
| + last_inputed_frame_num_(-1),
|
| last_encoded_frame_num_(-1),
|
| last_decoded_frame_num_(-1),
|
| first_key_frame_has_been_excluded_(false),
|
| @@ -152,17 +153,23 @@ VideoProcessorImpl::VideoProcessorImpl(webrtc::VideoEncoder* encoder,
|
| RTC_DCHECK(analysis_frame_reader);
|
| RTC_DCHECK(analysis_frame_writer);
|
| RTC_DCHECK(stats);
|
| - frame_infos_.reserve(analysis_frame_reader->NumberOfFrames());
|
| +
|
| + task_checker_.Detach();
|
| }
|
|
|
| +VideoProcessorImpl::~VideoProcessorImpl() {}
|
| +
|
| void VideoProcessorImpl::Init() {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK(!initialized_) << "VideoProcessor already initialized.";
|
| initialized_ = true;
|
|
|
| // Setup required callbacks for the encoder/decoder.
|
| + encode_callback_.reset(new VideoProcessorEncodeCompleteCallback(this));
|
| RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()),
|
| WEBRTC_VIDEO_CODEC_OK)
|
| << "Failed to register encode complete callback";
|
| + decode_callback_.reset(new VideoProcessorDecodeCompleteCallback(this));
|
| RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()),
|
| WEBRTC_VIDEO_CODEC_OK)
|
| << "Failed to register decode complete callback";
|
| @@ -183,8 +190,7 @@ void VideoProcessorImpl::Init() {
|
| if (config_.verbose) {
|
| printf("Video Processor:\n");
|
| printf(" #CPU cores used : %d\n", num_cores);
|
| - printf(" Total # of frames: %d\n",
|
| - analysis_frame_reader_->NumberOfFrames());
|
| + printf(" Total # of frames: %d\n", num_frames_);
|
| printf(" Codec settings:\n");
|
| printf(" Encoder implementation name: %s\n",
|
| encoder_->ImplementationName());
|
| @@ -201,12 +207,20 @@ void VideoProcessorImpl::Init() {
|
| }
|
| }
|
|
|
| -VideoProcessorImpl::~VideoProcessorImpl() {
|
| +void VideoProcessorImpl::Release() {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| + RTC_DCHECK(initialized_) << "VideoProcessor is not initialized.";
|
| + initialized_ = false;
|
| +
|
| encoder_->RegisterEncodeCompleteCallback(nullptr);
|
| decoder_->RegisterDecodeCompleteCallback(nullptr);
|
| +
|
| + RTC_DCHECK_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
|
| + RTC_DCHECK_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release());
|
| }
|
|
|
| void VideoProcessorImpl::SetRates(int bit_rate, int frame_rate) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| int set_rates_result = encoder_->SetRateAllocation(
|
| bitrate_allocator_->GetAllocation(bit_rate * 1000, frame_rate),
|
| frame_rate);
|
| @@ -217,36 +231,43 @@ void VideoProcessorImpl::SetRates(int bit_rate, int frame_rate) {
|
| }
|
|
|
| size_t VideoProcessorImpl::EncodedFrameSize(int frame_number) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK_LT(frame_number, frame_infos_.size());
|
| return frame_infos_[frame_number].encoded_frame_size;
|
| }
|
|
|
| FrameType VideoProcessorImpl::EncodedFrameType(int frame_number) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK_LT(frame_number, frame_infos_.size());
|
| return frame_infos_[frame_number].encoded_frame_type;
|
| }
|
|
|
| int VideoProcessorImpl::GetQpFromEncoder(int frame_number) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK_LT(frame_number, frame_infos_.size());
|
| return frame_infos_[frame_number].qp_encoder;
|
| }
|
|
|
| int VideoProcessorImpl::GetQpFromBitstream(int frame_number) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK_LT(frame_number, frame_infos_.size());
|
| return frame_infos_[frame_number].qp_bitstream;
|
| }
|
|
|
| int VideoProcessorImpl::NumberDroppedFrames() {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| return num_dropped_frames_;
|
| }
|
|
|
| int VideoProcessorImpl::NumberSpatialResizes() {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| return num_spatial_resizes_;
|
| }
|
|
|
| bool VideoProcessorImpl::ProcessFrame(int frame_number) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| RTC_DCHECK_GE(frame_number, 0);
|
| - RTC_DCHECK_LE(frame_number, frame_infos_.size())
|
| + RTC_DCHECK_EQ(frame_number, ++last_inputed_frame_num_)
|
| << "Must process frames without gaps.";
|
| RTC_DCHECK(initialized_) << "VideoProcessor not initialized.";
|
|
|
| @@ -271,11 +292,6 @@ bool VideoProcessorImpl::ProcessFrame(int frame_number) {
|
| uint32_t timestamp = FrameNumberToTimestamp(frame_number);
|
| VideoFrame source_frame(buffer, timestamp, 0, webrtc::kVideoRotation_0);
|
|
|
| - // Store frame information during the different stages of encode and decode.
|
| - frame_infos_.emplace_back();
|
| - FrameInfo* frame_info = &frame_infos_.back();
|
| - frame_info->timestamp = timestamp;
|
| -
|
| // Decide if we are going to force a keyframe.
|
| std::vector<FrameType> frame_types(1, kVideoFrameDelta);
|
| if (config_.keyframe_interval > 0 &&
|
| @@ -283,6 +299,10 @@ bool VideoProcessorImpl::ProcessFrame(int frame_number) {
|
| frame_types[0] = kVideoFrameKey;
|
| }
|
|
|
| + // Store frame information during the different stages of encode and decode.
|
| + RTC_DCHECK_LT(frame_number, frame_infos_.size());
|
| + FrameInfo* frame_info = &frame_infos_[frame_number];
|
| +
|
| // Create frame statistics object used for aggregation at end of test run.
|
| FrameStatistic* frame_stat = &stats_->NewFrame(frame_number);
|
|
|
| @@ -304,8 +324,12 @@ void VideoProcessorImpl::FrameEncoded(
|
| webrtc::VideoCodecType codec,
|
| const EncodedImage& encoded_image,
|
| const webrtc::RTPFragmentationHeader* fragmentation) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| +
|
| // For the highest measurement accuracy of the encode time, the start/stop
|
| // time recordings should wrap the Encode call as tightly as possible.
|
| + // TODO(brandtr): Consider moving this measurement into the callback wrapper
|
| + // class.
|
| int64_t encode_stop_ns = rtc::TimeNanos();
|
|
|
| if (encoded_frame_writer_) {
|
| @@ -339,6 +363,7 @@ void VideoProcessorImpl::FrameEncoded(
|
| }
|
| }
|
|
|
| + RTC_DCHECK_LT(last_encoded_frame_num_, frame_infos_.size());
|
| last_frame_missing =
|
| (frame_infos_[last_encoded_frame_num_].manipulated_length == 0);
|
| }
|
| @@ -437,8 +462,12 @@ void VideoProcessorImpl::FrameEncoded(
|
| }
|
|
|
| void VideoProcessorImpl::FrameDecoded(const VideoFrame& image) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
|
| +
|
| // For the highest measurement accuracy of the decode time, the start/stop
|
| // time recordings should wrap the Decode call as tightly as possible.
|
| + // TODO(brandtr): Consider moving this measurement into the callback wrapper
|
| + // class.
|
| int64_t decode_stop_ns = rtc::TimeNanos();
|
|
|
| // Update frame information and statistics.
|
|
|