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 <qiangchen@chromium.org>
Reviewed-by: Emircan Uysaler <emircan@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22175}
This commit is contained in:
Qiang Chen
2018-02-23 09:39:08 -08:00
committed by Commit Bot
parent 1807d57ab8
commit 88f6decad7
2 changed files with 10 additions and 5 deletions

View File

@ -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<uint32_t>(images[i].encoded_image._length);
static_cast<uint32_t>(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<size_t>(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;

View File

@ -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);