Browse code

Fix dvb subtitle decoding when display segment is missing.

Paul Kendall authored on 2012/01/29 22:50:19
Showing 1 changed files
... ...
@@ -1452,6 +1452,7 @@ static int dvbsub_decode(AVCodecContext *avctx,
1452 1452
     int page_id;
1453 1453
     int segment_length;
1454 1454
     int i;
1455
+    int got_segment = 0;
1455 1456
 
1456 1457
     av_dlog(avctx, "DVB sub packet:\n");
1457 1458
 
... ...
@@ -1490,21 +1491,26 @@ static int dvbsub_decode(AVCodecContext *avctx,
1490 1490
             switch (segment_type) {
1491 1491
             case DVBSUB_PAGE_SEGMENT:
1492 1492
                 dvbsub_parse_page_segment(avctx, p, segment_length);
1493
+                got_segment |= 1;
1493 1494
                 break;
1494 1495
             case DVBSUB_REGION_SEGMENT:
1495 1496
                 dvbsub_parse_region_segment(avctx, p, segment_length);
1497
+                got_segment |= 2;
1496 1498
                 break;
1497 1499
             case DVBSUB_CLUT_SEGMENT:
1498 1500
                 dvbsub_parse_clut_segment(avctx, p, segment_length);
1501
+                got_segment |= 4;
1499 1502
                 break;
1500 1503
             case DVBSUB_OBJECT_SEGMENT:
1501 1504
                 dvbsub_parse_object_segment(avctx, p, segment_length);
1505
+                got_segment |= 8;
1502 1506
                 break;
1503 1507
             case DVBSUB_DISPLAYDEFINITION_SEGMENT:
1504 1508
                 dvbsub_parse_display_definition_segment(avctx, p, segment_length);
1505 1509
                 break;
1506 1510
             case DVBSUB_DISPLAY_SEGMENT:
1507 1511
                 *data_size = dvbsub_display_end_segment(avctx, p, segment_length, sub);
1512
+                got_segment |= 16;
1508 1513
                 break;
1509 1514
             default:
1510 1515
                 av_dlog(avctx, "Subtitling segment type 0x%x, page id %d, length %d\n",
... ...
@@ -1515,6 +1521,10 @@ static int dvbsub_decode(AVCodecContext *avctx,
1515 1515
 
1516 1516
         p += segment_length;
1517 1517
     }
1518
+    // Some streams do not send a display segment but if we have all the other
1519
+    // segments then we need no further data.
1520
+    if (got_segment == 15 && sub)
1521
+        *data_size = dvbsub_display_end_segment(avctx, p, 0, sub);
1518 1522
 
1519 1523
     return p - buf;
1520 1524
 }