mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 22:30:40 +01:00

This CL removes MediaOptmization and folds some of its functionality into VideoStreamEncoder. The FPS tracking is now handled by a RateStatistics instance. Frame dropping is still handled by FrameDropper. Both of these now live directly in VideoStreamEncoder. There is no intended change in behavior from this CL, but due to a new way of measuring frame rate, some minor perf changes can be expected. A small change in behavior is that OnBitrateUpdated is now called directly rather than on the next frame. Since both encoding frame and setting rate allocations happen on the encoder worker thread, there's really no reason to cache bitrates and wait until the next frame. An edge case though is that if a new bitrate is set before the first frame, we must remember that bitrate and then apply it after the video bitrate allocator has been first created. In addition to existing unit tests, manual tests have been used to confirm that frame dropping works as expected with misbehaving encoders. Bug: webrtc:10164 Change-Id: I7ee9c8d3c4f2bcf23c8c420310b05a4d35d94744 Reviewed-on: https://webrtc-review.googlesource.com/c/115620 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26147}
153 lines
5.6 KiB
C++
153 lines
5.6 KiB
C++
/*
|
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
|
|
#define MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
|
|
|
|
#include <stdio.h>
|
|
#include <list>
|
|
#include <vector>
|
|
|
|
#include "api/units/data_rate.h"
|
|
#include "modules/video_coding/include/video_codec_interface.h"
|
|
#include "modules/video_coding/include/video_coding_defines.h"
|
|
#include "rtc_base/criticalsection.h"
|
|
#include "rtc_base/race_checker.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class VCMEncodedFrameCallback : public EncodedImageCallback {
|
|
public:
|
|
explicit VCMEncodedFrameCallback(EncodedImageCallback* post_encode_callback);
|
|
~VCMEncodedFrameCallback() override;
|
|
|
|
// Implements EncodedImageCallback.
|
|
EncodedImageCallback::Result OnEncodedImage(
|
|
const EncodedImage& encoded_image,
|
|
const CodecSpecificInfo* codec_specific_info,
|
|
const RTPFragmentationHeader* fragmentation) override;
|
|
|
|
void SetInternalSource(bool internal_source) {
|
|
internal_source_ = internal_source;
|
|
}
|
|
|
|
// Timing frames configuration methods. These 4 should be called before
|
|
// |OnEncodedImage| at least once.
|
|
void OnTargetBitrateChanged(size_t bitrate_bytes_per_sec,
|
|
size_t simulcast_svc_idx);
|
|
|
|
void OnFrameRateChanged(size_t framerate);
|
|
|
|
void OnEncodeStarted(uint32_t rtp_timestamps,
|
|
int64_t capture_time_ms,
|
|
size_t simulcast_svc_idx);
|
|
|
|
void SetTimingFramesThresholds(
|
|
const VideoCodec::TimingFrameTriggerThresholds& thresholds) {
|
|
rtc::CritScope crit(&timing_params_lock_);
|
|
timing_frames_thresholds_ = thresholds;
|
|
}
|
|
|
|
// Clears all data stored by OnEncodeStarted().
|
|
void Reset() {
|
|
rtc::CritScope crit(&timing_params_lock_);
|
|
timing_frames_info_.clear();
|
|
last_timing_frame_time_ms_ = -1;
|
|
reordered_frames_logged_messages_ = 0;
|
|
stalled_encoder_logged_messages_ = 0;
|
|
}
|
|
|
|
private:
|
|
// For non-internal-source encoders, returns encode started time and fixes
|
|
// capture timestamp for the frame, if corrupted by the encoder.
|
|
absl::optional<int64_t> ExtractEncodeStartTime(size_t simulcast_svc_idx,
|
|
EncodedImage* encoded_image)
|
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(timing_params_lock_);
|
|
|
|
void FillTimingInfo(size_t simulcast_svc_idx, EncodedImage* encoded_image);
|
|
|
|
rtc::CriticalSection timing_params_lock_;
|
|
bool internal_source_;
|
|
EncodedImageCallback* const post_encode_callback_;
|
|
|
|
struct EncodeStartTimeRecord {
|
|
EncodeStartTimeRecord(uint32_t timestamp,
|
|
int64_t capture_time,
|
|
int64_t encode_start_time)
|
|
: rtp_timestamp(timestamp),
|
|
capture_time_ms(capture_time),
|
|
encode_start_time_ms(encode_start_time) {}
|
|
uint32_t rtp_timestamp;
|
|
int64_t capture_time_ms;
|
|
int64_t encode_start_time_ms;
|
|
};
|
|
struct TimingFramesLayerInfo {
|
|
TimingFramesLayerInfo();
|
|
~TimingFramesLayerInfo();
|
|
size_t target_bitrate_bytes_per_sec = 0;
|
|
std::list<EncodeStartTimeRecord> encode_start_list;
|
|
};
|
|
// Separate instance for each simulcast stream or spatial layer.
|
|
std::vector<TimingFramesLayerInfo> timing_frames_info_
|
|
RTC_GUARDED_BY(timing_params_lock_);
|
|
size_t framerate_ RTC_GUARDED_BY(timing_params_lock_);
|
|
int64_t last_timing_frame_time_ms_ RTC_GUARDED_BY(timing_params_lock_);
|
|
VideoCodec::TimingFrameTriggerThresholds timing_frames_thresholds_
|
|
RTC_GUARDED_BY(timing_params_lock_);
|
|
size_t incorrect_capture_time_logged_messages_
|
|
RTC_GUARDED_BY(timing_params_lock_);
|
|
size_t reordered_frames_logged_messages_ RTC_GUARDED_BY(timing_params_lock_);
|
|
size_t stalled_encoder_logged_messages_ RTC_GUARDED_BY(timing_params_lock_);
|
|
|
|
// Experiment groups parsed from field trials for realtime video ([0]) and
|
|
// screenshare ([1]). 0 means no group specified. Positive values are
|
|
// experiment group numbers incremented by 1.
|
|
uint8_t experiment_groups_[2];
|
|
};
|
|
|
|
class VCMGenericEncoder {
|
|
friend class VCMCodecDataBase;
|
|
|
|
public:
|
|
VCMGenericEncoder(VideoEncoder* encoder,
|
|
VCMEncodedFrameCallback* encoded_frame_callback,
|
|
bool internal_source);
|
|
~VCMGenericEncoder();
|
|
int32_t Release();
|
|
int32_t InitEncode(const VideoCodec* settings,
|
|
int32_t number_of_cores,
|
|
size_t max_payload_size);
|
|
int32_t Encode(const VideoFrame& frame,
|
|
const CodecSpecificInfo* codec_specific,
|
|
const std::vector<FrameType>& frame_types);
|
|
|
|
void SetEncoderParameters(const VideoBitrateAllocation& target_bitrate,
|
|
uint32_t input_frame_rate);
|
|
|
|
int32_t RequestFrame(const std::vector<FrameType>& frame_types);
|
|
bool InternalSource() const;
|
|
VideoEncoder::EncoderInfo GetEncoderInfo() const;
|
|
|
|
private:
|
|
rtc::RaceChecker race_checker_;
|
|
|
|
VideoEncoder* const encoder_ RTC_GUARDED_BY(race_checker_);
|
|
VCMEncodedFrameCallback* const vcm_encoded_frame_callback_;
|
|
const bool internal_source_;
|
|
rtc::CriticalSection params_lock_;
|
|
VideoBitrateAllocation bitrate_allocation_ RTC_GUARDED_BY(params_lock_);
|
|
uint32_t input_frame_rate_ RTC_GUARDED_BY(params_lock_);
|
|
size_t streams_or_svc_num_ RTC_GUARDED_BY(race_checker_);
|
|
VideoCodecType codec_type_ RTC_GUARDED_BY(race_checker_);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
|