| Index: webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6903e1e5639d86d9a7eb0a93d78b553f965cdcd8
|
| --- /dev/null
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.cc
|
| @@ -0,0 +1,118 @@
|
| +/*
|
| + * Copyright (c) 2014 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 <string>
|
| +
|
| +#include "webrtc/base/logging.h"
|
| +#include "webrtc/modules/include/module_common_types.h"
|
| +#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.h"
|
| +#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
|
| +
|
| +namespace webrtc {
|
| +
|
| +static const size_t kStereoHeaderLength = 1;
|
| +
|
| +RtpPacketizerStereo::RtpPacketizerStereo(
|
| + size_t max_payload_len,
|
| + size_t last_packet_reduction_len,
|
| + const RTPVideoTypeHeader* rtp_type_header,
|
| + const RTPVideoStereoInfo* stereoInfo)
|
| + : max_payload_len_(max_payload_len - kStereoHeaderLength),
|
| + last_packet_reduction_len_(last_packet_reduction_len),
|
| + frame_index_(0),
|
| + stereoInfo_(stereoInfo) {
|
| + packetizers_.emplace_back(RtpPacketizer::Create(
|
| + stereoInfo->stereoCodecType, max_payload_len_, last_packet_reduction_len_,
|
| + rtp_type_header, stereoInfo, kVideoFrameDelta));
|
| + for (int i = 0; i < stereoInfo->num_frames; ++i) {
|
| + packetizers_.emplace_back(
|
| + RtpPacketizer::Create(stereoInfo->stereoCodecType, max_payload_len_,
|
| + last_packet_reduction_len_,
|
| + &(stereoInfo->rtp_video_headers[i]->codecHeader),
|
| + stereoInfo, kVideoFrameDelta));
|
| + }
|
| +}
|
| +
|
| +RtpPacketizerStereo::~RtpPacketizerStereo() {}
|
| +
|
| +size_t RtpPacketizerStereo::SetPayloadData(
|
| + const uint8_t* payload_data,
|
| + size_t payload_size,
|
| + const RTPFragmentationHeader* fragmentation) {
|
| + size_t num_packets = packetizers_[0]->SetPayloadData(
|
| + payload_data, payload_size, fragmentation);
|
| + for (size_t i = 0; i < packetizers_.size() - 1; ++i) {
|
| + num_packets += packetizers_[i + 1]->SetPayloadData(
|
| + stereoInfo_->encoded_images[i]->_buffer,
|
| + stereoInfo_->encoded_images[i]->_length,
|
| + stereoInfo_->fragmentations[i]);
|
| + }
|
| + return num_packets;
|
| +}
|
| +
|
| +bool RtpPacketizerStereo::NextPacket(RtpPacketToSend* packet) {
|
| + RTC_DCHECK(packet);
|
| + RTC_DCHECK_LE(frame_index_, static_cast<uint8_t>(packetizers_.size()));
|
| + const bool rv = packetizers_[frame_index_]->NextPacket(packet);
|
| + RTC_CHECK(rv);
|
| +
|
| + const bool last_packet = packet->Marker();
|
| + if (last_packet &&
|
| + frame_index_ < static_cast<uint8_t>(packetizers_.size()) - 1) {
|
| + packet->SetMarker(false);
|
| + }
|
| +
|
| + std::unique_ptr<RtpPacketToSend> packet_copy(new RtpPacketToSend(*packet));
|
| + uint8_t* wrapped_payload =
|
| + packet->AllocatePayload(kStereoHeaderLength + packet->payload_size());
|
| + RTC_DCHECK(wrapped_payload);
|
| + wrapped_payload[0] = frame_index_;
|
| + auto payload = packet_copy->payload();
|
| + memcpy(&wrapped_payload[kStereoHeaderLength], payload.data(), payload.size());
|
| +
|
| + frame_index_ = last_packet ? frame_index_ + 1 : frame_index_;
|
| + return rv;
|
| +}
|
| +
|
| +ProtectionType RtpPacketizerStereo::GetProtectionType() {
|
| + return kProtectedPacket;
|
| +}
|
| +
|
| +StorageType RtpPacketizerStereo::GetStorageType(
|
| + uint32_t retransmission_settings) {
|
| + return kDontRetransmit;
|
| +}
|
| +
|
| +std::string RtpPacketizerStereo::ToString() {
|
| + return "RtpPacketizerStereo";
|
| +}
|
| +
|
| +bool RtpDepacketizerStereo::Parse(ParsedPayload* parsed_payload,
|
| + const uint8_t* payload_data,
|
| + size_t payload_data_length) {
|
| + assert(parsed_payload != NULL);
|
| + if (payload_data_length == 0) {
|
| + LOG(LS_ERROR) << "Empty payload.";
|
| + return false;
|
| + }
|
| +
|
| + uint8_t frame_index = *payload_data++;
|
| + --payload_data_length;
|
| +
|
| + const bool rv =
|
| + depacketizer_.Parse(parsed_payload, payload_data, payload_data_length);
|
| + parsed_payload->type.Video.stereoInfo.frame_index = frame_index;
|
| + RTC_DCHECK(rv);
|
| + if (frame_index > 0)
|
| + parsed_payload->type.Video.is_first_packet_in_frame = false;
|
| + parsed_payload->type.Video.codec = kRtpVideoStereo;
|
| + return rv;
|
| +}
|
| +} // namespace webrtc
|
|
|