static av_cold int dvbsub_init_decoder(AVCodecContext *avctx)
{
int i, r, g, b, a = 0;
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
-
- memset(avctx->priv_data, 0, sizeof(DVBSubContext));
+ DVBSubContext *ctx = avctx->priv_data;
- ctx->composition_id = avctx->sub_id & 0xffff;
- ctx->ancillary_id = avctx->sub_id >> 16;
+ if (!avctx->extradata || avctx->extradata_size != 4) {
+ av_log(avctx, AV_LOG_WARNING, "Invalid extradata, subtitle streams may be combined!\n");
+ ctx->composition_id = -1;
+ ctx->ancillary_id = -1;
+ } else {
+ ctx->composition_id = AV_RB16(avctx->extradata);
+ ctx->ancillary_id = AV_RB16(avctx->extradata + 2);
+ }
default_clut.id = -1;
default_clut.next = NULL;
static av_cold int dvbsub_close_decoder(AVCodecContext *avctx)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
DVBSubRegionDisplay *display;
delete_state(ctx);
static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display,
const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
DVBSubRegion *region = get_region(ctx, display->region_id);
const uint8_t *buf_end = buf + buf_size;
static void dvbsub_parse_object_segment(AVCodecContext *avctx,
const uint8_t *buf, int buf_size)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
const uint8_t *buf_end = buf + buf_size;
const uint8_t *block;
static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
const uint8_t *buf, int buf_size)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
const uint8_t *buf_end = buf + buf_size;
int clut_id;
static void dvbsub_parse_region_segment(AVCodecContext *avctx,
const uint8_t *buf, int buf_size)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
const uint8_t *buf_end = buf + buf_size;
int region_id, object_id;
static void dvbsub_parse_page_segment(AVCodecContext *avctx,
const uint8_t *buf, int buf_size)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
DVBSubRegionDisplay *display;
DVBSubRegionDisplay *tmp_display_list, **tmp_ptr;
static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf,
int buf_size, AVSubtitle *sub)
{
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
+ DVBSubContext *ctx = avctx->priv_data;
DVBSubDisplayDefinition *display_def = ctx->display_definition;
DVBSubRegion *region;
{
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
- AVSubtitle *sub = (AVSubtitle*) data;
+ DVBSubContext *ctx = avctx->priv_data;
+ AVSubtitle *sub = data;
const uint8_t *p, *p_end;
int segment_type;
int page_id;
segment_length = AV_RB16(p);
p += 2;
- if (page_id == ctx->composition_id || page_id == ctx->ancillary_id) {
+ if (page_id == ctx->composition_id || page_id == ctx->ancillary_id ||
+ ctx->composition_id == -1 || ctx->ancillary_id == -1) {
switch (segment_type) {
case DVBSUB_PAGE_SEGMENT:
dvbsub_parse_page_segment(avctx, p, segment_length);
}
-AVCodec dvbsub_decoder = {
+AVCodec ff_dvbsub_decoder = {
"dvbsub",
AVMEDIA_TYPE_SUBTITLE,
CODEC_ID_DVB_SUBTITLE,