1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2014 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 API_VIDEO_ENCODED_IMAGE_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_VIDEO_ENCODED_IMAGE_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <map> 17*d9f75844SAndroid Build Coastguard Worker #include <utility> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_packet_infos.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/video/color_space.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_codec_constants.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_content_type.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame_type.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_rotation.h" 27*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_timing.h" 28*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h" 29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard Worker // Abstract interface for buffer storage. Intended to support buffers owned by 35*d9f75844SAndroid Build Coastguard Worker // external encoders with special release requirements, e.g, java encoders with 36*d9f75844SAndroid Build Coastguard Worker // releaseOutputBuffer. 37*d9f75844SAndroid Build Coastguard Worker class EncodedImageBufferInterface : public rtc::RefCountInterface { 38*d9f75844SAndroid Build Coastguard Worker public: 39*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* data() const = 0; 40*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/9378): Make interface essentially read-only, delete 41*d9f75844SAndroid Build Coastguard Worker // this non-const data method. 42*d9f75844SAndroid Build Coastguard Worker virtual uint8_t* data() = 0; 43*d9f75844SAndroid Build Coastguard Worker virtual size_t size() const = 0; 44*d9f75844SAndroid Build Coastguard Worker }; 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker // Basic implementation of EncodedImageBufferInterface. 47*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT EncodedImageBuffer : public EncodedImageBufferInterface { 48*d9f75844SAndroid Build Coastguard Worker public: Create()49*d9f75844SAndroid Build Coastguard Worker static rtc::scoped_refptr<EncodedImageBuffer> Create() { return Create(0); } 50*d9f75844SAndroid Build Coastguard Worker static rtc::scoped_refptr<EncodedImageBuffer> Create(size_t size); 51*d9f75844SAndroid Build Coastguard Worker static rtc::scoped_refptr<EncodedImageBuffer> Create(const uint8_t* data, 52*d9f75844SAndroid Build Coastguard Worker size_t size); 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker const uint8_t* data() const override; 55*d9f75844SAndroid Build Coastguard Worker uint8_t* data() override; 56*d9f75844SAndroid Build Coastguard Worker size_t size() const override; 57*d9f75844SAndroid Build Coastguard Worker void Realloc(size_t t); 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker protected: 60*d9f75844SAndroid Build Coastguard Worker explicit EncodedImageBuffer(size_t size); 61*d9f75844SAndroid Build Coastguard Worker EncodedImageBuffer(const uint8_t* data, size_t size); 62*d9f75844SAndroid Build Coastguard Worker ~EncodedImageBuffer(); 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker size_t size_; 65*d9f75844SAndroid Build Coastguard Worker uint8_t* buffer_; 66*d9f75844SAndroid Build Coastguard Worker }; 67*d9f75844SAndroid Build Coastguard Worker 68*d9f75844SAndroid Build Coastguard Worker // TODO(bug.webrtc.org/9378): This is a legacy api class, which is slowly being 69*d9f75844SAndroid Build Coastguard Worker // cleaned up. Direct use of its members is strongly discouraged. 70*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT EncodedImage { 71*d9f75844SAndroid Build Coastguard Worker public: 72*d9f75844SAndroid Build Coastguard Worker EncodedImage(); 73*d9f75844SAndroid Build Coastguard Worker EncodedImage(EncodedImage&&); 74*d9f75844SAndroid Build Coastguard Worker EncodedImage(const EncodedImage&); 75*d9f75844SAndroid Build Coastguard Worker 76*d9f75844SAndroid Build Coastguard Worker ~EncodedImage(); 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker EncodedImage& operator=(EncodedImage&&); 79*d9f75844SAndroid Build Coastguard Worker EncodedImage& operator=(const EncodedImage&); 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/9378): Change style to timestamp(), set_timestamp(), 82*d9f75844SAndroid Build Coastguard Worker // for consistency with the VideoFrame class. Set frame timestamp (90kHz). SetTimestamp(uint32_t timestamp)83*d9f75844SAndroid Build Coastguard Worker void SetTimestamp(uint32_t timestamp) { timestamp_rtp_ = timestamp; } 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker // Get frame timestamp (90kHz). Timestamp()86*d9f75844SAndroid Build Coastguard Worker uint32_t Timestamp() const { return timestamp_rtp_; } 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker void SetEncodeTime(int64_t encode_start_ms, int64_t encode_finish_ms); 89*d9f75844SAndroid Build Coastguard Worker NtpTimeMs()90*d9f75844SAndroid Build Coastguard Worker int64_t NtpTimeMs() const { return ntp_time_ms_; } 91*d9f75844SAndroid Build Coastguard Worker SpatialIndex()92*d9f75844SAndroid Build Coastguard Worker absl::optional<int> SpatialIndex() const { return spatial_index_; } SetSpatialIndex(absl::optional<int> spatial_index)93*d9f75844SAndroid Build Coastguard Worker void SetSpatialIndex(absl::optional<int> spatial_index) { 94*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_GE(spatial_index.value_or(0), 0); 95*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LT(spatial_index.value_or(0), kMaxSpatialLayers); 96*d9f75844SAndroid Build Coastguard Worker spatial_index_ = spatial_index; 97*d9f75844SAndroid Build Coastguard Worker } 98*d9f75844SAndroid Build Coastguard Worker TemporalIndex()99*d9f75844SAndroid Build Coastguard Worker absl::optional<int> TemporalIndex() const { return temporal_index_; } SetTemporalIndex(absl::optional<int> temporal_index)100*d9f75844SAndroid Build Coastguard Worker void SetTemporalIndex(absl::optional<int> temporal_index) { 101*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_GE(temporal_index_.value_or(0), 0); 102*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LT(temporal_index_.value_or(0), kMaxTemporalStreams); 103*d9f75844SAndroid Build Coastguard Worker temporal_index_ = temporal_index; 104*d9f75844SAndroid Build Coastguard Worker } 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker // These methods can be used to set/get size of subframe with spatial index 107*d9f75844SAndroid Build Coastguard Worker // `spatial_index` on encoded frames that consist of multiple spatial layers. 108*d9f75844SAndroid Build Coastguard Worker absl::optional<size_t> SpatialLayerFrameSize(int spatial_index) const; 109*d9f75844SAndroid Build Coastguard Worker void SetSpatialLayerFrameSize(int spatial_index, size_t size_bytes); 110*d9f75844SAndroid Build Coastguard Worker ColorSpace()111*d9f75844SAndroid Build Coastguard Worker const webrtc::ColorSpace* ColorSpace() const { 112*d9f75844SAndroid Build Coastguard Worker return color_space_ ? &*color_space_ : nullptr; 113*d9f75844SAndroid Build Coastguard Worker } SetColorSpace(const absl::optional<webrtc::ColorSpace> & color_space)114*d9f75844SAndroid Build Coastguard Worker void SetColorSpace(const absl::optional<webrtc::ColorSpace>& color_space) { 115*d9f75844SAndroid Build Coastguard Worker color_space_ = color_space; 116*d9f75844SAndroid Build Coastguard Worker } 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker // These methods along with the private member video_frame_tracking_id_ are 119*d9f75844SAndroid Build Coastguard Worker // meant for media quality testing purpose only. VideoFrameTrackingId()120*d9f75844SAndroid Build Coastguard Worker absl::optional<uint16_t> VideoFrameTrackingId() const { 121*d9f75844SAndroid Build Coastguard Worker return video_frame_tracking_id_; 122*d9f75844SAndroid Build Coastguard Worker } SetVideoFrameTrackingId(absl::optional<uint16_t> tracking_id)123*d9f75844SAndroid Build Coastguard Worker void SetVideoFrameTrackingId(absl::optional<uint16_t> tracking_id) { 124*d9f75844SAndroid Build Coastguard Worker video_frame_tracking_id_ = tracking_id; 125*d9f75844SAndroid Build Coastguard Worker } 126*d9f75844SAndroid Build Coastguard Worker PacketInfos()127*d9f75844SAndroid Build Coastguard Worker const RtpPacketInfos& PacketInfos() const { return packet_infos_; } SetPacketInfos(RtpPacketInfos packet_infos)128*d9f75844SAndroid Build Coastguard Worker void SetPacketInfos(RtpPacketInfos packet_infos) { 129*d9f75844SAndroid Build Coastguard Worker packet_infos_ = std::move(packet_infos); 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker RetransmissionAllowed()132*d9f75844SAndroid Build Coastguard Worker bool RetransmissionAllowed() const { return retransmission_allowed_; } SetRetransmissionAllowed(bool retransmission_allowed)133*d9f75844SAndroid Build Coastguard Worker void SetRetransmissionAllowed(bool retransmission_allowed) { 134*d9f75844SAndroid Build Coastguard Worker retransmission_allowed_ = retransmission_allowed; 135*d9f75844SAndroid Build Coastguard Worker } 136*d9f75844SAndroid Build Coastguard Worker size()137*d9f75844SAndroid Build Coastguard Worker size_t size() const { return size_; } set_size(size_t new_size)138*d9f75844SAndroid Build Coastguard Worker void set_size(size_t new_size) { 139*d9f75844SAndroid Build Coastguard Worker // Allow set_size(0) even if we have no buffer. 140*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(new_size, new_size == 0 ? 0 : capacity()); 141*d9f75844SAndroid Build Coastguard Worker size_ = new_size; 142*d9f75844SAndroid Build Coastguard Worker } 143*d9f75844SAndroid Build Coastguard Worker SetEncodedData(rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data)144*d9f75844SAndroid Build Coastguard Worker void SetEncodedData( 145*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data) { 146*d9f75844SAndroid Build Coastguard Worker encoded_data_ = encoded_data; 147*d9f75844SAndroid Build Coastguard Worker size_ = encoded_data->size(); 148*d9f75844SAndroid Build Coastguard Worker } 149*d9f75844SAndroid Build Coastguard Worker ClearEncodedData()150*d9f75844SAndroid Build Coastguard Worker void ClearEncodedData() { 151*d9f75844SAndroid Build Coastguard Worker encoded_data_ = nullptr; 152*d9f75844SAndroid Build Coastguard Worker size_ = 0; 153*d9f75844SAndroid Build Coastguard Worker } 154*d9f75844SAndroid Build Coastguard Worker GetEncodedData()155*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<EncodedImageBufferInterface> GetEncodedData() const { 156*d9f75844SAndroid Build Coastguard Worker return encoded_data_; 157*d9f75844SAndroid Build Coastguard Worker } 158*d9f75844SAndroid Build Coastguard Worker data()159*d9f75844SAndroid Build Coastguard Worker const uint8_t* data() const { 160*d9f75844SAndroid Build Coastguard Worker return encoded_data_ ? encoded_data_->data() : nullptr; 161*d9f75844SAndroid Build Coastguard Worker } 162*d9f75844SAndroid Build Coastguard Worker 163*d9f75844SAndroid Build Coastguard Worker // Returns whether the encoded image can be considered to be of target 164*d9f75844SAndroid Build Coastguard Worker // quality. IsAtTargetQuality()165*d9f75844SAndroid Build Coastguard Worker bool IsAtTargetQuality() const { return at_target_quality_; } 166*d9f75844SAndroid Build Coastguard Worker 167*d9f75844SAndroid Build Coastguard Worker // Sets that the encoded image can be considered to be of target quality to 168*d9f75844SAndroid Build Coastguard Worker // true or false. SetAtTargetQuality(bool at_target_quality)169*d9f75844SAndroid Build Coastguard Worker void SetAtTargetQuality(bool at_target_quality) { 170*d9f75844SAndroid Build Coastguard Worker at_target_quality_ = at_target_quality; 171*d9f75844SAndroid Build Coastguard Worker } 172*d9f75844SAndroid Build Coastguard Worker 173*d9f75844SAndroid Build Coastguard Worker uint32_t _encodedWidth = 0; 174*d9f75844SAndroid Build Coastguard Worker uint32_t _encodedHeight = 0; 175*d9f75844SAndroid Build Coastguard Worker // NTP time of the capture time in local timebase in milliseconds. 176*d9f75844SAndroid Build Coastguard Worker // TODO(minyue): make this member private. 177*d9f75844SAndroid Build Coastguard Worker int64_t ntp_time_ms_ = 0; 178*d9f75844SAndroid Build Coastguard Worker int64_t capture_time_ms_ = 0; 179*d9f75844SAndroid Build Coastguard Worker VideoFrameType _frameType = VideoFrameType::kVideoFrameDelta; 180*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation_ = kVideoRotation_0; 181*d9f75844SAndroid Build Coastguard Worker VideoContentType content_type_ = VideoContentType::UNSPECIFIED; 182*d9f75844SAndroid Build Coastguard Worker int qp_ = -1; // Quantizer value. 183*d9f75844SAndroid Build Coastguard Worker 184*d9f75844SAndroid Build Coastguard Worker // When an application indicates non-zero values here, it is taken as an 185*d9f75844SAndroid Build Coastguard Worker // indication that all future frames will be constrained with those limits 186*d9f75844SAndroid Build Coastguard Worker // until the application indicates a change again. 187*d9f75844SAndroid Build Coastguard Worker VideoPlayoutDelay playout_delay_; 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker struct Timing { 190*d9f75844SAndroid Build Coastguard Worker uint8_t flags = VideoSendTiming::kInvalid; 191*d9f75844SAndroid Build Coastguard Worker int64_t encode_start_ms = 0; 192*d9f75844SAndroid Build Coastguard Worker int64_t encode_finish_ms = 0; 193*d9f75844SAndroid Build Coastguard Worker int64_t packetization_finish_ms = 0; 194*d9f75844SAndroid Build Coastguard Worker int64_t pacer_exit_ms = 0; 195*d9f75844SAndroid Build Coastguard Worker int64_t network_timestamp_ms = 0; 196*d9f75844SAndroid Build Coastguard Worker int64_t network2_timestamp_ms = 0; 197*d9f75844SAndroid Build Coastguard Worker int64_t receive_start_ms = 0; 198*d9f75844SAndroid Build Coastguard Worker int64_t receive_finish_ms = 0; 199*d9f75844SAndroid Build Coastguard Worker } timing_; 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Worker private: capacity()202*d9f75844SAndroid Build Coastguard Worker size_t capacity() const { return encoded_data_ ? encoded_data_->size() : 0; } 203*d9f75844SAndroid Build Coastguard Worker 204*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data_; 205*d9f75844SAndroid Build Coastguard Worker size_t size_ = 0; // Size of encoded frame data. 206*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_rtp_ = 0; 207*d9f75844SAndroid Build Coastguard Worker absl::optional<int> spatial_index_; 208*d9f75844SAndroid Build Coastguard Worker absl::optional<int> temporal_index_; 209*d9f75844SAndroid Build Coastguard Worker std::map<int, size_t> spatial_layer_frame_size_bytes_; 210*d9f75844SAndroid Build Coastguard Worker absl::optional<webrtc::ColorSpace> color_space_; 211*d9f75844SAndroid Build Coastguard Worker // This field is meant for media quality testing purpose only. When enabled it 212*d9f75844SAndroid Build Coastguard Worker // carries the webrtc::VideoFrame id field from the sender to the receiver. 213*d9f75844SAndroid Build Coastguard Worker absl::optional<uint16_t> video_frame_tracking_id_; 214*d9f75844SAndroid Build Coastguard Worker // Information about packets used to assemble this video frame. This is needed 215*d9f75844SAndroid Build Coastguard Worker // by `SourceTracker` when the frame is delivered to the RTCRtpReceiver's 216*d9f75844SAndroid Build Coastguard Worker // MediaStreamTrack, in order to implement getContributingSources(). See: 217*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-pc/#dom-rtcrtpreceiver-getcontributingsources 218*d9f75844SAndroid Build Coastguard Worker RtpPacketInfos packet_infos_; 219*d9f75844SAndroid Build Coastguard Worker bool retransmission_allowed_ = true; 220*d9f75844SAndroid Build Coastguard Worker // True if the encoded image can be considered to be of target quality. 221*d9f75844SAndroid Build Coastguard Worker bool at_target_quality_ = false; 222*d9f75844SAndroid Build Coastguard Worker }; 223*d9f75844SAndroid Build Coastguard Worker 224*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 225*d9f75844SAndroid Build Coastguard Worker 226*d9f75844SAndroid Build Coastguard Worker #endif // API_VIDEO_ENCODED_IMAGE_H_ 227