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;
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)
*/
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",
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;
}
.version = LIBAVUTIL_VERSION_INT,
};
-AVCodec ff_pgssub_decoder = {
+const AVCodec ff_pgssub_decoder = {
.name = "pgssub",
.long_name = NULL_IF_CONFIG_SMALL("HDMV Presentation Graphic Stream subtitles"),
.type = AVMEDIA_TYPE_SUBTITLE,