34
34
#define DVBSUB_CLUT_SEGMENT 0x12
35
35
#define DVBSUB_OBJECT_SEGMENT 0x13
36
36
#define DVBSUB_DISPLAYDEFINITION_SEGMENT 0x14
37
- #define DVBSUB_DISPLAY_SEGMENT 0x80
37
+ #define DVBSUB_END_DISPLAY_SEGMENT 0x80
38
38
39
39
#define cm (ff_crop_tab + MAX_NEG_CROP)
40
40
@@ -1450,8 +1450,12 @@ static int dvbsub_decode(AVCodecContext *avctx, AVSubtitle *sub,
1450
1450
int segment_length ;
1451
1451
int i ;
1452
1452
int ret = 0 ;
1453
- int got_segment = 0 ;
1454
- int got_dds = 0 ;
1453
+ //int got_segment = 0;
1454
+ int got_page = 0 ;
1455
+ int got_region = 0 ;
1456
+ int got_object = 0 ;
1457
+ int got_end_display = 0 ;
1458
+ int got_displaydef = 0 ;
1455
1459
1456
1460
ff_dlog (avctx , "DVB sub packet:\n" );
1457
1461
@@ -1496,34 +1500,28 @@ static int dvbsub_decode(AVCodecContext *avctx, AVSubtitle *sub,
1496
1500
switch (segment_type ) {
1497
1501
case DVBSUB_PAGE_SEGMENT :
1498
1502
ret = dvbsub_parse_page_segment (avctx , p , segment_length , sub , got_sub_ptr );
1499
- got_segment | = 1 ;
1503
+ got_page = 1 ;
1500
1504
break ;
1501
1505
case DVBSUB_REGION_SEGMENT :
1502
1506
ret = dvbsub_parse_region_segment (avctx , p , segment_length );
1503
- got_segment |= 2 ;
1507
+ got_region = 1 ;
1504
1508
break ;
1505
1509
case DVBSUB_CLUT_SEGMENT :
1506
1510
ret = dvbsub_parse_clut_segment (avctx , p , segment_length );
1507
1511
if (ret < 0 ) goto end ;
1508
- got_segment |= 4 ;
1509
1512
break ;
1510
1513
case DVBSUB_OBJECT_SEGMENT :
1511
1514
ret = dvbsub_parse_object_segment (avctx , p , segment_length );
1512
- got_segment |= 8 ;
1515
+ got_object = 1 ;
1513
1516
break ;
1514
1517
case DVBSUB_DISPLAYDEFINITION_SEGMENT :
1515
1518
ret = dvbsub_parse_display_definition_segment (avctx , p ,
1516
1519
segment_length );
1517
- got_dds = 1 ;
1520
+ got_displaydef = 1 ;
1518
1521
break ;
1519
- case DVBSUB_DISPLAY_SEGMENT :
1522
+ case DVBSUB_END_DISPLAY_SEGMENT :
1520
1523
ret = dvbsub_display_end_segment (avctx , p , segment_length , sub , got_sub_ptr );
1521
- if (got_segment == 15 && !got_dds && !avctx -> width && !avctx -> height ) {
1522
- // Default from ETSI EN 300 743 V1.3.1 (7.2.1)
1523
- avctx -> width = 720 ;
1524
- avctx -> height = 576 ;
1525
- }
1526
- got_segment |= 16 ;
1524
+ got_end_display = 1 ;
1527
1525
break ;
1528
1526
default :
1529
1527
ff_dlog (avctx , "Subtitling segment type 0x%x, page id %d, length %d\n" ,
@@ -1536,13 +1534,24 @@ static int dvbsub_decode(AVCodecContext *avctx, AVSubtitle *sub,
1536
1534
1537
1535
p += segment_length ;
1538
1536
}
1539
- // Some streams do not send a display segment but if we have all the other
1540
- // segments then we need no further data.
1541
- if (got_segment == 15 ) {
1542
- av_log (avctx , AV_LOG_DEBUG , "Missing display_end_segment, emulating\n" );
1543
- dvbsub_display_end_segment (avctx , p , 0 , sub , got_sub_ptr );
1544
- }
1545
1537
1538
+ // Even though not mandated by the spec, we're imposing a minimum requirement
1539
+ // for a useful packet to have at least one page, region and object segment.
1540
+ if (got_page && got_region && got_object && got_end_display ) {
1541
+
1542
+ if (!got_displaydef && !avctx -> width && !avctx -> height ) {
1543
+ // Default from ETSI EN 300 743 V1.3.1 (7.2.1)
1544
+ avctx -> width = 720 ;
1545
+ avctx -> height = 576 ;
1546
+ }
1547
+
1548
+ // Some streams do not send an end-of-display segment but if we have all the other
1549
+ // segments then we need no further data.
1550
+ if (!got_end_display ) {
1551
+ av_log (avctx , AV_LOG_DEBUG , "Missing display_end_segment, emulating\n" );
1552
+ dvbsub_display_end_segment (avctx , p , 0 , sub , got_sub_ptr );
1553
+ }
1554
+ }
1546
1555
end :
1547
1556
if (ret < 0 ) {
1548
1557
return ret ;
0 commit comments