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:
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user