/* * 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 #include #include #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 { namespace media_optimization { class MediaOptimization; } // namespace media_optimization struct EncoderParameters { VideoBitrateAllocation target_bitrate; uint8_t loss_rate; int64_t rtt; uint32_t input_frame_rate; }; class VCMEncodedFrameCallback : public EncodedImageCallback { public: VCMEncodedFrameCallback(EncodedImageCallback* post_encode_callback, media_optimization::MediaOptimization* media_opt); virtual ~VCMEncodedFrameCallback(); // 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. rtc::Optional 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_; media_optimization::MediaOptimization* const media_opt_; 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 { size_t target_bitrate_bytes_per_sec = 0; std::list encode_start_list; }; // Separate instance for each simulcast stream or spatial layer. std::vector 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& frame_types); void SetEncoderParameters(const EncoderParameters& params); EncoderParameters GetEncoderParameters() const; int32_t RequestFrame(const std::vector& frame_types); bool InternalSource() const; bool SupportsNativeHandle() 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_; EncoderParameters encoder_params_ 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_