X-Git-Url: https://git.piment-noir.org/?p=deb_ffmpeg.git;a=blobdiff_plain;f=ffmpeg%2Flibavcodec%2Fdvbsubdec.c;fp=ffmpeg%2Flibavcodec%2Fdvbsubdec.c;h=261e1614d026b30fc4af89866f812198a1a2082c;hp=097597ed91812a89170ad988c9ff92d269d477bc;hb=f6fa7814ccfe3e76514b36cf04f5cd3cb657c8cf;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00 diff --git a/ffmpeg/libavcodec/dvbsubdec.c b/ffmpeg/libavcodec/dvbsubdec.c index 097597e..261e161 100644 --- a/ffmpeg/libavcodec/dvbsubdec.c +++ b/ffmpeg/libavcodec/dvbsubdec.c @@ -306,64 +306,58 @@ static void delete_region_display_list(DVBSubContext *ctx, DVBSubRegion *region) obj2 = *obj2_ptr; while (obj2 != object) { - assert(obj2); + av_assert0(obj2); obj2_ptr = &obj2->next; obj2 = *obj2_ptr; } *obj2_ptr = obj2->next; - av_free(obj2); + av_freep(&obj2); } } } region->display_list = display->region_list_next; - av_free(display); + av_freep(&display); } } static void delete_cluts(DVBSubContext *ctx) { - DVBSubCLUT *clut; - while (ctx->clut_list) { - clut = ctx->clut_list; + DVBSubCLUT *clut = ctx->clut_list; ctx->clut_list = clut->next; - av_free(clut); + av_freep(&clut); } } static void delete_objects(DVBSubContext *ctx) { - DVBSubObject *object; - while (ctx->object_list) { - object = ctx->object_list; + DVBSubObject *object = ctx->object_list; ctx->object_list = object->next; - av_free(object); + av_freep(&object); } } static void delete_regions(DVBSubContext *ctx) { - DVBSubRegion *region; - while (ctx->region_list) { - region = ctx->region_list; + DVBSubRegion *region = ctx->region_list; ctx->region_list = region->next; delete_region_display_list(ctx, region); - av_free(region->pbuf); - av_free(region); + av_freep(®ion->pbuf); + av_freep(®ion); } } @@ -468,7 +462,7 @@ static av_cold int dvbsub_close_decoder(AVCodecContext *avctx) display = ctx->display_list; ctx->display_list = display->next; - av_free(display); + av_freep(&display); } return 0; @@ -734,22 +728,16 @@ static int dvbsub_read_8bit_string(uint8_t *destbuf, int dbuf_len, return pixels_read; } - if (map_table) - bits = map_table[0]; - else - bits = 0; - while (run_length-- > 0 && pixels_read < dbuf_len) { - *destbuf++ = bits; - pixels_read++; - } + bits = 0; } else { bits = *(*srcbuf)++; - - if (non_mod == 1 && bits == 1) - pixels_read += run_length; + } + if (non_mod == 1 && bits == 1) + pixels_read += run_length; + else { if (map_table) bits = map_table[bits]; - else while (run_length-- > 0 && pixels_read < dbuf_len) { + while (run_length-- > 0 && pixels_read < dbuf_len) { *destbuf++ = bits; pixels_read++; } @@ -763,7 +751,7 @@ static int dvbsub_read_8bit_string(uint8_t *destbuf, int dbuf_len, return pixels_read; } -static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_output) +static int save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_output) { DVBSubContext *ctx = avctx->priv_data; DVBSubRegionDisplay *display; @@ -774,6 +762,7 @@ static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_o uint32_t *clut_table; int i; int offset_x=0, offset_y=0; + int ret = 0; if (display_def) { @@ -784,7 +773,7 @@ static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_o /* Not touching AVSubtitles again*/ if(sub->num_rects) { avpriv_request_sample(ctx, "Different Version of Segment asked Twice\n"); - return; + return AVERROR_PATCHWELCOME; } for (display = ctx->display_list; display; display = display->next) { region = get_region(ctx, display->region_id); @@ -802,6 +791,11 @@ static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_o if (sub->num_rects > 0) { sub->rects = av_mallocz_array(sizeof(*sub->rects), sub->num_rects); + if (!sub->rects) { + ret = AVERROR(ENOMEM); + goto fail; + } + for(i=0; inum_rects; i++) sub->rects[i] = av_mallocz(sizeof(*sub->rects[i])); @@ -844,14 +838,39 @@ static void save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_o } rect->pict.data[1] = av_mallocz(AVPALETTE_SIZE); + if (!rect->pict.data[1]) { + ret = AVERROR(ENOMEM); + goto fail; + } memcpy(rect->pict.data[1], clut_table, (1 << region->depth) * sizeof(uint32_t)); rect->pict.data[0] = av_malloc(region->buf_size); + if (!rect->pict.data[0]) { + ret = AVERROR(ENOMEM); + goto fail; + } + memcpy(rect->pict.data[0], region->pbuf, region->buf_size); i++; } } + + return 0; +fail: + if (sub->rects) { + for(i=0; inum_rects; i++) { + rect = sub->rects[i]; + if (rect) { + av_freep(&rect->pict.data[0]); + av_freep(&rect->pict.data[1]); + } + av_freep(&sub->rects[i]); + } + av_freep(&sub->rects); + } + sub->num_rects = 0; + return ret; } static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display, @@ -1318,7 +1337,7 @@ static void dvbsub_parse_page_segment(AVCodecContext *avctx, tmp_display_list = display->next; - av_free(display); + av_freep(&display); } } @@ -1412,7 +1431,7 @@ static void save_display_set(DVBSubContext *ctx) png_save2(filename, pbuf, width, height); - av_free(pbuf); + av_freep(&pbuf); } fileno_index++;