@@ -79,19 +79,17 @@ enum HevcFuDefs { kHevcSBit = 0x80, kHevcEBit = 0x40, kHevcFuTypeBit = 0x3F };
7979RtpPacketizerH265::RtpPacketizerH265 (
8080 rtc::ArrayView<const uint8_t > payload,
8181 PayloadSizeLimits limits,
82- H265PacketizationMode packetization_mode,
83- const RTPFragmentationHeader& fragmentation)
82+ H265PacketizationMode packetization_mode)
8483 : limits_(limits),
8584 num_packets_left_ (0 ) {
8685 // Guard against uninitialized memory in packetization_mode.
8786 RTC_CHECK (packetization_mode == H265PacketizationMode::NonInterleaved ||
8887 packetization_mode == H265PacketizationMode::SingleNalUnit);
8988
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 ));
9593 }
9694
9795 if (!GeneratePackets (packetization_mode)) {
@@ -111,18 +109,12 @@ size_t RtpPacketizerH265::NumPackets() const {
111109 return num_packets_left_;
112110}
113111
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-
120112bool RtpPacketizerH265::GeneratePackets (
121113 H265PacketizationMode packetization_mode) {
122114 // For HEVC we follow non-interleaved mode for the packetization,
123115 // and don't support single-nalu mode at present.
124116 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 () ;
126118 int single_packet_capacity = limits_.max_payload_len ;
127119 if (input_fragments_.size () == 1 )
128120 single_packet_capacity -= limits_.single_packet_reduction_len ;
@@ -147,7 +139,7 @@ bool RtpPacketizerH265::GeneratePackets(
147139bool RtpPacketizerH265::PacketizeFu (size_t fragment_index) {
148140 // Fragment payload into packets (FU).
149141 // 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];
151143 PayloadSizeLimits limits = limits_;
152144 limits.max_payload_len -= kHevcFuHeaderSize + kHevcNalHeaderSize ;
153145
@@ -170,7 +162,7 @@ bool RtpPacketizerH265::PacketizeFu(size_t fragment_index) {
170162 limits.last_packet_reduction_len = 0 ;
171163
172164 // Strip out the original header.
173- size_t payload_left = fragment.length - kHevcNalHeaderSize ;
165+ size_t payload_left = fragment.size () - kHevcNalHeaderSize ;
174166 int offset = kHevcNalHeaderSize ;
175167
176168 std::vector<int > payload_sizes = SplitAboutEqually (payload_left, limits);
@@ -180,8 +172,8 @@ bool RtpPacketizerH265::PacketizeFu(size_t fragment_index) {
180172 for (size_t i = 0 ; i < payload_sizes.size (); ++i) {
181173 int packet_length = payload_sizes[i];
182174 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),
185177 /* first_fragment=*/ i == 0 ,
186178 /* last_fragment=*/ i == payload_sizes.size () - 1 ,
187179 false , header));
@@ -203,18 +195,18 @@ bool RtpPacketizerH265::PacketizeSingleNalu(size_t fragment_index) {
203195 payload_size_left -= limits_.first_packet_reduction_len ;
204196 else if (fragment_index + 1 == input_fragments_.size ())
205197 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 () ) {
208200 RTC_LOG (LS_ERROR) << " Failed to fit a fragment to packet in SingleNalu "
209201 " packetization mode. Payload size left "
210202 << payload_size_left << " , fragment length "
211- << fragment-> length << " , packet capacity "
203+ << fragment. size () << " , packet capacity "
212204 << limits_.max_payload_len ;
213205 return false ;
214206 }
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 ]));
218210 ++num_packets_left_;
219211 return true ;
220212}
@@ -228,12 +220,12 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
228220 payload_size_left -= limits_.first_packet_reduction_len ;
229221 int aggregated_fragments = 0 ;
230222 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 () );
233225 ++num_packets_left_;
234226
235227 auto payload_size_needed = [&] {
236- size_t fragment_size = fragment-> length + fragment_headers_length;
228+ size_t fragment_size = fragment. size () + fragment_headers_length;
237229 if (input_fragments_.size () == 1 ) {
238230 // Single fragment, single packet, payload_size_left already adjusted
239231 // with limits_.single_packet_reduction_len.
@@ -247,10 +239,10 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
247239 };
248240
249241 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 () ;
254246 payload_size_left -= fragment_headers_length;
255247
256248 fragment_headers_length = kHevcLengthFieldSize ;
@@ -265,7 +257,7 @@ int RtpPacketizerH265::PacketizeAp(size_t fragment_index) {
265257 ++fragment_index;
266258 if (fragment_index == input_fragments_.size ())
267259 break ;
268- fragment = & input_fragments_[fragment_index];
260+ fragment = input_fragments_[fragment_index];
269261 }
270262 RTC_CHECK_GT (aggregated_fragments, 0 );
271263 packets_.back ().last_fragment = true ;
@@ -283,9 +275,9 @@ bool RtpPacketizerH265::NextPacket(RtpPacketToSend* rtp_packet) {
283275
284276 if (packet.first_fragment && packet.last_fragment ) {
285277 // Single NAL unit packet.
286- size_t bytes_to_send = packet.source_fragment .length ;
278+ size_t bytes_to_send = packet.source_fragment .size () ;
287279 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);
289281 packets_.pop ();
290282 input_fragments_.pop_front ();
291283 } else if (packet.aggregated ) {
@@ -320,12 +312,12 @@ void RtpPacketizerH265::NextAggregatePacket(RtpPacketToSend* rtp_packet,
320312 bool is_last_fragment = packet->last_fragment ;
321313 while (packet->aggregated ) {
322314 // 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 () );
325317 index += kHevcLengthFieldSize ;
326318 // 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 () ;
329321 packets_.pop ();
330322 input_fragments_.pop_front ();
331323 if (is_last_fragment)
@@ -355,20 +347,20 @@ void RtpPacketizerH265::NextFragmentPacket(RtpPacketToSend* rtp_packet) {
355347 // Now update payload_hdr_h with FU type.
356348 payload_hdr_h =
357349 (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 ;
359351 uint8_t * buffer = rtp_packet->AllocatePayload (
360- kHevcFuHeaderSize + kHevcNalHeaderSize + fragment.length );
352+ kHevcFuHeaderSize + kHevcNalHeaderSize + fragment.size () );
361353 RTC_CHECK (buffer);
362354 buffer[0 ] = payload_hdr_h;
363355 buffer[1 ] = payload_hdr_l;
364356 buffer[2 ] = fu_header;
365357
366358 if (packet->last_fragment ) {
367- memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.buffer ,
368- fragment.length );
359+ memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.data () ,
360+ fragment.size () );
369361 } else {
370- memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.buffer ,
371- fragment.length );
362+ memcpy (buffer + kHevcFuHeaderSize + kHevcNalHeaderSize , fragment.data () ,
363+ fragment.size () );
372364 }
373365 packets_.pop ();
374366}
0 commit comments