From 88f6decad7967462a008e46443847a30238b2b21 Mon Sep 17 00:00:00 2001 From: Qiang Chen Date: Fri, 23 Feb 2018 09:39:08 -0800 Subject: [PATCH] Multiplex Codec Bug Fix: Padding Needed For H264 This CL fixes the bug that we must have some padding for H264 codec when used in Multiplex encoder/decoder, otherwise H264 decoder will crash. And this CL fixes a bug that potential infinite loop exists in MultiplexEncoderAdapter Bug: webrtc:8921 Change-Id: I4124579c31ee69f72e29d118378aa1f8b3f05eb4 Reviewed-on: https://webrtc-review.googlesource.com/56960 Commit-Queue: Qiang Chen Reviewed-by: Emircan Uysaler Cr-Commit-Position: refs/heads/master@{#22175} --- .../codecs/multiplex/multiplex_encoded_image_packer.cc | 9 +++++++-- .../codecs/multiplex/multiplex_encoder_adapter.cc | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/video_coding/codecs/multiplex/multiplex_encoded_image_packer.cc b/modules/video_coding/codecs/multiplex/multiplex_encoded_image_packer.cc index 83be3a7dd3..33f9c4fcfb 100644 --- a/modules/video_coding/codecs/multiplex/multiplex_encoded_image_packer.cc +++ b/modules/video_coding/codecs/multiplex/multiplex_encoded_image_packer.cc @@ -139,8 +139,10 @@ EncodedImage MultiplexEncodedImagePacker::PackAndRelease( frame_header.component_index = images[i].component_index; frame_header.bitstream_offset = bitstream_offset; + const size_t padding = + EncodedImage::GetBufferPaddingBytes(images[i].codec_type); frame_header.bitstream_length = - static_cast(images[i].encoded_image._length); + static_cast(images[i].encoded_image._length + padding); bitstream_offset += frame_header.bitstream_length; frame_header.codec_type = images[i].codec_type; @@ -213,8 +215,11 @@ MultiplexImage MultiplexEncodedImagePacker::Unpack( EncodedImage encoded_image = combined_image; encoded_image._timeStamp = combined_image._timeStamp; encoded_image._frameType = frame_headers[i].frame_type; - encoded_image._length = encoded_image._size = + encoded_image._size = static_cast(frame_headers[i].bitstream_length); + const size_t padding = + EncodedImage::GetBufferPaddingBytes(image_component.codec_type); + encoded_image._length = encoded_image._size - padding; encoded_image._buffer = combined_image._buffer + frame_headers[i].bitstream_offset; diff --git a/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc b/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc index 2754b39844..0d797ecedd 100644 --- a/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc +++ b/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc @@ -234,8 +234,9 @@ EncodedImageCallback::Result MultiplexEncoderAdapter::OnEncodedImage( if (stashed_image.image_components.size() == frame_count) { // Complete case - auto iter = stashed_images_.begin(); - while (iter != stashed_images_.end() && iter != stashed_image_next_itr) { + for (auto iter = stashed_images_.begin(); + iter != stashed_images_.end() && iter != stashed_image_next_itr; + iter++) { // No image at all, skip. if (iter->second.image_components.size() == 0) continue; @@ -252,7 +253,6 @@ EncodedImageCallback::Result MultiplexEncoderAdapter::OnEncodedImage( codec_info.codecSpecific.generic.simulcast_idx = 0; encoded_complete_callback_->OnEncodedImage(combined_image_, &codec_info, fragmentation); - iter++; } stashed_images_.erase(stashed_images_.begin(), stashed_image_next_itr);