Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc

Issue 2528343002: H.264 packetization mode 0 (try 3) (Closed)
Patch Set: Changed from enum to enum class Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 length_remaining -= nalu_size; 70 length_remaining -= nalu_size;
71 71
72 offsets->push_back(offset + kStapAHeaderSize); 72 offsets->push_back(offset + kStapAHeaderSize);
73 offset += kLengthFieldSize + nalu_size; 73 offset += kLengthFieldSize + nalu_size;
74 } 74 }
75 return true; 75 return true;
76 } 76 }
77 77
78 } // namespace 78 } // namespace
79 79
80 RtpPacketizerH264::RtpPacketizerH264(FrameType frame_type, 80 RtpPacketizerH264::RtpPacketizerH264(size_t max_payload_len,
81 size_t max_payload_len) 81 H264PacketizationMode packetization_mode)
82 : max_payload_len_(max_payload_len) {} 82 : max_payload_len_(max_payload_len),
83 packetization_mode_(packetization_mode) {}
83 84
84 RtpPacketizerH264::~RtpPacketizerH264() { 85 RtpPacketizerH264::~RtpPacketizerH264() {
85 } 86 }
86 87
87 RtpPacketizerH264::Fragment::Fragment(const uint8_t* buffer, size_t length) 88 RtpPacketizerH264::Fragment::Fragment(const uint8_t* buffer, size_t length)
88 : buffer(buffer), length(length) {} 89 : buffer(buffer), length(length) {}
89 RtpPacketizerH264::Fragment::Fragment(const Fragment& fragment) 90 RtpPacketizerH264::Fragment::Fragment(const Fragment& fragment)
90 : buffer(fragment.buffer), length(fragment.length) {} 91 : buffer(fragment.buffer), length(fragment.length) {}
91 92
92 void RtpPacketizerH264::SetPayloadData( 93 void RtpPacketizerH264::SetPayloadData(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 } 156 }
156 157
157 if (!updated_sps) 158 if (!updated_sps)
158 input_fragments_.push_back(Fragment(buffer, length)); 159 input_fragments_.push_back(Fragment(buffer, length));
159 } 160 }
160 GeneratePackets(); 161 GeneratePackets();
161 } 162 }
162 163
163 void RtpPacketizerH264::GeneratePackets() { 164 void RtpPacketizerH264::GeneratePackets() {
164 for (size_t i = 0; i < input_fragments_.size();) { 165 for (size_t i = 0; i < input_fragments_.size();) {
165 if (input_fragments_[i].length > max_payload_len_) { 166 switch (packetization_mode_) {
166 PacketizeFuA(i); 167 case H264PacketizationMode::SingleNalUnit:
167 ++i; 168 PacketizeSingleNalu(i);
168 } else { 169 ++i;
169 i = PacketizeStapA(i); 170 break;
171 case H264PacketizationMode::NonInterleaved:
172 if (input_fragments_[i].length > max_payload_len_) {
173 PacketizeFuA(i);
174 ++i;
175 } else {
176 i = PacketizeStapA(i);
177 }
178 break;
hbos 2016/12/02 10:21:26 case default: RTC_NOTREACHED();
sprang_webrtc 2016/12/02 10:52:29 I disagree. If you have an enum class with all val
hbos 2016/12/02 11:04:45 Oh right, neat, no default!
hta-webrtc 2016/12/02 11:09:01 With an enum, it's better to leave the default off
170 } 179 }
171 } 180 }
172 } 181 }
173 182
174 void RtpPacketizerH264::PacketizeFuA(size_t fragment_index) { 183 void RtpPacketizerH264::PacketizeFuA(size_t fragment_index) {
175 // Fragment payload into packets (FU-A). 184 // Fragment payload into packets (FU-A).
176 // Strip out the original header and leave room for the FU-A header. 185 // Strip out the original header and leave room for the FU-A header.
177 const Fragment& fragment = input_fragments_[fragment_index]; 186 const Fragment& fragment = input_fragments_[fragment_index];
178 187
179 size_t fragment_length = fragment.length - kNalHeaderSize; 188 size_t fragment_length = fragment.length - kNalHeaderSize;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 // we need to add the STAP-A NALU header and a length field for the first 231 // we need to add the STAP-A NALU header and a length field for the first
223 // NALU of this packet. 232 // NALU of this packet.
224 if (aggregated_fragments == 0) 233 if (aggregated_fragments == 0)
225 fragment_headers_length += kNalHeaderSize + kLengthFieldSize; 234 fragment_headers_length += kNalHeaderSize + kLengthFieldSize;
226 ++aggregated_fragments; 235 ++aggregated_fragments;
227 } 236 }
228 packets_.back().last_fragment = true; 237 packets_.back().last_fragment = true;
229 return fragment_index; 238 return fragment_index;
230 } 239 }
231 240
241 void RtpPacketizerH264::PacketizeSingleNalu(size_t fragment_index) {
242 // Add a single NALU to the queue, no aggregation.
243 size_t payload_size_left = max_payload_len_;
244 const Fragment* fragment = &input_fragments_[fragment_index];
245 RTC_CHECK_GE(payload_size_left, fragment->length)
246 << "Payload size left " << payload_size_left << ", fragment length "
247 << fragment->length << ", packetization mode "
248 << (packetization_mode_ == H264PacketizationMode::SingleNalUnit
249 ? "SingleNalUnit"
250 : "NonInterleaved");
251 RTC_CHECK_GT(fragment->length, 0u);
252 packets_.push(PacketUnit(*fragment, true /* first */, true /* last */,
253 false /* aggregated */, fragment->buffer[0]));
254 }
255
232 bool RtpPacketizerH264::NextPacket(uint8_t* buffer, 256 bool RtpPacketizerH264::NextPacket(uint8_t* buffer,
233 size_t* bytes_to_send, 257 size_t* bytes_to_send,
234 bool* last_packet) { 258 bool* last_packet) {
235 *bytes_to_send = 0; 259 *bytes_to_send = 0;
236 if (packets_.empty()) { 260 if (packets_.empty()) {
237 *bytes_to_send = 0; 261 *bytes_to_send = 0;
238 *last_packet = true; 262 *last_packet = true;
239 return false; 263 return false;
240 } 264 }
241 265
242 PacketUnit packet = packets_.front(); 266 PacketUnit packet = packets_.front();
243 267
244 if (packet.first_fragment && packet.last_fragment) { 268 if (packet.first_fragment && packet.last_fragment) {
245 // Single NAL unit packet. 269 // Single NAL unit packet.
246 *bytes_to_send = packet.source_fragment.length; 270 *bytes_to_send = packet.source_fragment.length;
247 memcpy(buffer, packet.source_fragment.buffer, *bytes_to_send); 271 memcpy(buffer, packet.source_fragment.buffer, *bytes_to_send);
248 packets_.pop(); 272 packets_.pop();
249 input_fragments_.pop_front(); 273 input_fragments_.pop_front();
250 RTC_CHECK_LE(*bytes_to_send, max_payload_len_); 274 RTC_CHECK_LE(*bytes_to_send, max_payload_len_);
251 } else if (packet.aggregated) { 275 } else if (packet.aggregated) {
276 RTC_CHECK(packetization_mode_ == H264PacketizationMode::NonInterleaved);
hbos 2016/12/02 10:21:26 nit: RTC_CHECK_EQ
hta-webrtc 2016/12/02 11:09:01 I tried. The RTC_CHECK_EQ macro borks on "enum cla
hbos 2016/12/02 11:58:42 Acknowledged.
252 NextAggregatePacket(buffer, bytes_to_send); 277 NextAggregatePacket(buffer, bytes_to_send);
253 RTC_CHECK_LE(*bytes_to_send, max_payload_len_); 278 RTC_CHECK_LE(*bytes_to_send, max_payload_len_);
254 } else { 279 } else {
280 RTC_CHECK(packetization_mode_ == H264PacketizationMode::NonInterleaved);
255 NextFragmentPacket(buffer, bytes_to_send); 281 NextFragmentPacket(buffer, bytes_to_send);
256 RTC_CHECK_LE(*bytes_to_send, max_payload_len_); 282 RTC_CHECK_LE(*bytes_to_send, max_payload_len_);
257 } 283 }
258 *last_packet = packets_.empty(); 284 *last_packet = packets_.empty();
259 return true; 285 return true;
260 } 286 }
261 287
262 void RtpPacketizerH264::NextAggregatePacket(uint8_t* buffer, 288 void RtpPacketizerH264::NextAggregatePacket(uint8_t* buffer,
263 size_t* bytes_to_send) { 289 size_t* bytes_to_send) {
264 PacketUnit* packet = &packets_.front(); 290 PacketUnit* packet = &packets_.front();
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 h264->packetization_type = kH264FuA; 621 h264->packetization_type = kH264FuA;
596 h264->nalu_type = original_nal_type; 622 h264->nalu_type = original_nal_type;
597 if (first_fragment) { 623 if (first_fragment) {
598 h264->nalus[h264->nalus_length] = nalu; 624 h264->nalus[h264->nalus_length] = nalu;
599 h264->nalus_length = 1; 625 h264->nalus_length = 1;
600 } 626 }
601 return true; 627 return true;
602 } 628 }
603 629
604 } // namespace webrtc 630 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698