On Tue, Dec 13, 2011 at 02:18:19AM +0530, Aneesh Dogra wrote: > --- > libavcodec/vc1dec.c | 19 +++++++++---------- > 1 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c > index 0340dc2..35596ad 100644 > --- a/libavcodec/vc1dec.c > +++ b/libavcodec/vc1dec.c > @@ -5425,7 +5425,6 @@ static int vc1_decode_frame(AVCodecContext *avctx, void > *data, > MpegEncContext *s = &v->s; > AVFrame *pict = data; > uint8_t *buf2 = NULL; > - uint8_t *buf_field2 = NULL; > const uint8_t *buf_start = buf; > int mb_height, n_slices1; > struct { > @@ -5492,9 +5491,6 @@ static int vc1_decode_frame(AVCodecContext *avctx, void > *data, > slices[n_slices].mby_start = s->mb_height >> 1; > n_slices1 = n_slices - 1; // index of the last slice of > the first field > n_slices++; > - // not necessary, ad hoc until I find a way to handle > WVC1i > - buf_field2 = av_mallocz(buf_size + > FF_INPUT_BUFFER_PADDING_SIZE); > - vc1_unescape_buffer(start + 4, size, buf_field2); > break; > } > case VC1_CODE_ENTRYPOINT: /* it should be before frame data > */ > @@ -5522,14 +5518,21 @@ static int vc1_decode_frame(AVCodecContext *avctx, > void *data, > } > } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 > interlaced stores both fields divided by marker */ > const uint8_t *divider; > + int buf_size3; > > divider = find_next_marker(buf, buf + buf_size); > if ((divider == (buf + buf_size)) || AV_RB32(divider) != > VC1_CODE_FIELD) { > av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced > frame\n"); > goto err; > } else { // found field marker, unescape second field > - buf_field2 = av_mallocz(buf_size + > FF_INPUT_BUFFER_PADDING_SIZE); > - vc1_unescape_buffer(divider + 4, buf + buf_size - divider - > 4, buf_field2); > + slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
this still needs a check for realloc failure something like uint8_t *tmp; ... tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1)); if (!tmp) goto err; slices = tmp; > + slices[n_slices].buf = av_mallocz(buf_size + > FF_INPUT_BUFFER_PADDING_SIZE); and this one - for alloc failure, like if (!slices[n_slices].buf) goto err; > + buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size > - divider - 4, slices[n_slices].buf); > + init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, > + buf_size3 << 3); > + slices[n_slices].mby_start = s->mb_height >> 1; > + n_slices1 = n_slices - 1; > + n_slices++; > } > buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2); > } else { > @@ -5700,10 +5703,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, > void *data, > s->gb = slices[i].gb; > } > if (v->field_mode) { > - av_free(buf_field2); > v->second_field = 0; > - } > - if (v->field_mode) { > if (s->pict_type == AV_PICTURE_TYPE_B) { > memcpy(v->mv_f_base, v->mv_f_next_base, > 2 * (s->b8_stride * (s->mb_height * 2 + 1) + > s->mb_stride * (s->mb_height + 1) * 2)); > @@ -5758,7 +5758,6 @@ err: > for (i = 0; i < n_slices; i++) > av_free(slices[i].buf); > av_free(slices); > - av_free(buf_field2); > return -1; > } > > -- > 1.7.4.1 > > _______________________________________________ > libav-devel mailing list > libav-devel@libav.org > https://lists.libav.org/mailman/listinfo/libav-devel _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel