xref: /aosp_15_r20/external/webrtc/video/frame_encode_metadata_writer.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <list>
15*d9f75844SAndroid Build Coastguard Worker #include <vector>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/video/encoded_image.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_codec.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_encoder.h"
21*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/include/video_codec_interface.h"
22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker class FrameEncodeMetadataWriter {
27*d9f75844SAndroid Build Coastguard Worker  public:
28*d9f75844SAndroid Build Coastguard Worker   explicit FrameEncodeMetadataWriter(EncodedImageCallback* frame_drop_callback);
29*d9f75844SAndroid Build Coastguard Worker   ~FrameEncodeMetadataWriter();
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker   void OnEncoderInit(const VideoCodec& codec);
32*d9f75844SAndroid Build Coastguard Worker   void OnSetRates(const VideoBitrateAllocation& bitrate_allocation,
33*d9f75844SAndroid Build Coastguard Worker                   uint32_t framerate_fps);
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker   void OnEncodeStarted(const VideoFrame& frame);
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker   void FillTimingInfo(size_t simulcast_svc_idx, EncodedImage* encoded_image);
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker   void UpdateBitstream(const CodecSpecificInfo* codec_specific_info,
40*d9f75844SAndroid Build Coastguard Worker                        EncodedImage* encoded_image);
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker   void Reset();
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker  private:
45*d9f75844SAndroid Build Coastguard Worker   // For non-internal-source encoders, returns encode started time and fixes
46*d9f75844SAndroid Build Coastguard Worker   // capture timestamp for the frame, if corrupted by the encoder.
47*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> ExtractEncodeStartTimeAndFillMetadata(
48*d9f75844SAndroid Build Coastguard Worker       size_t simulcast_svc_idx,
49*d9f75844SAndroid Build Coastguard Worker       EncodedImage* encoded_image) RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_);
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker   struct FrameMetadata {
52*d9f75844SAndroid Build Coastguard Worker     uint32_t rtp_timestamp;
53*d9f75844SAndroid Build Coastguard Worker     int64_t encode_start_time_ms;
54*d9f75844SAndroid Build Coastguard Worker     int64_t ntp_time_ms = 0;
55*d9f75844SAndroid Build Coastguard Worker     int64_t timestamp_us = 0;
56*d9f75844SAndroid Build Coastguard Worker     VideoRotation rotation = kVideoRotation_0;
57*d9f75844SAndroid Build Coastguard Worker     absl::optional<ColorSpace> color_space;
58*d9f75844SAndroid Build Coastguard Worker     RtpPacketInfos packet_infos;
59*d9f75844SAndroid Build Coastguard Worker   };
60*d9f75844SAndroid Build Coastguard Worker   struct TimingFramesLayerInfo {
61*d9f75844SAndroid Build Coastguard Worker     TimingFramesLayerInfo();
62*d9f75844SAndroid Build Coastguard Worker     ~TimingFramesLayerInfo();
63*d9f75844SAndroid Build Coastguard Worker     size_t target_bitrate_bytes_per_sec = 0;
64*d9f75844SAndroid Build Coastguard Worker     std::list<FrameMetadata> frames;
65*d9f75844SAndroid Build Coastguard Worker   };
66*d9f75844SAndroid Build Coastguard Worker 
67*d9f75844SAndroid Build Coastguard Worker   Mutex lock_;
68*d9f75844SAndroid Build Coastguard Worker   EncodedImageCallback* const frame_drop_callback_;
69*d9f75844SAndroid Build Coastguard Worker   VideoCodec codec_settings_ RTC_GUARDED_BY(&lock_);
70*d9f75844SAndroid Build Coastguard Worker   uint32_t framerate_fps_ RTC_GUARDED_BY(&lock_);
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker   size_t num_spatial_layers_ RTC_GUARDED_BY(&lock_);
73*d9f75844SAndroid Build Coastguard Worker   // Separate instance for each simulcast stream or spatial layer.
74*d9f75844SAndroid Build Coastguard Worker   std::vector<TimingFramesLayerInfo> timing_frames_info_ RTC_GUARDED_BY(&lock_);
75*d9f75844SAndroid Build Coastguard Worker   int64_t last_timing_frame_time_ms_ RTC_GUARDED_BY(&lock_);
76*d9f75844SAndroid Build Coastguard Worker   size_t reordered_frames_logged_messages_ RTC_GUARDED_BY(&lock_);
77*d9f75844SAndroid Build Coastguard Worker   size_t stalled_encoder_logged_messages_ RTC_GUARDED_BY(&lock_);
78*d9f75844SAndroid Build Coastguard Worker };
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker #endif  // VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
83