blob: 555bc9bf30237f4c400eae0d0758c9ee6d53cf77 [file] [log] [blame]
Erik Språng6a7baa72019-02-26 17:31:001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3611#ifndef VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
12#define VIDEO_FRAME_ENCODE_METADATA_WRITER_H_
Erik Språng6a7baa72019-02-26 17:31:0013
14#include <list>
15#include <vector>
16
17#include "absl/types/optional.h"
18#include "api/video/encoded_image.h"
19#include "api/video_codecs/video_codec.h"
20#include "api/video_codecs/video_encoder.h"
Mirta Dvornicic28f0eb22019-05-28 14:30:1621#include "modules/video_coding/include/video_codec_interface.h"
Markus Handella3765182020-07-08 11:13:3222#include "rtc_base/synchronization/mutex.h"
Erik Språng6a7baa72019-02-26 17:31:0023
24namespace webrtc {
25
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3626class FrameEncodeMetadataWriter {
Erik Språng6a7baa72019-02-26 17:31:0027 public:
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3628 explicit FrameEncodeMetadataWriter(EncodedImageCallback* frame_drop_callback);
29 ~FrameEncodeMetadataWriter();
Erik Språng6a7baa72019-02-26 17:31:0030
Niels Möller13d16362021-11-16 10:39:2731 void OnEncoderInit(const VideoCodec& codec);
Erik Språng6a7baa72019-02-26 17:31:0032 void OnSetRates(const VideoBitrateAllocation& bitrate_allocation,
33 uint32_t framerate_fps);
34
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3635 void OnEncodeStarted(const VideoFrame& frame);
Erik Språng6a7baa72019-02-26 17:31:0036
Johannes Kron52970752024-06-26 16:16:0237 void FillMetadataAndTimingInfo(size_t simulcast_svc_idx,
38 EncodedImage* encoded_image);
39
Danil Chapovalov6d008a82020-07-22 17:49:3640 void UpdateBitstream(const CodecSpecificInfo* codec_specific_info,
41 EncodedImage* encoded_image);
Mirta Dvornicic28f0eb22019-05-28 14:30:1642
Erik Språng6a7baa72019-02-26 17:31:0043 void Reset();
44
45 private:
Erik Språng6a7baa72019-02-26 17:31:0046 // For non-internal-source encoders, returns encode started time and fixes
47 // capture timestamp for the frame, if corrupted by the encoder.
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3648 absl::optional<int64_t> ExtractEncodeStartTimeAndFillMetadata(
49 size_t simulcast_svc_idx,
50 EncodedImage* encoded_image) RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_);
Erik Språng6a7baa72019-02-26 17:31:0051
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3652 struct FrameMetadata {
Erik Språng6a7baa72019-02-26 17:31:0053 uint32_t rtp_timestamp;
Erik Språng6a7baa72019-02-26 17:31:0054 int64_t encode_start_time_ms;
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3655 int64_t ntp_time_ms = 0;
56 int64_t timestamp_us = 0;
57 VideoRotation rotation = kVideoRotation_0;
58 absl::optional<ColorSpace> color_space;
Johannes Kron52970752024-06-26 16:16:0259 bool is_steady_state_refresh_frame = false;
Chen Xingf00bf422019-06-20 08:05:5560 RtpPacketInfos packet_infos;
Erik Språng6a7baa72019-02-26 17:31:0061 };
62 struct TimingFramesLayerInfo {
63 TimingFramesLayerInfo();
64 ~TimingFramesLayerInfo();
65 size_t target_bitrate_bytes_per_sec = 0;
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3666 std::list<FrameMetadata> frames;
Erik Språng6a7baa72019-02-26 17:31:0067 };
68
Markus Handella3765182020-07-08 11:13:3269 Mutex lock_;
Erik Språng6a7baa72019-02-26 17:31:0070 EncodedImageCallback* const frame_drop_callback_;
71 VideoCodec codec_settings_ RTC_GUARDED_BY(&lock_);
Erik Språng6a7baa72019-02-26 17:31:0072 uint32_t framerate_fps_ RTC_GUARDED_BY(&lock_);
73
Zhaoliang Ma528e4892021-11-12 05:05:0774 size_t num_spatial_layers_ RTC_GUARDED_BY(&lock_);
Erik Språng6a7baa72019-02-26 17:31:0075 // Separate instance for each simulcast stream or spatial layer.
76 std::vector<TimingFramesLayerInfo> timing_frames_info_ RTC_GUARDED_BY(&lock_);
77 int64_t last_timing_frame_time_ms_ RTC_GUARDED_BY(&lock_);
Erik Språng6a7baa72019-02-26 17:31:0078 size_t reordered_frames_logged_messages_ RTC_GUARDED_BY(&lock_);
79 size_t stalled_encoder_logged_messages_ RTC_GUARDED_BY(&lock_);
80};
81
82} // namespace webrtc
83
Ilya Nikolaevskiy2ebf5232019-05-13 14:13:3684#endif // VIDEO_FRAME_ENCODE_METADATA_WRITER_H_