Chromium Code Reviews| Index: webrtc/modules/video_coding/h264_sps_pps_tracker.cc |
| diff --git a/webrtc/modules/video_coding/h264_sps_pps_tracker.cc b/webrtc/modules/video_coding/h264_sps_pps_tracker.cc |
| index ad836b621917207739210c108628346cbe9183a7..d1d52b4ed29475b5c496fb47120212f1f506bcbb 100644 |
| --- a/webrtc/modules/video_coding/h264_sps_pps_tracker.cc |
| +++ b/webrtc/modules/video_coding/h264_sps_pps_tracker.cc |
| @@ -37,15 +37,9 @@ H264SpsPpsTracker::PacketAction H264SpsPpsTracker::CopyAndFixBitstream( |
| const RTPVideoHeader& video_header = packet->video_header; |
| const RTPVideoHeaderH264& codec_header = video_header.codecHeader.H264; |
| - // Packets that only contains SPS/PPS are not decodable by themselves, and |
| - // to avoid frames being created containing only these two nalus we don't |
| - // insert them into the PacketBuffer. Instead we save the SPS/PPS and |
| - // prepend the bitstream of first packet of an IDR referring to the |
| - // corresponding SPS/PPS id. |
| - bool insert_packet = codec_header.nalus_length == 0 ? true : false; |
| - |
| int pps_id = -1; |
| int sps_id = -1; |
| + bool append_sps_pps = codec_header.nalus_length == 0; |
| size_t required_size = 0; |
| for (size_t i = 0; i < codec_header.nalus_length; ++i) { |
| const NaluInfo& nalu = codec_header.nalus[i]; |
| @@ -101,15 +95,28 @@ H264SpsPpsTracker::PacketAction H264SpsPpsTracker::CopyAndFixBitstream( |
| FALLTHROUGH(); |
| } |
| default: { |
| - // Something other than an SPS/PPS nalu in this packet, then it should |
| - // be inserted into the PacketBuffer. |
| - insert_packet = true; |
| + // Something other than an SPS/PPS nalu in this packet, then the SPS/PPS |
| + // should be appended. |
| + append_sps_pps = true; |
| } |
| } |
| } |
| - if (!insert_packet) |
| - return kDrop; |
| + if (!append_sps_pps) { |
| + // Two things: Firstly, when we receive a packet the data pointed at by |
| + // |dataPtr| is volatile, meaning we have to copy the data into our own |
| + // buffer if we want to use it at a later stage. Secondly, when a packet is |
| + // inserted into the PacketBuffer it expects the packet to own its own |
| + // buffer, and this function copies (and fix) the bitstream of the packet |
|
stefan-webrtc
2017/05/19 10:30:40
"and fixes"
|
| + // into its own buffer. |
| + // |
| + // SPS/PPS packets is a special case. Since we save the SPS/PPS NALU and |
| + // append it to the first packet of every IDR frame the SPS/PPS packet |
| + // doesn't actually need to contain any bitstream data. |
|
stefan-webrtc
2017/05/19 10:30:40
Is this the right way of doing it? Isn't it better
|
| + packet->dataPtr = nullptr; |
| + packet->sizeBytes = 0; |
| + return kInsert; |
| + } |
| // Calculate how much space we need for the rest of the bitstream. |
| if (codec_header.packetization_type == kH264StapA) { |