|
|
@@ -67,6 +67,7 @@ typedef struct PGSSubContext { |
|
|
|
PGSSubPresentation presentation; |
|
|
|
uint32_t clut[256]; |
|
|
|
PGSSubPicture pictures[UINT16_MAX]; |
|
|
|
int64_t pts; |
|
|
|
int forced_subs_only; |
|
|
|
} PGSSubContext; |
|
|
|
|
|
|
@@ -378,6 +379,7 @@ static int display_end_segment(AVCodecContext *avctx, void *data, |
|
|
|
{ |
|
|
|
AVSubtitle *sub = data; |
|
|
|
PGSSubContext *ctx = avctx->priv_data; |
|
|
|
int64_t pts; |
|
|
|
|
|
|
|
uint16_t rect; |
|
|
|
|
|
|
@@ -387,7 +389,10 @@ static int display_end_segment(AVCodecContext *avctx, void *data, |
|
|
|
* not been cleared by a subsequent empty display command. |
|
|
|
*/ |
|
|
|
|
|
|
|
pts = ctx->pts != AV_NOPTS_VALUE ? ctx->pts : sub->pts; |
|
|
|
memset(sub, 0, sizeof(*sub)); |
|
|
|
sub->pts = pts; |
|
|
|
ctx->pts = AV_NOPTS_VALUE; |
|
|
|
|
|
|
|
// Blank if last object_count was 0. |
|
|
|
if (!ctx->presentation.object_count) |
|
|
@@ -436,8 +441,10 @@ static int display_end_segment(AVCodecContext *avctx, void *data, |
|
|
|
static int decode(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
AVPacket *avpkt) |
|
|
|
{ |
|
|
|
PGSSubContext *ctx = avctx->priv_data; |
|
|
|
const uint8_t *buf = avpkt->data; |
|
|
|
int buf_size = avpkt->size; |
|
|
|
AVSubtitle *sub = data; |
|
|
|
|
|
|
|
const uint8_t *buf_end; |
|
|
|
uint8_t segment_type; |
|
|
@@ -482,6 +489,7 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
break; |
|
|
|
case PRESENTATION_SEGMENT: |
|
|
|
parse_presentation_segment(avctx, buf, segment_length); |
|
|
|
ctx->pts = sub->pts; |
|
|
|
break; |
|
|
|
case WINDOW_SEGMENT: |
|
|
|
/* |
|
|
|