| @@ -1452,6 +1452,7 @@ static int dvbsub_decode(AVCodecContext *avctx, | |||||
| int page_id; | int page_id; | ||||
| int segment_length; | int segment_length; | ||||
| int i; | int i; | ||||
| int got_segment = 0; | |||||
| av_dlog(avctx, "DVB sub packet:\n"); | av_dlog(avctx, "DVB sub packet:\n"); | ||||
| @@ -1490,21 +1491,26 @@ static int dvbsub_decode(AVCodecContext *avctx, | |||||
| switch (segment_type) { | switch (segment_type) { | ||||
| case DVBSUB_PAGE_SEGMENT: | case DVBSUB_PAGE_SEGMENT: | ||||
| dvbsub_parse_page_segment(avctx, p, segment_length); | dvbsub_parse_page_segment(avctx, p, segment_length); | ||||
| got_segment |= 1; | |||||
| break; | break; | ||||
| case DVBSUB_REGION_SEGMENT: | case DVBSUB_REGION_SEGMENT: | ||||
| dvbsub_parse_region_segment(avctx, p, segment_length); | dvbsub_parse_region_segment(avctx, p, segment_length); | ||||
| got_segment |= 2; | |||||
| break; | break; | ||||
| case DVBSUB_CLUT_SEGMENT: | case DVBSUB_CLUT_SEGMENT: | ||||
| dvbsub_parse_clut_segment(avctx, p, segment_length); | dvbsub_parse_clut_segment(avctx, p, segment_length); | ||||
| got_segment |= 4; | |||||
| break; | break; | ||||
| case DVBSUB_OBJECT_SEGMENT: | case DVBSUB_OBJECT_SEGMENT: | ||||
| dvbsub_parse_object_segment(avctx, p, segment_length); | dvbsub_parse_object_segment(avctx, p, segment_length); | ||||
| got_segment |= 8; | |||||
| break; | break; | ||||
| case DVBSUB_DISPLAYDEFINITION_SEGMENT: | case DVBSUB_DISPLAYDEFINITION_SEGMENT: | ||||
| dvbsub_parse_display_definition_segment(avctx, p, segment_length); | dvbsub_parse_display_definition_segment(avctx, p, segment_length); | ||||
| break; | break; | ||||
| case DVBSUB_DISPLAY_SEGMENT: | case DVBSUB_DISPLAY_SEGMENT: | ||||
| *data_size = dvbsub_display_end_segment(avctx, p, segment_length, sub); | *data_size = dvbsub_display_end_segment(avctx, p, segment_length, sub); | ||||
| got_segment |= 16; | |||||
| break; | break; | ||||
| default: | default: | ||||
| av_dlog(avctx, "Subtitling segment type 0x%x, page id %d, length %d\n", | av_dlog(avctx, "Subtitling segment type 0x%x, page id %d, length %d\n", | ||||
| @@ -1515,6 +1521,10 @@ static int dvbsub_decode(AVCodecContext *avctx, | |||||
| p += segment_length; | p += segment_length; | ||||
| } | } | ||||
| // Some streams do not send a display segment but if we have all the other | |||||
| // segments then we need no further data. | |||||
| if (got_segment == 15 && sub) | |||||
| *data_size = dvbsub_display_end_segment(avctx, p, 0, sub); | |||||
| return p - buf; | return p - buf; | ||||
| } | } | ||||