133 lines
3.9 KiB
C++
133 lines
3.9 KiB
C++
/*
|
|
* Copyright (c) 2016 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.
|
|
*/
|
|
|
|
#include "modules/video_coding/frame_object.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include <utility>
|
|
|
|
#include "api/video/encoded_image.h"
|
|
#include "api/video/video_timing.h"
|
|
#include "rtc_base/checks.h"
|
|
|
|
namespace webrtc {
|
|
namespace video_coding {
|
|
RtpFrameObject::RtpFrameObject(
|
|
uint16_t first_seq_num,
|
|
uint16_t last_seq_num,
|
|
bool markerBit,
|
|
int times_nacked,
|
|
int64_t first_packet_received_time,
|
|
int64_t last_packet_received_time,
|
|
uint32_t rtp_timestamp,
|
|
int64_t ntp_time_ms,
|
|
const VideoSendTiming& timing,
|
|
uint8_t payload_type,
|
|
VideoCodecType codec,
|
|
VideoRotation rotation,
|
|
VideoContentType content_type,
|
|
const RTPVideoHeader& video_header,
|
|
const absl::optional<webrtc::ColorSpace>& color_space,
|
|
RtpPacketInfos packet_infos,
|
|
rtc::scoped_refptr<EncodedImageBuffer> image_buffer)
|
|
: first_seq_num_(first_seq_num),
|
|
last_seq_num_(last_seq_num),
|
|
last_packet_received_time_(last_packet_received_time),
|
|
times_nacked_(times_nacked) {
|
|
rtp_video_header_ = video_header;
|
|
|
|
// EncodedFrame members
|
|
codec_type_ = codec;
|
|
|
|
// TODO(philipel): Remove when encoded image is replaced by EncodedFrame.
|
|
// VCMEncodedFrame members
|
|
CopyCodecSpecific(&rtp_video_header_);
|
|
_completeFrame = true;
|
|
_payloadType = payload_type;
|
|
SetTimestamp(rtp_timestamp);
|
|
ntp_time_ms_ = ntp_time_ms;
|
|
_frameType = rtp_video_header_.frame_type;
|
|
|
|
// Setting frame's playout delays to the same values
|
|
// as of the first packet's.
|
|
SetPlayoutDelay(rtp_video_header_.playout_delay);
|
|
|
|
SetEncodedData(std::move(image_buffer));
|
|
_encodedWidth = rtp_video_header_.width;
|
|
_encodedHeight = rtp_video_header_.height;
|
|
|
|
// EncodedFrame members
|
|
SetPacketInfos(std::move(packet_infos));
|
|
|
|
rotation_ = rotation;
|
|
SetColorSpace(color_space);
|
|
content_type_ = content_type;
|
|
if (timing.flags != VideoSendTiming::kInvalid) {
|
|
// ntp_time_ms_ may be -1 if not estimated yet. This is not a problem,
|
|
// as this will be dealt with at the time of reporting.
|
|
timing_.encode_start_ms = ntp_time_ms_ + timing.encode_start_delta_ms;
|
|
timing_.encode_finish_ms = ntp_time_ms_ + timing.encode_finish_delta_ms;
|
|
timing_.packetization_finish_ms =
|
|
ntp_time_ms_ + timing.packetization_finish_delta_ms;
|
|
timing_.pacer_exit_ms = ntp_time_ms_ + timing.pacer_exit_delta_ms;
|
|
timing_.network_timestamp_ms =
|
|
ntp_time_ms_ + timing.network_timestamp_delta_ms;
|
|
timing_.network2_timestamp_ms =
|
|
ntp_time_ms_ + timing.network2_timestamp_delta_ms;
|
|
}
|
|
timing_.receive_start_ms = first_packet_received_time;
|
|
timing_.receive_finish_ms = last_packet_received_time;
|
|
timing_.flags = timing.flags;
|
|
is_last_spatial_layer = markerBit;
|
|
}
|
|
|
|
RtpFrameObject::~RtpFrameObject() {
|
|
}
|
|
|
|
uint16_t RtpFrameObject::first_seq_num() const {
|
|
return first_seq_num_;
|
|
}
|
|
|
|
uint16_t RtpFrameObject::last_seq_num() const {
|
|
return last_seq_num_;
|
|
}
|
|
|
|
int RtpFrameObject::times_nacked() const {
|
|
return times_nacked_;
|
|
}
|
|
|
|
VideoFrameType RtpFrameObject::frame_type() const {
|
|
return rtp_video_header_.frame_type;
|
|
}
|
|
|
|
VideoCodecType RtpFrameObject::codec_type() const {
|
|
return codec_type_;
|
|
}
|
|
|
|
int64_t RtpFrameObject::ReceivedTime() const {
|
|
return last_packet_received_time_;
|
|
}
|
|
|
|
int64_t RtpFrameObject::RenderTime() const {
|
|
return _renderTimeMs;
|
|
}
|
|
|
|
bool RtpFrameObject::delayed_by_retransmission() const {
|
|
return times_nacked() > 0;
|
|
}
|
|
|
|
const RTPVideoHeader& RtpFrameObject::GetRtpVideoHeader() const {
|
|
return rtp_video_header_;
|
|
}
|
|
|
|
} // namespace video_coding
|
|
} // namespace webrtc
|