| /* | |
| * 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 "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. | |
| 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_; | |
| 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<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 EncoderParameters& params); | |
| EncoderParameters GetEncoderParameters() const; | |
| int32_t RequestFrame(const std::vector<FrameType>& 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_ |