mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
dvbsubdec: add version checking
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
1fc7b0ed5a
commit
0f8d77199a
@ -154,6 +154,7 @@ static void png_save2(const char *filename, uint32_t *bitmap, int w, int h)
|
||||
|
||||
typedef struct DVBSubCLUT {
|
||||
int id;
|
||||
int version;
|
||||
|
||||
uint32_t clut4[4];
|
||||
uint32_t clut16[16];
|
||||
@ -180,6 +181,7 @@ typedef struct DVBSubObjectDisplay {
|
||||
|
||||
typedef struct DVBSubObject {
|
||||
int id;
|
||||
int version;
|
||||
|
||||
int type;
|
||||
|
||||
@ -199,6 +201,7 @@ typedef struct DVBSubRegionDisplay {
|
||||
|
||||
typedef struct DVBSubRegion {
|
||||
int id;
|
||||
int version;
|
||||
|
||||
int width;
|
||||
int height;
|
||||
@ -229,6 +232,7 @@ typedef struct DVBSubContext {
|
||||
int composition_id;
|
||||
int ancillary_id;
|
||||
|
||||
int version;
|
||||
int time_out;
|
||||
DVBSubRegion *region_list;
|
||||
DVBSubCLUT *clut_list;
|
||||
@ -375,6 +379,8 @@ static av_cold int dvbsub_init_decoder(AVCodecContext *avctx)
|
||||
ctx->ancillary_id = AV_RB16(avctx->extradata + 2);
|
||||
}
|
||||
|
||||
ctx->version = -1;
|
||||
|
||||
default_clut.id = -1;
|
||||
default_clut.next = NULL;
|
||||
|
||||
@ -928,6 +934,7 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
|
||||
|
||||
const uint8_t *buf_end = buf + buf_size;
|
||||
int i, clut_id;
|
||||
int version;
|
||||
DVBSubCLUT *clut;
|
||||
int entry_id, depth , full_range;
|
||||
int y, cr, cb, alpha;
|
||||
@ -945,6 +952,7 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
|
||||
av_dlog(avctx, "\n");
|
||||
|
||||
clut_id = *buf++;
|
||||
version = ((*buf)>>4)&15;
|
||||
buf += 1;
|
||||
|
||||
clut = get_clut(ctx, clut_id);
|
||||
@ -955,11 +963,16 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
|
||||
memcpy(clut, &default_clut, sizeof(DVBSubCLUT));
|
||||
|
||||
clut->id = clut_id;
|
||||
clut->version = -1;
|
||||
|
||||
clut->next = ctx->clut_list;
|
||||
ctx->clut_list = clut;
|
||||
}
|
||||
|
||||
if (clut->version != version) {
|
||||
|
||||
clut->version = version;
|
||||
|
||||
while (buf + 4 < buf_end) {
|
||||
entry_id = *buf++;
|
||||
|
||||
@ -1001,6 +1014,7 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
|
||||
if (depth & 0x20)
|
||||
clut->clut256[entry_id] = RGBA(r,g,b,255 - alpha);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1011,6 +1025,7 @@ static void dvbsub_parse_region_segment(AVCodecContext *avctx,
|
||||
|
||||
const uint8_t *buf_end = buf + buf_size;
|
||||
int region_id, object_id;
|
||||
int version;
|
||||
DVBSubRegion *region;
|
||||
DVBSubObject *object;
|
||||
DVBSubObjectDisplay *display;
|
||||
@ -1027,11 +1042,13 @@ static void dvbsub_parse_region_segment(AVCodecContext *avctx,
|
||||
region = av_mallocz(sizeof(DVBSubRegion));
|
||||
|
||||
region->id = region_id;
|
||||
region->version = -1;
|
||||
|
||||
region->next = ctx->region_list;
|
||||
ctx->region_list = region;
|
||||
}
|
||||
|
||||
version = ((*buf)>>4) & 15;
|
||||
fill = ((*buf++) >> 3) & 1;
|
||||
|
||||
region->width = AV_RB16(buf);
|
||||
@ -1127,13 +1144,21 @@ static void dvbsub_parse_page_segment(AVCodecContext *avctx,
|
||||
const uint8_t *buf_end = buf + buf_size;
|
||||
int region_id;
|
||||
int page_state;
|
||||
int timeout;
|
||||
int version;
|
||||
|
||||
if (buf_size < 1)
|
||||
return;
|
||||
|
||||
ctx->time_out = *buf++;
|
||||
timeout = *buf++;
|
||||
version = ((*buf)>>4) & 15;
|
||||
page_state = ((*buf++) >> 2) & 3;
|
||||
|
||||
if (ctx->version != version) {
|
||||
|
||||
ctx->time_out = timeout;
|
||||
ctx->version = version;
|
||||
|
||||
av_dlog(avctx, "Page time out %ds, state %d\n", ctx->time_out, page_state);
|
||||
|
||||
if (page_state == 1 || page_state == 2) {
|
||||
@ -1184,6 +1209,7 @@ static void dvbsub_parse_page_segment(AVCodecContext *avctx,
|
||||
|
||||
av_free(display);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user