2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
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.
13 #include "webrtc/modules/interface/module_common_types.h"
14 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
18 static const size_t kGenericHeaderLength = 1;
20 RtpPacketizerGeneric::RtpPacketizerGeneric(FrameType frame_type,
21 size_t max_payload_len)
22 : payload_data_(NULL),
24 max_payload_len_(max_payload_len - kGenericHeaderLength),
25 frame_type_(frame_type) {
28 RtpPacketizerGeneric::~RtpPacketizerGeneric() {
31 void RtpPacketizerGeneric::SetPayloadData(
32 const uint8_t* payload_data,
34 const RTPFragmentationHeader* fragmentation) {
35 payload_data_ = payload_data;
36 payload_size_ = payload_size;
38 // Fragment packets more evenly by splitting the payload up evenly.
39 uint32_t num_packets =
40 (payload_size_ + max_payload_len_ - 1) / max_payload_len_;
41 payload_length_ = (payload_size_ + num_packets - 1) / num_packets;
42 assert(payload_length_ <= max_payload_len_);
44 generic_header_ = RtpFormatVideoGeneric::kFirstPacketBit;
47 bool RtpPacketizerGeneric::NextPacket(uint8_t* buffer,
48 size_t* bytes_to_send,
50 if (payload_size_ < payload_length_) {
51 payload_length_ = payload_size_;
54 payload_size_ -= payload_length_;
55 *bytes_to_send = payload_length_ + kGenericHeaderLength;
56 assert(payload_length_ <= max_payload_len_);
58 uint8_t* out_ptr = buffer;
59 // Put generic header in packet
60 if (frame_type_ == kVideoFrameKey) {
61 generic_header_ |= RtpFormatVideoGeneric::kKeyFrameBit;
63 *out_ptr++ = generic_header_;
64 // Remove first-packet bit, following packets are intermediate
65 generic_header_ &= ~RtpFormatVideoGeneric::kFirstPacketBit;
67 // Put payload in packet
68 memcpy(out_ptr, payload_data_, payload_length_);
69 payload_data_ += payload_length_;
71 *last_packet = payload_size_ <= 0;
76 ProtectionType RtpPacketizerGeneric::GetProtectionType() {
77 return kProtectedPacket;
80 StorageType RtpPacketizerGeneric::GetStorageType(
81 uint32_t retransmission_settings) {
82 return kAllowRetransmission;
85 std::string RtpPacketizerGeneric::ToString() {
86 return "RtpPacketizerGeneric";
89 bool RtpDepacketizerGeneric::Parse(ParsedPayload* parsed_payload,
90 const uint8_t* payload_data,
91 size_t payload_data_length) {
92 assert(parsed_payload != NULL);
94 uint8_t generic_header = *payload_data++;
95 --payload_data_length;
97 parsed_payload->frame_type =
98 ((generic_header & RtpFormatVideoGeneric::kKeyFrameBit) != 0)
101 parsed_payload->type.Video.isFirstPacket =
102 (generic_header & RtpFormatVideoGeneric::kFirstPacketBit) != 0;
103 parsed_payload->type.Video.codec = kRtpVideoGeneric;
104 parsed_payload->type.Video.width = 0;
105 parsed_payload->type.Video.height = 0;
107 parsed_payload->payload = payload_data;
108 parsed_payload->payload_length = payload_data_length;
111 } // namespace webrtc