diff --git a/source/mjpeg_decoder.cc b/source/mjpeg_decoder.cc index ad1762092..51cfaea01 100644 --- a/source/mjpeg_decoder.cc +++ b/source/mjpeg_decoder.cc @@ -125,7 +125,11 @@ LIBYUV_BOOL MJpegDecoder::LoadFrame(const uint8_t* src, size_t src_len) { AllocOutputBuffers(GetNumComponents()); for (int i = 0; i < num_outbufs_; ++i) { int scanlines_size = GetComponentScanlinesPerImcuRow(i); - if (scanlines_sizes_[i] != scanlines_size) { + // The number of scanlines can change between frames (e.g. a different + // vertical sampling factor). The databuf below is sized from it, so track + // whether it changed to know when the databuf must be reallocated too. + int scanlines_size_changed = scanlines_sizes_[i] != scanlines_size; + if (scanlines_size_changed) { if (scanlines_[i]) { delete[] scanlines_[i]; } @@ -141,7 +145,7 @@ LIBYUV_BOOL MJpegDecoder::LoadFrame(const uint8_t* src, size_t src_len) { // next scanline. int databuf_stride = GetComponentStride(i); int databuf_size = scanlines_size * databuf_stride; - if (databuf_strides_[i] != databuf_stride) { + if (databuf_strides_[i] != databuf_stride || scanlines_size_changed) { if (databuf_[i]) { delete[] databuf_[i]; }