[FFmpeg-trac] #2909(avcodec:new): Make dvbsubs more compliant among stb's

FFmpeg trac at avcodec.org
Tue Aug 27 21:40:31 CEST 2013

#2909: Make dvbsubs more compliant among stb's
             Reporter:  tommy2d      |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  avcodec      |                  Version:  1.2.2
             Keywords:  dvbsubs,     |               Blocked By:
  stb, broadcast                     |  Reproduced by developer:  0
             Blocking:               |
Analyzed by developer:  0            |
 For a project I'm using avcodec to encode various dvbsubtitles and mux
 them in an mpeg transport stream using a self-made multiplexer.

 The dvdsubtitles that are produced by avcodec are not working on some
 stubborn set-top-boxes (STBs). About 80% of the boxes i used to test are
 working. 20% is not.

 I was able to create my own encoder, but with some minor changes in the
 dvbsubenc.c code, i was able to use ffmpeg to produce subtitles that work
 on 100% of the STBs we used to test. These changes are:

 1. Make sure all reserved bits, especially in the region composition
 segment, are set to 0 rather than 1:

 -        *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
 +        *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x00;

 -        *q++ = 0xf0 | ((y >> 8) & 0xf);
 +        *q++ = 0x00 | ((y >> 8) & 0xf);

 2. Make sure all dvb-subtitles are ordered as described in the spec:

 0x10 page composition segment
 0x11 region composition segment
 0x12 CLUT
 0x13 Object data segment
 0x14 DDS
 0x80 end of display

 Failing to do so will cause some STBs to fail selecting the proper colours
 from the CLUT.

 3. Define / calculate fixed regions that can be used again and again.
 Defining and/or using new regions for each subtitle, like avcodec does by
 default, causes some serious graphical distortion,  most notably in high-
 end professional tandberg decoders.

 4. Implement subtitle clear packets that only contain a page composition
 segment (no end of display segment) and use page_state = 0x01;.

 5. Make sure actual subtitle payload packets use page_state = 0x02.

 6. add display defintion segments for low res subs that are muxed with HD

         *p++ = 0x0F; //sync_byte
         *p++ = 0x14; //segment_type
         *p++ = 0x00; //page_id 1
         *p++ = 0x01; //page_id 2
         *p++ = 0x00; //segment_length 1
         *p++ = 0x05; //segment_length 2

         *p++ = 0x00;//dds_version_number + display_window_flag + reserved
         *p++ = (ddsWidth >> 8) & 0xFF;
         *p++ = ddsWidth & 0xFF;
         *p++ = (ddsHeight >> 8) & 0xFF;
         *p++ = ddsHeight & 0xFF;

 That's about it. I know this feature is not used a lot, especially since
 the mpeg-ts muxer provided by ffmpeg is not really suitable for
 broadcasting purposes, but these minor changes really contribute to the
 compatibility of the dvbsubs that avcodec encodes.

 F.y.i: this information is based on reverse-engineering highly-compatbile
 broadcast TS files that contain dvbsubtitles. If necessary i can deliver
 some raw dvbsub payloads that are tested on multiple STBs and that can
 used in further research and/or development.

Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2909>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list