OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2014 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 |
| 11 #include <string> |
| 12 |
| 13 #include "webrtc/base/logging.h" |
| 14 #include "webrtc/modules/include/module_common_types.h" |
| 15 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_stereo.h" |
| 16 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
| 17 |
| 18 namespace webrtc { |
| 19 |
| 20 static const size_t kStereoHeaderLength = 1; |
| 21 |
| 22 RtpPacketizerStereo::RtpPacketizerStereo( |
| 23 size_t max_payload_len, |
| 24 size_t last_packet_reduction_len, |
| 25 const RTPVideoTypeHeader* rtp_type_header, |
| 26 const RTPVideoStereoInfo* stereoInfo) |
| 27 : max_payload_len_(max_payload_len - kStereoHeaderLength), |
| 28 last_packet_reduction_len_(last_packet_reduction_len), |
| 29 frame_index_(0), |
| 30 stereoInfo_(stereoInfo) { |
| 31 packetizers_.emplace_back(RtpPacketizer::Create( |
| 32 stereoInfo->stereoCodecType, max_payload_len_, last_packet_reduction_len_, |
| 33 rtp_type_header, stereoInfo, kVideoFrameDelta)); |
| 34 for (int i = 0; i < stereoInfo->num_frames; ++i) { |
| 35 packetizers_.emplace_back( |
| 36 RtpPacketizer::Create(stereoInfo->stereoCodecType, max_payload_len_, |
| 37 last_packet_reduction_len_, |
| 38 &(stereoInfo->rtp_video_headers[i]->codecHeader), |
| 39 stereoInfo, kVideoFrameDelta)); |
| 40 } |
| 41 } |
| 42 |
| 43 RtpPacketizerStereo::~RtpPacketizerStereo() {} |
| 44 |
| 45 size_t RtpPacketizerStereo::SetPayloadData( |
| 46 const uint8_t* payload_data, |
| 47 size_t payload_size, |
| 48 const RTPFragmentationHeader* fragmentation) { |
| 49 size_t num_packets = packetizers_[0]->SetPayloadData( |
| 50 payload_data, payload_size, fragmentation); |
| 51 for (size_t i = 0; i < packetizers_.size() - 1; ++i) { |
| 52 num_packets += packetizers_[i + 1]->SetPayloadData( |
| 53 stereoInfo_->encoded_images[i]->_buffer, |
| 54 stereoInfo_->encoded_images[i]->_length, |
| 55 stereoInfo_->fragmentations[i]); |
| 56 } |
| 57 return num_packets; |
| 58 } |
| 59 |
| 60 bool RtpPacketizerStereo::NextPacket(RtpPacketToSend* packet) { |
| 61 RTC_DCHECK(packet); |
| 62 RTC_DCHECK_LE(frame_index_, static_cast<uint8_t>(packetizers_.size())); |
| 63 const bool rv = packetizers_[frame_index_]->NextPacket(packet); |
| 64 RTC_CHECK(rv); |
| 65 |
| 66 const bool last_packet = packet->Marker(); |
| 67 if (last_packet && |
| 68 frame_index_ < static_cast<uint8_t>(packetizers_.size()) - 1) { |
| 69 packet->SetMarker(false); |
| 70 } |
| 71 |
| 72 std::unique_ptr<RtpPacketToSend> packet_copy(new RtpPacketToSend(*packet)); |
| 73 uint8_t* wrapped_payload = |
| 74 packet->AllocatePayload(kStereoHeaderLength + packet->payload_size()); |
| 75 RTC_DCHECK(wrapped_payload); |
| 76 wrapped_payload[0] = frame_index_; |
| 77 auto payload = packet_copy->payload(); |
| 78 memcpy(&wrapped_payload[kStereoHeaderLength], payload.data(), payload.size()); |
| 79 |
| 80 frame_index_ = last_packet ? frame_index_ + 1 : frame_index_; |
| 81 return rv; |
| 82 } |
| 83 |
| 84 ProtectionType RtpPacketizerStereo::GetProtectionType() { |
| 85 return kProtectedPacket; |
| 86 } |
| 87 |
| 88 StorageType RtpPacketizerStereo::GetStorageType( |
| 89 uint32_t retransmission_settings) { |
| 90 return kDontRetransmit; |
| 91 } |
| 92 |
| 93 std::string RtpPacketizerStereo::ToString() { |
| 94 return "RtpPacketizerStereo"; |
| 95 } |
| 96 |
| 97 bool RtpDepacketizerStereo::Parse(ParsedPayload* parsed_payload, |
| 98 const uint8_t* payload_data, |
| 99 size_t payload_data_length) { |
| 100 assert(parsed_payload != NULL); |
| 101 if (payload_data_length == 0) { |
| 102 LOG(LS_ERROR) << "Empty payload."; |
| 103 return false; |
| 104 } |
| 105 |
| 106 uint8_t frame_index = *payload_data++; |
| 107 --payload_data_length; |
| 108 |
| 109 const bool rv = |
| 110 depacketizer_.Parse(parsed_payload, payload_data, payload_data_length); |
| 111 parsed_payload->type.Video.stereoInfo.frame_index = frame_index; |
| 112 RTC_DCHECK(rv); |
| 113 if (frame_index > 0) |
| 114 parsed_payload->type.Video.is_first_packet_in_frame = false; |
| 115 parsed_payload->type.Video.codec = kRtpVideoStereo; |
| 116 return rv; |
| 117 } |
| 118 } // namespace webrtc |
OLD | NEW |