X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fpgssubdec.c;h=eaf069017a3b9b495113d47061bea4b1c41d9608;hb=0a071f7124beaf0929f772a8618ac1b6c17b0222;hp=b897d72aab351c9002f3642f0e4927671493d984;hpb=27e30c73d722ec13e59753dea91be00859c72bf2;p=ffmpeg diff --git a/libavcodec/pgssubdec.c b/libavcodec/pgssubdec.c index b897d72aab3..eaf069017a3 100644 --- a/libavcodec/pgssubdec.c +++ b/libavcodec/pgssubdec.c @@ -596,25 +596,11 @@ static int display_end_segment(AVCodecContext *avctx, void *data, if (!ctx->forced_subs_only || ctx->presentation.objects[i].composition_flag & 0x40) memcpy(sub->rects[i]->data[1], palette->clut, sub->rects[i]->nb_colors * sizeof(uint32_t)); - -#if FF_API_AVPICTURE -FF_DISABLE_DEPRECATION_WARNINGS -{ - AVSubtitleRect *rect; - int j; - rect = sub->rects[i]; - for (j = 0; j < 4; j++) { - rect->pict.data[j] = rect->data[j]; - rect->pict.linesize[j] = rect->linesize[j]; - } -} -FF_ENABLE_DEPRECATION_WARNINGS -#endif } return 1; } -static int decode(AVCodecContext *avctx, void *data, int *data_size, +static int decode(AVCodecContext *avctx, void *data, int *got_sub_ptr, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; @@ -636,7 +622,7 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, if (i & 15) ff_dlog(avctx, "\n"); - *data_size = 0; + *got_sub_ptr = 0; /* Ensure that we have received at a least a segment code and segment length */ if (buf_size < 3) @@ -676,9 +662,14 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, */ break; case DISPLAY_SEGMENT: + if (*got_sub_ptr) { + av_log(avctx, AV_LOG_ERROR, "Duplicate display segment\n"); + ret = AVERROR_INVALIDDATA; + break; + } ret = display_end_segment(avctx, data, buf, segment_length); if (ret >= 0) - *data_size = ret; + *got_sub_ptr = ret; break; default: av_log(avctx, AV_LOG_ERROR, "Unknown subtitle segment type 0x%x, length %d\n", @@ -686,8 +677,11 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, ret = AVERROR_INVALIDDATA; break; } - if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) + if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) { + avsubtitle_free(data); + *got_sub_ptr = 0; return ret; + } buf += segment_length; }