123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- * Copyright (c) 2019 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 VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
- #define VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
- #include <list>
- #include <vector>
- #include "absl/types/optional.h"
- #include "api/video/encoded_image.h"
- #include "api/video_codecs/video_codec.h"
- #include "api/video_codecs/video_encoder.h"
- #include "modules/video_coding/include/video_codec_interface.h"
- #include "rtc_base/synchronization/mutex.h"
- namespace webrtc {
- class FrameEncodeMetadataWriter {
- public:
- explicit FrameEncodeMetadataWriter(EncodedImageCallback* frame_drop_callback);
- ~FrameEncodeMetadataWriter();
- void OnEncoderInit(const VideoCodec& codec, bool internal_source);
- void OnSetRates(const VideoBitrateAllocation& bitrate_allocation,
- uint32_t framerate_fps);
- void OnEncodeStarted(const VideoFrame& frame);
- void FillTimingInfo(size_t simulcast_svc_idx, EncodedImage* encoded_image);
- void UpdateBitstream(const CodecSpecificInfo* codec_specific_info,
- EncodedImage* encoded_image);
- void Reset();
- private:
- size_t NumSpatialLayers() const RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_);
- // 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> ExtractEncodeStartTimeAndFillMetadata(
- size_t simulcast_svc_idx,
- EncodedImage* encoded_image) RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_);
- struct FrameMetadata {
- uint32_t rtp_timestamp;
- int64_t encode_start_time_ms;
- int64_t ntp_time_ms = 0;
- int64_t timestamp_us = 0;
- VideoRotation rotation = kVideoRotation_0;
- absl::optional<ColorSpace> color_space;
- RtpPacketInfos packet_infos;
- };
- struct TimingFramesLayerInfo {
- TimingFramesLayerInfo();
- ~TimingFramesLayerInfo();
- size_t target_bitrate_bytes_per_sec = 0;
- std::list<FrameMetadata> frames;
- };
- Mutex lock_;
- EncodedImageCallback* const frame_drop_callback_;
- VideoCodec codec_settings_ RTC_GUARDED_BY(&lock_);
- bool internal_source_ RTC_GUARDED_BY(&lock_);
- uint32_t framerate_fps_ RTC_GUARDED_BY(&lock_);
- // Separate instance for each simulcast stream or spatial layer.
- std::vector<TimingFramesLayerInfo> timing_frames_info_ RTC_GUARDED_BY(&lock_);
- int64_t last_timing_frame_time_ms_ RTC_GUARDED_BY(&lock_);
- size_t reordered_frames_logged_messages_ RTC_GUARDED_BY(&lock_);
- size_t stalled_encoder_logged_messages_ RTC_GUARDED_BY(&lock_);
- };
- } // namespace webrtc
- #endif // VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
|