@@ -79,19 +79,17 @@ enum HevcFuDefs { kHevcSBit = 0x80, kHevcEBit = 0x40, kHevcFuTypeBit = 0x3F };
79
79
RtpPacketizerH265::RtpPacketizerH265 (
80
80
rtc::ArrayView<const uint8_t > payload,
81
81
PayloadSizeLimits limits,
82
- H265PacketizationMode packetization_mode,
83
- const RTPFragmentationHeader& fragmentation)
82
+ H265PacketizationMode packetization_mode)
84
83
: limits_(limits),
85
84
num_packets_left_ (0 ) {
86
85
// Guard against uninitialized memory in packetization_mode.
87
86
RTC_CHECK (packetization_mode == H265PacketizationMode::NonInterleaved ||
88
87
packetization_mode == H265PacketizationMode::SingleNalUnit);
89
88
90
- for (size_t i = 0 ; i < fragmentation.fragmentationVectorSize ; ++i) {
91
- const uint8_t * fragment =
92
- payload.data () + fragmentation.fragmentationOffset [i];
93
- const size_t fragment_length = fragmentation.fragmentationLength [i];
94
- input_fragments_.push_back (Fragment (fragment, fragment_length));
89
+ for (const auto & nalu :
90
+ H264::FindNaluIndices (payload.data (), payload.size ())) {
91
+ input_fragments_.push_back (
92
+ payload.subview (nalu.payload_start_offset , nalu.payload_size ));
95
93
}
96
94
97
95
if (!GeneratePackets (packetization_mode)) {
@@ -111,18 +109,12 @@ size_t RtpPacketizerH265::NumPackets() const {
111
109
return num_packets_left_;
112
110
}
113
111
114
- RtpPacketizerH265::Fragment::Fragment (const uint8_t * buffer, size_t length)
115
- : buffer(buffer), length(length) {}
116
- RtpPacketizerH265::Fragment::Fragment (const Fragment& fragment)
117
- : buffer(fragment.buffer), length(fragment.length) {}
118
-
119
-
120
112
bool RtpPacketizerH265::GeneratePackets (
121
113
H265PacketizationMode packetization_mode) {
122
114
// For HEVC we follow non-interleaved mode for the packetization,
123
115
// and don't support single-nalu mode at present.
124
116
for (size_t i = 0 ; i < input_fragments_.size ();) {
125
- int fragment_len = input_fragments_[i].length ;
117
+ int fragment_len = input_fragments_[i].size () ;
126
118
int single_packet_capacity = limits_.max_payload_len ;
127
119
if (input_fragments_.size () == 1 )
128
120
single_packet_capacity -= limits_.single_packet_reduction_len ;
@@ -147,7 +139,7 @@ bool RtpPacketizerH265::GeneratePackets(
147
139
bool RtpPacketizerH265::PacketizeFu (size_t fragment_index) {
148
140
// Fragment payload into packets (FU).
149
141
// Strip out the original header and leave room for the FU header.
150
- const Fragment& fragment = input_fragments_[fragment_index];
142
+ rtc::ArrayView< const uint8_t > fragment = input_fragments_[fragment_index];
151
143
PayloadSizeLimits limits = limits_;
152
144
limits.max_payload_len -= kHevcFuHeaderSize + kHevcNalHeaderSize ;
153
145
@@ -170,7 +162,7 @@ bool RtpPacketizerH265::PacketizeFu(size_t fragment_index) {
170
162
limits.last_packet_reduction_len = 0 ;
171
163
172
164
// Strip out the original header.
173
- size_t payload_left = fragment.length - kHevcNalHeaderSize ;
165
+ size_t payload_left = fragment.size () - kHevcNalHeaderSize ;
174
166
int offset = kHevcNalHeaderSize ;
175
167
176
168
std::vector<int > payload_sizes = SplitAboutEqually (payload_left, limits);
@@ -180,8 +172,8 @@ bool RtpPacketizerH265::PacketizeFu(size_t fragment_index) {
180
172
for (size_t i = 0 ; i < payload_sizes.size (); ++i) {
181
173
int packet_length = payload_sizes[i];
182
174
RTC_CHECK_GT (packet_length, 0 );
183
- uint16_t header = (fragment. buffer [0 ] << 8 ) | fragment. buffer [1 ];
184
- packets_.push (PacketUnit (Fragment ( fragment.buffer + offset, packet_length),
175
+ uint16_t header = (fragment[0 ] << 8 ) | fragment[1 ];
176
+ packets_.push (PacketUnit (fragment.subview ( offset, packet_length),
185
177
/* first_fragment=*/ i == 0 ,
186
178
/* last_fragment=*/ i == payload_sizes.size () - 1 ,
187
179
false , header));
@@ -203,18 +195,18 @@ bool RtpPacketizerH265::PacketizeSingleNalu(size_t fragment_index) {
203
195
payload_size_left -= limits_.first_packet_reduction_len ;
204
196
else if (fragment_index + 1 == input_fragments_.size ())
205
197
payload_size_left -= limits_.last_packet_reduction_len ;
206
- const Fragment* fragment = & input_fragments_[fragment_index];
207
- if (payload_size_left < fragment-> length ) {
198
+ rtc::ArrayView< const uint8_t > fragment = input_fragments_[fragment_index];
199
+ if (payload_size_left < fragment. size () ) {
208
200
RTC_LOG (LS_ERROR) << " Failed to fit a fragment to packet in SingleNalu "
209
201
" packetization mode. Payload size left "
210
202
<< payload_size_left << " , fragment length "
211
- << fragment-> length << " , packet capacity "
203
+ << fragment. size () << " , packet capacity "
212
204
<< limits_.max_payload_len ;
213
205
return false ;
214
206
}
215
- RTC_CHECK_GT (fragment-> length , 0u );
216
- packets_.push (PacketUnit (* fragment, true /* first */ , true /* last */ ,
217
- false /* aggregated */ , fragment-> buffer [0 ]));
207
+ RTC_CHECK_GT (fragment. size () , 0u );
208
+ packets_.push (PacketUnit (fragment, true /* first */ , true /* last */ ,
209
+ false /* aggregated */ , fragment[0 ]));
218
210
++num_packets_left_;
219
211
return true ;
220
212
}
@@ -228,12 +220,12 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
228
220
payload_size_left -= limits_.first_packet_reduction_len ;
229
221
int aggregated_fragments = 0 ;
230
222
size_t fragment_headers_length = 0 ;
231
- const Fragment* fragment = & input_fragments_[fragment_index];
232
- RTC_CHECK_GE (payload_size_left, fragment-> length );
223
+ rtc::ArrayView< const uint8_t > fragment = input_fragments_[fragment_index];
224
+ RTC_CHECK_GE (payload_size_left, fragment. size () );
233
225
++num_packets_left_;
234
226
235
227
auto payload_size_needed = [&] {
236
- size_t fragment_size = fragment-> length + fragment_headers_length;
228
+ size_t fragment_size = fragment. size () + fragment_headers_length;
237
229
if (input_fragments_.size () == 1 ) {
238
230
// Single fragment, single packet, payload_size_left already adjusted
239
231
// with limits_.single_packet_reduction_len.
@@ -247,10 +239,10 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
247
239
};
248
240
249
241
while (payload_size_left >= payload_size_needed ()) {
250
- RTC_CHECK_GT (fragment-> length , 0 );
251
- packets_.push (PacketUnit (* fragment, aggregated_fragments == 0 , false , true ,
252
- fragment-> buffer [0 ]));
253
- payload_size_left -= fragment-> length ;
242
+ RTC_CHECK_GT (fragment. size () , 0 );
243
+ packets_.push (PacketUnit (fragment, aggregated_fragments == 0 , false , true ,
244
+ fragment[0 ]));
245
+ payload_size_left -= fragment. size () ;
254
246
payload_size_left -= fragment_headers_length;
255
247
256
248
fragment_headers_length = kHevcLengthFieldSize ;
@@ -265,7 +257,7 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
265
257
++fragment_index;
266
258
if (fragment_index == input_fragments_.size ())
267
259
break ;
268
- fragment = & input_fragments_[fragment_index];
260
+ fragment = input_fragments_[fragment_index];
269
261
}
270
262
RTC_CHECK_GT (aggregated_fragments, 0 );
271
263
packets_.back ().last_fragment = true ;
@@ -283,9 +275,9 @@ bool RtpPacketizerH265::NextPacket(RtpPacketToSend* rtp_packet) {
283
275
284
276
if (packet.first_fragment && packet.last_fragment ) {
285
277
// Single NAL unit packet.
286
- size_t bytes_to_send = packet.source_fragment .length ;
278
+ size_t bytes_to_send = packet.source_fragment .size () ;
287
279
uint8_t * buffer = rtp_packet->AllocatePayload (bytes_to_send);
288
- memcpy (buffer, packet.source_fragment .buffer , bytes_to_send);
280
+ memcpy (buffer, packet.source_fragment .data () , bytes_to_send);
289
281
packets_.pop ();
290
282
input_fragments_.pop_front ();
291
283
} else if (packet.aggregated ) {
@@ -320,12 +312,12 @@ void RtpPacketizerH265::NextAggregatePacket(RtpPacketToSend* rtp_packet,
320
312
bool is_last_fragment = packet->last_fragment ;
321
313
while (packet->aggregated ) {
322
314
// Add NAL unit length field.
323
- const Fragment& fragment = packet->source_fragment ;
324
- ByteWriter<uint16_t >::WriteBigEndian (&buffer[index], fragment.length );
315
+ rtc::ArrayView< const uint8_t > fragment = packet->source_fragment ;
316
+ ByteWriter<uint16_t >::WriteBigEndian (&buffer[index], fragment.size () );
325
317
index += kHevcLengthFieldSize ;
326
318
// Add NAL unit.
327
- memcpy (&buffer[index], fragment.buffer , fragment.length );
328
- index += fragment.length ;
319
+ memcpy (&buffer[index], fragment.data () , fragment.size () );
320
+ index += fragment.size () ;
329
321
packets_.pop ();
330
322
input_fragments_.pop_front ();
331
323
if (is_last_fragment)
@@ -355,20 +347,20 @@ void RtpPacketizerH265::NextFragmentPacket(RtpPacketToSend* rtp_packet) {
355
347
// Now update payload_hdr_h with FU type.
356
348
payload_hdr_h =
357
349
(payload_hdr_h & kHevcTypeMaskN ) | (kHevcFu << 1 ) | layer_id_h;
358
- const Fragment& fragment = packet->source_fragment ;
350
+ rtc::ArrayView< const uint8_t > fragment = packet->source_fragment ;
359
351
uint8_t * buffer = rtp_packet->AllocatePayload (
360
- kHevcFuHeaderSize + kHevcNalHeaderSize + fragment.length );
352
+ kHevcFuHeaderSize + kHevcNalHeaderSize + fragment.size () );
361
353
RTC_CHECK (buffer);
362
354
buffer[0 ] = payload_hdr_h;
363
355
buffer[1 ] = payload_hdr_l;
364
356
buffer[2 ] = fu_header;
365
357
366
358
if (packet->last_fragment ) {
367
- memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.buffer ,
368
- fragment.length );
359
+ memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.data () ,
360
+ fragment.size () );
369
361
} else {
370
- memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.buffer ,
371
- fragment.length );
362
+ memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.data () ,
363
+ fragment.size () );
372
364
}
373
365
packets_.pop ();
374
366
}
0 commit comments