dvbsub.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:81k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * dvbsub.c : DVB subtitles decoder
  3.  *            DVB subtitles encoder (developed for Anevia, www.anevia.com)
  4.  *****************************************************************************
  5.  * Copyright (C) 2003 ANEVIA
  6.  * Copyright (C) 2003-2005 the VideoLAN team
  7.  * $Id: b102cd069c810500b6cc883c54448476fc9aeb69 $
  8.  *
  9.  * Authors: Gildas Bazin <gbazin@videolan.org>
  10.  *          Damien LUCAS <damien.lucas@anevia.com>
  11.  *          Laurent Aimar <fenrir@via.ecp.fr>
  12.  *          Jean-Paul Saman <jpsaman #_at_# m2x dot nl>
  13.  *          Derk-Jan Hartman <hartman #at# videolan dot org>
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  *
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  28.  *****************************************************************************/
  29. /*****************************************************************************
  30.  * Preamble
  31.  *
  32.  * FIXME:
  33.  * DVB subtitles coded as strings of characters are not handled correctly.
  34.  * The character codes in the string should actually be indexes referring to a
  35.  * character table identified in the subtitle descriptor.
  36.  *
  37.  * The spec is quite vague in this area, but what is meant is perhaps that it
  38.  * refers to the character index in the codepage belonging to the language specified
  39.  * in the subtitle descriptor. Potentially it's designed for widechar
  40.  * (but not for UTF-*) codepages.
  41.  *****************************************************************************/
  42. #ifdef HAVE_CONFIG_H
  43. # include "config.h"
  44. #endif
  45. #include <vlc_common.h>
  46. #include <vlc_plugin.h>
  47. #include <vlc_vout.h>
  48. #include <vlc_codec.h>
  49. #include <vlc_sout.h>
  50. #include "vlc_bits.h"
  51. /* #define DEBUG_DVBSUB 1 */
  52. #define POSX_TEXT N_("Decoding X coordinate")
  53. #define POSX_LONGTEXT N_("X coordinate of the rendered subtitle")
  54. #define POSY_TEXT N_("Decoding Y coordinate")
  55. #define POSY_LONGTEXT N_("Y coordinate of the rendered subtitle")
  56. #define POS_TEXT N_("Subpicture position")
  57. #define POS_LONGTEXT N_( 
  58.   "You can enforce the subpicture position on the video " 
  59.   "(0=center, 1=left, 2=right, 4=top, 8=bottom, you can " 
  60.   "also use combinations of these values, e.g. 6=top-right).")
  61. #define ENC_POSX_TEXT N_("Encoding X coordinate")
  62. #define ENC_POSX_LONGTEXT N_("X coordinate of the encoded subtitle" )
  63. #define ENC_POSY_TEXT N_("Encoding Y coordinate")
  64. #define ENC_POSY_LONGTEXT N_("Y coordinate of the encoded subtitle" )
  65. static const int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 };
  66. static const char *const ppsz_pos_descriptions[] =
  67. { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"),
  68.   N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") };
  69. /*****************************************************************************
  70.  * Module descriptor.
  71.  *****************************************************************************/
  72. static int  Open ( vlc_object_t * );
  73. static void Close( vlc_object_t * );
  74. static subpicture_t *Decode( decoder_t *, block_t ** );
  75. static int OpenEncoder  ( vlc_object_t * );
  76. static void CloseEncoder( vlc_object_t * );
  77. static block_t *Encode  ( encoder_t *, subpicture_t * );
  78. vlc_module_begin ()
  79. #   define DVBSUB_CFG_PREFIX "dvbsub-"
  80.     set_description( N_("DVB subtitles decoder") )
  81.     set_shortname( N_("DVB subtitles") )
  82.     set_capability( "decoder", 50 )
  83.     set_category( CAT_INPUT )
  84.     set_subcategory( SUBCAT_INPUT_SCODEC )
  85.     set_callbacks( Open, Close )
  86.     add_integer( DVBSUB_CFG_PREFIX "position", 8, NULL, POS_TEXT, POS_LONGTEXT, true )
  87.         change_integer_list( pi_pos_values, ppsz_pos_descriptions, NULL )
  88.     add_integer( DVBSUB_CFG_PREFIX "x", -1, NULL, POSX_TEXT, POSX_LONGTEXT, false )
  89.     add_integer( DVBSUB_CFG_PREFIX "y", -1, NULL, POSY_TEXT, POSY_LONGTEXT, false )
  90. #   define ENC_CFG_PREFIX "sout-dvbsub-"
  91.     add_submodule ()
  92.     set_description( N_("DVB subtitles encoder") )
  93.     set_capability( "encoder", 100 )
  94.     set_callbacks( OpenEncoder, CloseEncoder )
  95.     add_integer( ENC_CFG_PREFIX "x", -1, NULL, ENC_POSX_TEXT, ENC_POSX_LONGTEXT, false )
  96.     add_integer( ENC_CFG_PREFIX "y", -1, NULL, ENC_POSY_TEXT, ENC_POSY_LONGTEXT, false )
  97.     add_obsolete_integer( ENC_CFG_PREFIX "timeout" ) /* Suppressed since 0.8.5 */
  98. vlc_module_end ()
  99. static const char *const ppsz_enc_options[] = { "x", "y", NULL };
  100. /****************************************************************************
  101.  * Local structures
  102.  ****************************************************************************
  103.  * Those structures refer closely to the ETSI 300 743 Object model
  104.  ****************************************************************************/
  105. /* The object definition gives the position of the object in a region [7.2.5] */
  106. typedef struct dvbsub_objectdef_s
  107. {
  108.     int i_id;
  109.     int i_type;
  110.     int i_x;
  111.     int i_y;
  112.     int i_fg_pc;
  113.     int i_bg_pc;
  114.     char *psz_text; /* for string of characters objects */
  115. } dvbsub_objectdef_t;
  116. /* The entry in the palette CLUT */
  117. typedef struct
  118. {
  119.     uint8_t                 Y;
  120.     uint8_t                 Cr;
  121.     uint8_t                 Cb;
  122.     uint8_t                 T;
  123. } dvbsub_color_t;
  124. /* The displays dimensions [7.2.1] */
  125. typedef struct dvbsub_display_s
  126. {
  127.     uint8_t                 i_id;
  128.     uint8_t                 i_version;
  129.     int                     i_width;
  130.     int                     i_height;
  131.     bool              b_windowed;
  132.     int                     i_x;
  133.     int                     i_y;
  134.     int                     i_max_x;
  135.     int                     i_max_y;
  136. } dvbsub_display_t;
  137. /* [7.2.4] */
  138. typedef struct dvbsub_clut_s
  139. {
  140.     uint8_t                 i_id;
  141.     uint8_t                 i_version;
  142.     dvbsub_color_t          c_2b[4];
  143.     dvbsub_color_t          c_4b[16];
  144.     dvbsub_color_t          c_8b[256];
  145.     struct dvbsub_clut_s    *p_next;
  146. } dvbsub_clut_t;
  147. /* The Region is an aera on the image [7.2.3]
  148.  * with a list of the object definitions associated and a CLUT */
  149. typedef struct dvbsub_region_s
  150. {
  151.     int i_id;
  152.     int i_version;
  153.     int i_x;
  154.     int i_y;
  155.     int i_width;
  156.     int i_height;
  157.     int i_level_comp;
  158.     int i_depth;
  159.     int i_clut;
  160.     uint8_t *p_pixbuf;
  161.     int                    i_object_defs;
  162.     dvbsub_objectdef_t     *p_object_defs;
  163.     struct dvbsub_region_s *p_next;
  164. } dvbsub_region_t;
  165. /* The object definition gives the position of the object in a region */
  166. typedef struct dvbsub_regiondef_s
  167. {
  168.     int i_id;
  169.     int i_x;
  170.     int i_y;
  171. } dvbsub_regiondef_t;
  172. /* The page defines the list of regions [7.2.2] */
  173. typedef struct
  174. {
  175.     int i_id;
  176.     int i_timeout; /* in seconds */
  177.     int i_state;
  178.     int i_version;
  179.     int                i_region_defs;
  180.     dvbsub_regiondef_t *p_region_defs;
  181. } dvbsub_page_t;
  182. struct decoder_sys_t
  183. {
  184.     bs_t            bs;
  185.     /* Decoder internal data */
  186.     int             i_id;
  187.     int             i_ancillary_id;
  188.     mtime_t         i_pts;
  189.     bool      b_absolute;
  190.     int             i_spu_position;
  191.     int             i_spu_x;
  192.     int             i_spu_y;
  193.     bool      b_page;
  194.     dvbsub_page_t   *p_page;
  195.     dvbsub_region_t *p_regions;
  196.     dvbsub_clut_t   *p_cluts;
  197.     dvbsub_display_t *p_display;
  198.     dvbsub_clut_t    default_clut;
  199. };
  200. /* List of different SEGMENT TYPES */
  201. /* According to EN 300-743, table 2 */
  202. #define DVBSUB_ST_PAGE_COMPOSITION      0x10
  203. #define DVBSUB_ST_REGION_COMPOSITION    0x11
  204. #define DVBSUB_ST_CLUT_DEFINITION       0x12
  205. #define DVBSUB_ST_OBJECT_DATA           0x13
  206. #define DVBSUB_ST_DISPLAY_DEFINITION    0x14
  207. #define DVBSUB_ST_ENDOFDISPLAY          0x80
  208. #define DVBSUB_ST_STUFFING              0xff
  209. /* List of different OBJECT TYPES */
  210. /* According to EN 300-743, table 6 */
  211. #define DVBSUB_OT_BASIC_BITMAP          0x00
  212. #define DVBSUB_OT_BASIC_CHAR            0x01
  213. #define DVBSUB_OT_COMPOSITE_STRING      0x02
  214. /* Pixel DATA TYPES */
  215. /* According to EN 300-743, table 9 */
  216. #define DVBSUB_DT_2BP_CODE_STRING       0x10
  217. #define DVBSUB_DT_4BP_CODE_STRING       0x11
  218. #define DVBSUB_DT_8BP_CODE_STRING       0x12
  219. #define DVBSUB_DT_24_TABLE_DATA         0x20
  220. #define DVBSUB_DT_28_TABLE_DATA         0x21
  221. #define DVBSUB_DT_48_TABLE_DATA         0x22
  222. #define DVBSUB_DT_END_LINE              0xf0
  223. /* List of different Page Composition Segment state */
  224. /* According to EN 300-743, 7.2.1 table 3 */
  225. #define DVBSUB_PCS_STATE_ACQUISITION    0x01
  226. #define DVBSUB_PCS_STATE_CHANGE         0x02
  227. /*****************************************************************************
  228.  * Local prototypes
  229.  *****************************************************************************/
  230. static void decode_segment( decoder_t *, bs_t * );
  231. static void decode_page_composition( decoder_t *, bs_t * );
  232. static void decode_region_composition( decoder_t *, bs_t * );
  233. static void decode_object( decoder_t *, bs_t * );
  234. static void decode_display_definition( decoder_t *, bs_t * );
  235. static void decode_clut( decoder_t *, bs_t * );
  236. static void free_all( decoder_t * );
  237. static void default_clut_init( decoder_t * );
  238. static subpicture_t *render( decoder_t * );
  239. /*****************************************************************************
  240.  * Open: probe the decoder and return score
  241.  *****************************************************************************
  242.  * Tries to launch a decoder and return score so that the interface is able
  243.  * to chose.
  244.  *****************************************************************************/
  245. static int Open( vlc_object_t *p_this )
  246. {
  247.     decoder_t     *p_dec = (decoder_t *) p_this;
  248.     decoder_sys_t *p_sys;
  249.     vlc_value_t    val;
  250.     int i_posx, i_posy;
  251.     if( p_dec->fmt_in.i_codec != VLC_FOURCC('d','v','b','s') )
  252.     {
  253.         return VLC_EGENERIC;
  254.     }
  255.     p_dec->pf_decode_sub = Decode;
  256.     p_sys = p_dec->p_sys = malloc( sizeof(decoder_sys_t) );
  257.     if( !p_sys )
  258.         return VLC_ENOMEM;
  259.     memset( p_sys, 0, sizeof(decoder_sys_t) );
  260.     p_sys->i_pts          = (mtime_t) 0;
  261.     p_sys->i_id           = p_dec->fmt_in.subs.dvb.i_id & 0xFFFF;
  262.     p_sys->i_ancillary_id = p_dec->fmt_in.subs.dvb.i_id >> 16;
  263.     p_sys->p_regions      = NULL;
  264.     p_sys->p_cluts        = NULL;
  265.     p_sys->p_page         = NULL;
  266.     p_sys->p_display      = NULL;
  267.     var_Create( p_this, DVBSUB_CFG_PREFIX "position",
  268.                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  269.     var_Get( p_this, DVBSUB_CFG_PREFIX "position", &val );
  270.     p_sys->i_spu_position = val.i_int;
  271.     var_Create( p_this, DVBSUB_CFG_PREFIX "x",
  272.                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  273.     var_Get( p_this, DVBSUB_CFG_PREFIX "x", &val );
  274.     i_posx = val.i_int;
  275.     var_Create( p_this, DVBSUB_CFG_PREFIX "y",
  276.                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  277.     var_Get( p_this, DVBSUB_CFG_PREFIX "y", &val );
  278.     i_posy = val.i_int;
  279.     /* Check if subpicture position was overridden */
  280.     p_sys->b_absolute = true;
  281.     p_sys->i_spu_x = p_sys->i_spu_y = 0;
  282.     if( ( i_posx >= 0 ) && ( i_posy >= 0 ) )
  283.     {
  284.         p_sys->b_absolute = true;
  285.         p_sys->i_spu_x = i_posx;
  286.         p_sys->i_spu_y = i_posy;
  287.     }
  288.     p_dec->fmt_out.i_cat = SPU_ES;
  289.     p_dec->fmt_out.i_codec = 0;
  290.     default_clut_init( p_dec );
  291.     return VLC_SUCCESS;
  292. }
  293. /*****************************************************************************
  294.  * Close:
  295.  *****************************************************************************/
  296. static void Close( vlc_object_t *p_this )
  297. {
  298.     decoder_t     *p_dec = (decoder_t*) p_this;
  299.     decoder_sys_t *p_sys = p_dec->p_sys;
  300.     var_Destroy( p_this, DVBSUB_CFG_PREFIX "x" );
  301.     var_Destroy( p_this, DVBSUB_CFG_PREFIX "y" );
  302.     var_Destroy( p_this, DVBSUB_CFG_PREFIX "position" );
  303.     free_all( p_dec );
  304.     free( p_sys );
  305. }
  306. /*****************************************************************************
  307.  * Decode:
  308.  *****************************************************************************/
  309. static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
  310. {
  311.     decoder_sys_t *p_sys = p_dec->p_sys;
  312.     block_t       *p_block;
  313.     subpicture_t  *p_spu = NULL;
  314.     if( ( pp_block == NULL ) || ( *pp_block == NULL ) ) return NULL;
  315.     p_block = *pp_block;
  316.     *pp_block = NULL;
  317.     p_sys->i_pts = p_block->i_pts;
  318.     if( p_sys->i_pts <= 0 )
  319.     {
  320. #ifdef DEBUG_DVBSUB
  321.         /* Some DVB channels send stuffing segments in non-dated packets so
  322.          * don't complain too loudly. */
  323.         msg_Warn( p_dec, "non dated subtitle" );
  324. #endif
  325.         block_Release( p_block );
  326.         return NULL;
  327.     }
  328.     bs_init( &p_sys->bs, p_block->p_buffer, p_block->i_buffer );
  329.     if( bs_read( &p_sys->bs, 8 ) != 0x20 ) /* Data identifier */
  330.     {
  331.         msg_Dbg( p_dec, "invalid data identifier" );
  332.         block_Release( p_block );
  333.         return NULL;
  334.     }
  335.     if( bs_read( &p_sys->bs, 8 ) ) /* Subtitle stream id */
  336.     {
  337.         msg_Dbg( p_dec, "invalid subtitle stream id" );
  338.         block_Release( p_block );
  339.         return NULL;
  340.     }
  341. #ifdef DEBUG_DVBSUB
  342.     msg_Dbg( p_dec, "subtitle packet received: %"PRId64, p_sys->i_pts );
  343. #endif
  344.     p_sys->b_page = false;
  345.     while( bs_show( &p_sys->bs, 8 ) == 0x0f ) /* Sync byte */
  346.     {
  347.         decode_segment( p_dec, &p_sys->bs );
  348.     }
  349.     if( bs_read( &p_sys->bs, 8 ) != 0xff ) /* End marker */
  350.     {
  351.         msg_Warn( p_dec, "end marker not found (corrupted subtitle ?)" );
  352.         block_Release( p_block );
  353.         return NULL;
  354.     }
  355.     /* Check if the page is to be displayed */
  356.     if( p_sys->p_page && p_sys->b_page )
  357.         p_spu = render( p_dec );
  358.     block_Release( p_block );
  359.     return p_spu;
  360. }
  361. /* following functions are local */
  362. /*****************************************************************************
  363.  * default_clut_init: default clut as defined in EN 300-743 section 10
  364.  *****************************************************************************/
  365. static void default_clut_init( decoder_t *p_dec )
  366. {
  367.     decoder_sys_t *p_sys = p_dec->p_sys;
  368.     uint8_t i;
  369. #define RGB_TO_Y(r, g, b) ((int16_t) 77 * r + 150 * g + 29 * b) / 256;
  370. #define RGB_TO_U(r, g, b) ((int16_t) -44 * r - 87 * g + 131 * b) / 256;
  371. #define RGB_TO_V(r, g, b) ((int16_t) 131 * r - 110 * g - 21 * b) / 256;
  372.     /* 4 entries CLUT */
  373.     for( i = 0; i < 4; i++ )
  374.     {
  375.         uint8_t R = 0, G = 0, B = 0, T = 0;
  376.         if( !(i & 0x2) && !(i & 0x1) ) T = 0xFF;
  377.         else if( !(i & 0x2) && (i & 0x1) ) R = G = B = 0xFF;
  378.         else if( (i & 0x2) && !(i & 0x1) ) R = G = B = 0;
  379.         else R = G = B = 0x7F;
  380.         p_sys->default_clut.c_2b[i].Y = RGB_TO_Y(R,G,B);
  381.         p_sys->default_clut.c_2b[i].Cb = RGB_TO_V(R,G,B);
  382.         p_sys->default_clut.c_2b[i].Cr = RGB_TO_U(R,G,B);
  383.         p_sys->default_clut.c_2b[i].T = T;
  384.     }
  385.     /* 16 entries CLUT */
  386.     for( i = 0; i < 16; i++ )
  387.     {
  388.         uint8_t R = 0, G = 0, B = 0, T = 0;
  389.         if( !(i & 0x8) )
  390.         {
  391.             if( !(i & 0x4) && !(i & 0x2) && !(i & 0x1) )
  392.             {
  393.                 T = 0xFF;
  394.             }
  395.             else
  396.             {
  397.                 R = (i & 0x1) ? 0xFF : 0;
  398.                 G = (i & 0x2) ? 0xFF : 0;
  399.                 B = (i & 0x4) ? 0xFF : 0;
  400.             }
  401.         }
  402.         else
  403.         {
  404.             R = (i & 0x1) ? 0x7F : 0;
  405.             G = (i & 0x2) ? 0x7F : 0;
  406.             B = (i & 0x4) ? 0x7F : 0;
  407.         }
  408.         p_sys->default_clut.c_4b[i].Y = RGB_TO_Y(R,G,B);
  409.         p_sys->default_clut.c_4b[i].Cr = RGB_TO_V(R,G,B);
  410.         p_sys->default_clut.c_4b[i].Cb = RGB_TO_U(R,G,B);
  411.         p_sys->default_clut.c_4b[i].T = T;
  412.     }
  413.     /* 256 entries CLUT */
  414.     memset( p_sys->default_clut.c_8b, 0xFF, 256 * sizeof(dvbsub_color_t) );
  415. }
  416. static void decode_segment( decoder_t *p_dec, bs_t *s )
  417. {
  418.     decoder_sys_t *p_sys = p_dec->p_sys;
  419.     int i_type;
  420.     int i_page_id;
  421.     int i_size;
  422.     /* sync_byte (already checked) */
  423.     bs_skip( s, 8 );
  424.     /* segment type */
  425.     i_type = bs_read( s, 8 );
  426.     /* page id */
  427.     i_page_id = bs_read( s, 16 );
  428.     /* segment size */
  429.     i_size = bs_show( s, 16 );
  430.     if( ( i_page_id != p_sys->i_id ) &&
  431.         ( i_page_id != p_sys->i_ancillary_id ) )
  432.     {
  433. #ifdef DEBUG_DVBSUB
  434.         msg_Dbg( p_dec, "subtitle skipped (page id: %i, %i)",
  435.                  i_page_id, p_sys->i_id );
  436. #endif
  437.         bs_skip( s,  8 * ( 2 + i_size ) );
  438.         return;
  439.     }
  440.     if( ( p_sys->i_ancillary_id != p_sys->i_id ) &&
  441.         ( i_type == DVBSUB_ST_PAGE_COMPOSITION ) &&
  442.         ( i_page_id == p_sys->i_ancillary_id ) )
  443.     {
  444. #ifdef DEBUG_DVBSUB
  445.         msg_Dbg( p_dec, "skipped invalid ancillary subtitle packet" );
  446. #endif
  447.         bs_skip( s,  8 * ( 2 + i_size ) );
  448.         return;
  449.     }
  450. #ifdef DEBUG_DVBSUB
  451.     if( i_page_id == p_sys->i_id )
  452.         msg_Dbg( p_dec, "segment (id: %i)", i_page_id );
  453.     else
  454.         msg_Dbg( p_dec, "ancillary segment (id: %i)", i_page_id );
  455. #endif
  456.     switch( i_type )
  457.     {
  458.     case DVBSUB_ST_PAGE_COMPOSITION:
  459. #ifdef DEBUG_DVBSUB
  460.         msg_Dbg( p_dec, "decode_page_composition" );
  461. #endif
  462.         decode_page_composition( p_dec, s );
  463.         break;
  464.     case DVBSUB_ST_REGION_COMPOSITION:
  465. #ifdef DEBUG_DVBSUB
  466.         msg_Dbg( p_dec, "decode_region_composition" );
  467. #endif
  468.         decode_region_composition( p_dec, s );
  469.         break;
  470.     case DVBSUB_ST_CLUT_DEFINITION:
  471. #ifdef DEBUG_DVBSUB
  472.         msg_Dbg( p_dec, "decode_clut" );
  473. #endif
  474.         decode_clut( p_dec, s );
  475.         break;
  476.     case DVBSUB_ST_OBJECT_DATA:
  477. #ifdef DEBUG_DVBSUB
  478.         msg_Dbg( p_dec, "decode_object" );
  479. #endif
  480.         decode_object( p_dec, s );
  481.         break;
  482.     case DVBSUB_ST_DISPLAY_DEFINITION:
  483. #ifdef DEBUG_DVBSUB
  484.         msg_Dbg( p_dec, "decode_display_definition" );
  485. #endif
  486.         decode_display_definition( p_dec, s );
  487.         break;
  488.     case DVBSUB_ST_ENDOFDISPLAY:
  489. #ifdef DEBUG_DVBSUB
  490.         msg_Dbg( p_dec, "end of display" );
  491. #endif
  492.         bs_skip( s,  8 * ( 2 + i_size ) );
  493.         break;
  494.     case DVBSUB_ST_STUFFING:
  495. #ifdef DEBUG_DVBSUB
  496.         msg_Dbg( p_dec, "skip stuffing" );
  497. #endif
  498.         bs_skip( s,  8 * ( 2 + i_size ) );
  499.         break;
  500.     default:
  501.         msg_Warn( p_dec, "unsupported segment type: (%04x)", i_type );
  502.         bs_skip( s,  8 * ( 2 + i_size ) );
  503.         break;
  504.     }
  505. }
  506. static void decode_clut( decoder_t *p_dec, bs_t *s )
  507. {
  508.     decoder_sys_t *p_sys = p_dec->p_sys;
  509.     uint16_t      i_segment_length;
  510.     uint16_t      i_processed_length;
  511.     dvbsub_clut_t *p_clut, *p_next;
  512.     int           i_id, i_version;
  513.     i_segment_length = bs_read( s, 16 );
  514.     i_id             = bs_read( s, 8 );
  515.     i_version        = bs_read( s, 4 );
  516.     /* Check if we already have this clut */
  517.     for( p_clut = p_sys->p_cluts; p_clut != NULL; p_clut = p_clut->p_next )
  518.     {
  519.         if( p_clut->i_id == i_id ) break;
  520.     }
  521.     /* Check version number */
  522.     if( p_clut && ( p_clut->i_version == i_version ) )
  523.     {
  524.         /* Nothing to do */
  525.         bs_skip( s, 8 * i_segment_length - 12 );
  526.         return;
  527.     }
  528.     if( !p_clut )
  529.     {
  530. #ifdef DEBUG_DVBSUB
  531.         msg_Dbg( p_dec, "new clut: %i", i_id );
  532. #endif
  533.         p_clut = malloc( sizeof( dvbsub_clut_t ) );
  534.         if( !p_clut )
  535.             return;
  536.         p_clut->p_next = p_sys->p_cluts;
  537.         p_sys->p_cluts = p_clut;
  538.     }
  539.     /* Initialize to default clut */
  540.     p_next = p_clut->p_next;
  541.     *p_clut = p_sys->default_clut;
  542.     p_clut->p_next = p_next;
  543.     /* We don't have this version of the CLUT: Parse it */
  544.     p_clut->i_version = i_version;
  545.     p_clut->i_id = i_id;
  546.     bs_skip( s, 4 ); /* Reserved bits */
  547.     i_processed_length = 2;
  548.     while( i_processed_length < i_segment_length )
  549.     {
  550.         uint8_t y, cb, cr, t;
  551.         uint8_t i_id;
  552.         uint8_t i_type;
  553.         i_id = bs_read( s, 8 );
  554.         i_type = bs_read( s, 3 );
  555.         bs_skip( s, 4 );
  556.         if( bs_read( s, 1 ) )
  557.         {
  558.             y  = bs_read( s, 8 );
  559.             cr = bs_read( s, 8 );
  560.             cb = bs_read( s, 8 );
  561.             t  = bs_read( s, 8 );
  562.             i_processed_length += 6;
  563.         }
  564.         else
  565.         {
  566.             y  = bs_read( s, 6 ) << 2;
  567.             cr = bs_read( s, 4 ) << 4;
  568.             cb = bs_read( s, 4 ) << 4;
  569.             t  = bs_read( s, 2 ) << 6;
  570.             i_processed_length += 4;
  571.         }
  572.         /* We are not entirely compliant here as full transparency is indicated
  573.          * with a luma value of zero, not a transparency value of 0xff
  574.          * (full transparency would actually be 0xff + 1). */
  575.         if( y == 0 )
  576.         {
  577.             cr = cb = 0;
  578.             t  = 0xff;
  579.         }
  580.         /* According to EN 300-743 section 7.2.3 note 1, type should
  581.          * not have more than 1 bit set to one, but some streams don't
  582.          * respect this note. */
  583.         if( ( i_type & 0x04 ) && ( i_id < 4 ) )
  584.         {
  585.             p_clut->c_2b[i_id].Y = y;
  586.             p_clut->c_2b[i_id].Cr = cr;
  587.             p_clut->c_2b[i_id].Cb = cb;
  588.             p_clut->c_2b[i_id].T = t;
  589.         }
  590.         if( ( i_type & 0x02 ) && ( i_id < 16 ) )
  591.         {
  592.             p_clut->c_4b[i_id].Y = y;
  593.             p_clut->c_4b[i_id].Cr = cr;
  594.             p_clut->c_4b[i_id].Cb = cb;
  595.             p_clut->c_4b[i_id].T = t;
  596.         }
  597.         if( i_type & 0x01 )
  598.         {
  599.             p_clut->c_8b[i_id].Y = y;
  600.             p_clut->c_8b[i_id].Cr = cr;
  601.             p_clut->c_8b[i_id].Cb = cb;
  602.             p_clut->c_8b[i_id].T = t;
  603.         }
  604.     }
  605. }
  606. static void decode_page_composition( decoder_t *p_dec, bs_t *s )
  607. {
  608.     decoder_sys_t *p_sys = p_dec->p_sys;
  609.     int i_version, i_state, i_segment_length, i_timeout, i;
  610.     /* A page is composed by 0 or more region */
  611.     i_segment_length = bs_read( s, 16 );
  612.     i_timeout = bs_read( s, 8 );
  613.     i_version = bs_read( s, 4 );
  614.     i_state = bs_read( s, 2 );
  615.     bs_skip( s, 2 ); /* Reserved */
  616.     if( i_state == DVBSUB_PCS_STATE_CHANGE )
  617.     {
  618.         /* End of an epoch, reset decoder buffer */
  619. #ifdef DEBUG_DVBSUB
  620.         msg_Dbg( p_dec, "page composition mode change" );
  621. #endif
  622.         free_all( p_dec );
  623.     }
  624.     else if( !p_sys->p_page && ( i_state != DVBSUB_PCS_STATE_ACQUISITION ) &&
  625.              ( i_state != DVBSUB_PCS_STATE_CHANGE ) )
  626.     {
  627.         /* Not a full PCS, we need to wait for one */
  628.         msg_Dbg( p_dec, "didn't receive an acquisition page yet" );
  629. #if 0
  630.         /* Try to start decoding even without an acquisition page */
  631.         bs_skip( s,  8 * (i_segment_length - 2) );
  632.         return;
  633. #endif
  634.     }
  635. #ifdef DEBUG_DVBSUB
  636.     if( i_state == DVBSUB_PCS_STATE_ACQUISITION )
  637.         msg_Dbg( p_dec, "acquisition page composition" );
  638. #endif
  639.     /* Check version number */
  640.     if( p_sys->p_page && ( p_sys->p_page->i_version == i_version ) )
  641.     {
  642.         bs_skip( s,  8 * (i_segment_length - 2) );
  643.         return;
  644.     }
  645.     else if( p_sys->p_page )
  646.     {
  647.         if( p_sys->p_page->i_region_defs )
  648.             free( p_sys->p_page->p_region_defs );
  649.         p_sys->p_page->p_region_defs = NULL;
  650.         p_sys->p_page->i_region_defs = 0;
  651.     }
  652.     if( !p_sys->p_page )
  653.     {
  654. #ifdef DEBUG_DVBSUB
  655.         msg_Dbg( p_dec, "new page" );
  656. #endif
  657.         /* Allocate a new page */
  658.         p_sys->p_page = malloc( sizeof(dvbsub_page_t) );
  659.         if( !p_sys->p_page )
  660.             return;
  661.     }
  662.     p_sys->p_page->i_version = i_version;
  663.     p_sys->p_page->i_timeout = i_timeout;
  664.     p_sys->b_page = true;
  665.     /* Number of regions */
  666.     p_sys->p_page->i_region_defs = (i_segment_length - 2) / 6;
  667.     if( p_sys->p_page->i_region_defs == 0 ) return;
  668.     p_sys->p_page->p_region_defs =
  669.         malloc( p_sys->p_page->i_region_defs * sizeof(dvbsub_region_t) );
  670.     if( p_sys->p_page->p_region_defs )
  671.     {
  672.         for( i = 0; i < p_sys->p_page->i_region_defs; i++ )
  673.         {
  674.             p_sys->p_page->p_region_defs[i].i_id = bs_read( s, 8 );
  675.             bs_skip( s, 8 ); /* Reserved */
  676.             p_sys->p_page->p_region_defs[i].i_x = bs_read( s, 16 );
  677.             p_sys->p_page->p_region_defs[i].i_y = bs_read( s, 16 );
  678. #ifdef DEBUG_DVBSUB
  679.             msg_Dbg( p_dec, "page_composition, region %i (%i,%i)",
  680.                     i, p_sys->p_page->p_region_defs[i].i_x,
  681.                     p_sys->p_page->p_region_defs[i].i_y );
  682. #endif
  683.         }
  684.     }
  685. }
  686. static void decode_region_composition( decoder_t *p_dec, bs_t *s )
  687. {
  688.     decoder_sys_t *p_sys = p_dec->p_sys;
  689.     dvbsub_region_t *p_region, **pp_region = &p_sys->p_regions;
  690.     int i_segment_length, i_processed_length, i_id, i_version;
  691.     int i_width, i_height, i_level_comp, i_depth, i_clut;
  692.     int i_8_bg, i_4_bg, i_2_bg;
  693.     bool b_fill;
  694.     i_segment_length = bs_read( s, 16 );
  695.     i_id = bs_read( s, 8 );
  696.     i_version = bs_read( s, 4 );
  697.     /* Check if we already have this region */
  698.     for( p_region = p_sys->p_regions; p_region != NULL;
  699.          p_region = p_region->p_next )
  700.     {
  701.         pp_region = &p_region->p_next;
  702.         if( p_region->i_id == i_id ) break;
  703.     }
  704.     /* Check version number */
  705.     if( p_region && ( p_region->i_version == i_version ) )
  706.     {
  707.         bs_skip( s, 8 * (i_segment_length - 1) - 4 );
  708.         return;
  709.     }
  710.     if( !p_region )
  711.     {
  712. #ifdef DEBUG_DVBSUB
  713.         msg_Dbg( p_dec, "new region: %i", i_id );
  714. #endif
  715.         p_region = *pp_region = malloc( sizeof(dvbsub_region_t) );
  716.         if( !p_region )
  717.             return;
  718.         memset( p_region, 0, sizeof(dvbsub_region_t) );
  719.         p_region->p_object_defs = NULL;
  720.         p_region->p_pixbuf = NULL;
  721.         p_region->p_next = NULL;
  722.     }
  723.     /* Region attributes */
  724.     p_region->i_id = i_id;
  725.     p_region->i_version = i_version;
  726.     b_fill = bs_read( s, 1 );
  727.     bs_skip( s, 3 ); /* Reserved */
  728.     i_width = bs_read( s, 16 );
  729.     i_height = bs_read( s, 16 );
  730. #ifdef DEBUG_DVBSUB
  731.     msg_Dbg( p_dec, " width=%d height=%d", i_width, i_height );
  732. #endif
  733.     i_level_comp = bs_read( s, 3 );
  734.     i_depth = bs_read( s, 3 );
  735.     bs_skip( s, 2 ); /* Reserved */
  736.     i_clut = bs_read( s, 8 );
  737.     i_8_bg = bs_read( s, 8 );
  738.     i_4_bg = bs_read( s, 4 );
  739.     i_2_bg = bs_read( s, 2 );
  740.     bs_skip( s, 2 ); /* Reserved */
  741.     /* Free old object defs */
  742.     while( p_region->i_object_defs )
  743.         free( p_region->p_object_defs[--p_region->i_object_defs].psz_text );
  744.     free( p_region->p_object_defs );
  745.     p_region->p_object_defs = NULL;
  746.     /* Extra sanity checks */
  747.     if( ( p_region->i_width != i_width ) ||
  748.         ( p_region->i_height != i_height ) )
  749.     {
  750.         if( p_region->p_pixbuf )
  751.         {
  752.             msg_Dbg( p_dec, "region size changed (%dx%d->%dx%d)",
  753.                      p_region->i_width, p_region->i_height, i_width, i_height );
  754.             free( p_region->p_pixbuf );
  755.         }
  756.         p_region->p_pixbuf = malloc( i_height * i_width );
  757.         p_region->i_depth = 0;
  758.         b_fill = true;
  759.     }
  760.     if( p_region->i_depth &&
  761.         ( ( p_region->i_depth != i_depth ) ||
  762.           ( p_region->i_level_comp != i_level_comp ) ||
  763.           ( p_region->i_clut != i_clut) ) )
  764.     {
  765.         msg_Dbg( p_dec, "region parameters changed (not allowed)" );
  766.     }
  767.     /* Erase background of region */
  768.     if( b_fill )
  769.     {
  770.         int i_background = ( p_region->i_depth == 1 ) ? i_2_bg :
  771.             ( ( p_region->i_depth == 2 ) ? i_4_bg : i_8_bg );
  772.         memset( p_region->p_pixbuf, i_background, i_width * i_height );
  773.     }
  774.     p_region->i_width = i_width;
  775.     p_region->i_height = i_height;
  776.     p_region->i_level_comp = i_level_comp;
  777.     p_region->i_depth = i_depth;
  778.     p_region->i_clut = i_clut;
  779.     /* List of objects in the region */
  780.     i_processed_length = 10;
  781.     while( i_processed_length < i_segment_length )
  782.     {
  783.         dvbsub_objectdef_t *p_obj;
  784.         /* We create a new object */
  785.         p_region->i_object_defs++;
  786.         p_region->p_object_defs =
  787.             realloc( p_region->p_object_defs,
  788.                      sizeof(dvbsub_objectdef_t) * p_region->i_object_defs );
  789.         /* We parse object properties */
  790.         p_obj = &p_region->p_object_defs[p_region->i_object_defs - 1];
  791.         p_obj->i_id         = bs_read( s, 16 );
  792.         p_obj->i_type       = bs_read( s, 2 );
  793.         bs_skip( s, 2 ); /* Provider */
  794.         p_obj->i_x          = bs_read( s, 12 );
  795.         bs_skip( s, 4 ); /* Reserved */
  796.         p_obj->i_y          = bs_read( s, 12 );
  797.         p_obj->psz_text     = NULL;
  798.         i_processed_length += 6;
  799.         if( ( p_obj->i_type == DVBSUB_OT_BASIC_CHAR ) ||
  800.             ( p_obj->i_type == DVBSUB_OT_COMPOSITE_STRING ) )
  801.         {
  802.             p_obj->i_fg_pc =  bs_read( s, 8 );
  803.             p_obj->i_bg_pc =  bs_read( s, 8 );
  804.             i_processed_length += 2;
  805.         }
  806.     }
  807. }
  808. /* ETSI 300 743 [7.2.1] */
  809. static void decode_display_definition( decoder_t *p_dec, bs_t *s )
  810. {
  811.     decoder_sys_t *p_sys = p_dec->p_sys;
  812.     uint16_t      i_segment_length;
  813.     uint16_t      i_processed_length = 40;
  814.     dvbsub_display_t *p_display;
  815.     dvbsub_display_t *p_old = p_sys->p_display;
  816.     int           i_version;
  817.     i_segment_length = bs_read( s, 16 );
  818.     i_version        = bs_read( s, 4 );
  819.     /* Check version number */
  820.     if( p_old && ( p_old->i_version == i_version ) )
  821.     {
  822.         /* The definition did not change */
  823.         bs_skip( s, 8*i_segment_length - 4 );
  824.         return;
  825.     }
  826. #ifdef DEBUG_DVBSUB
  827.     msg_Dbg( p_dec, "new display definition: %i", i_version );
  828. #endif
  829.     p_display = malloc( sizeof(dvbsub_display_t) );
  830.     if( p_display )
  831.     {
  832.         /* We don't have this version of the display definition: Parse it */
  833.         p_display->i_version = i_version;
  834.         p_display->b_windowed = bs_read( s, 1 );
  835.         bs_skip( s, 3 ); /* Reserved bits */
  836.         p_display->i_width = bs_read( s, 16 )+1;
  837.         p_display->i_height = bs_read( s, 16 )+1;
  838.         if( p_display->b_windowed )
  839.         {
  840. #ifdef DEBUG_DVBSUB
  841.             msg_Dbg( p_dec, "display definition with offsets (windowed)" );
  842. #endif
  843.             /* Coordinates are measured from the top left corner */
  844.             p_display->i_x     = bs_read( s, 16 );
  845.             p_display->i_max_x = bs_read( s, 16 );
  846.             p_display->i_y     = bs_read( s, 16 );
  847.             p_display->i_max_y = bs_read( s, 16 );
  848.             i_processed_length += 64;
  849.         }
  850.     }
  851.     p_sys->p_display = p_display;
  852.     free( p_old );
  853.     if( i_processed_length != i_segment_length*8 )
  854.     {
  855.         msg_Err( p_dec, "processed length %d != segment length %d",
  856.                  i_processed_length, i_segment_length );
  857.     }
  858. #ifdef DEBUG_DVBSUB
  859.     msg_Dbg( p_dec, "version: %d, width: %d, height: %d",
  860.              p_display->i_version, p_display->i_width, p_display->i_height );
  861.     if( p_display->b_windowed )
  862.         msg_Dbg( p_dec, "xmin: %d, xmax: %d, ymin: %d, ymax: %d",
  863.                  p_display->i_x, p_display->i_max_x, p_display->i_y, p_display->i_max_y );
  864. #endif
  865. }
  866. static void dvbsub_render_pdata( decoder_t *, dvbsub_region_t *, int, int,
  867.                                  uint8_t *, int );
  868. static void dvbsub_pdata2bpp( bs_t *, uint8_t *, int, int * );
  869. static void dvbsub_pdata4bpp( bs_t *, uint8_t *, int, int * );
  870. static void dvbsub_pdata8bpp( bs_t *, uint8_t *, int, int * );
  871. static void decode_object( decoder_t *p_dec, bs_t *s )
  872. {
  873.     decoder_sys_t *p_sys = p_dec->p_sys;
  874.     dvbsub_region_t *p_region;
  875.     int i_segment_length, i_coding_method, i_version, i_id, i;
  876.     bool b_non_modify_color;
  877.     /* ETSI 300-743 paragraph 7.2.4
  878.      * sync_byte, segment_type and page_id have already been processed.
  879.      */
  880.     i_segment_length = bs_read( s, 16 );
  881.     i_id             = bs_read( s, 16 );
  882.     i_version        = bs_read( s, 4 );
  883.     i_coding_method  = bs_read( s, 2 );
  884.     if( i_coding_method > 1 )
  885.     {
  886.         msg_Dbg( p_dec, "unknown DVB subtitling coding %d is not handled!", i_coding_method );
  887.         bs_skip( s, 8 * (i_segment_length - 2) - 6 );
  888.         return;
  889.     }
  890.     /* Check if the object needs to be rendered in at least one
  891.      * of the regions */
  892.     for( p_region = p_sys->p_regions; p_region != NULL;
  893.          p_region = p_region->p_next )
  894.     {
  895.         for( i = 0; i < p_region->i_object_defs; i++ )
  896.             if( p_region->p_object_defs[i].i_id == i_id ) break;
  897.         if( i != p_region->i_object_defs ) break;
  898.     }
  899.     if( !p_region )
  900.     {
  901.         bs_skip( s, 8 * (i_segment_length - 2) - 6 );
  902.         return;
  903.     }
  904. #ifdef DEBUG_DVBSUB
  905.     msg_Dbg( p_dec, "new object: %i", i_id );
  906. #endif
  907.     b_non_modify_color = bs_read( s, 1 );
  908.     bs_skip( s, 1 ); /* Reserved */
  909.     if( i_coding_method == 0x00 )
  910.     {
  911.         int i_topfield, i_bottomfield;
  912.         uint8_t *p_topfield, *p_bottomfield;
  913.         i_topfield    = bs_read( s, 16 );
  914.         i_bottomfield = bs_read( s, 16 );
  915.         p_topfield    = s->p_start + bs_pos( s ) / 8;
  916.         p_bottomfield = p_topfield + i_topfield;
  917.         bs_skip( s, 8 * (i_segment_length - 7) );
  918.         /* Sanity check */
  919.         if( ( i_segment_length < ( i_topfield + i_bottomfield + 7 ) ) ||
  920.             ( ( p_topfield + i_topfield + i_bottomfield ) > s->p_end ) )
  921.         {
  922.             msg_Dbg( p_dec, "corrupted object data" );
  923.             return;
  924.         }
  925.         for( p_region = p_sys->p_regions; p_region != NULL;
  926.              p_region = p_region->p_next )
  927.         {
  928.             for( i = 0; i < p_region->i_object_defs; i++ )
  929.             {
  930.                 if( p_region->p_object_defs[i].i_id != i_id ) continue;
  931.                 dvbsub_render_pdata( p_dec, p_region,
  932.                                      p_region->p_object_defs[i].i_x,
  933.                                      p_region->p_object_defs[i].i_y,
  934.                                      p_topfield, i_topfield );
  935.                 if( i_bottomfield )
  936.                 {
  937.                     dvbsub_render_pdata( p_dec, p_region,
  938.                                          p_region->p_object_defs[i].i_x,
  939.                                          p_region->p_object_defs[i].i_y + 1,
  940.                                          p_bottomfield, i_bottomfield );
  941.                 }
  942.                 else
  943.                 {
  944.                     /* Duplicate the top field */
  945.                     dvbsub_render_pdata( p_dec, p_region,
  946.                                          p_region->p_object_defs[i].i_x,
  947.                                          p_region->p_object_defs[i].i_y + 1,
  948.                                          p_topfield, i_topfield );
  949.                 }
  950.             }
  951.         }
  952.     }
  953.     else
  954.     {
  955.         /* DVB subtitling as characters */
  956.         int i_number_of_codes = bs_read( s, 8 );
  957.         uint8_t* p_start = s->p_start + bs_pos( s ) / 8;
  958.         /* Sanity check */
  959.         if( ( i_segment_length < ( i_number_of_codes*2 + 4 ) ) ||
  960.             ( ( p_start + i_number_of_codes*2 ) > s->p_end ) )
  961.         {
  962.             msg_Dbg( p_dec, "corrupted object data" );
  963.             return;
  964.         }
  965.         for( p_region = p_sys->p_regions; p_region != NULL;
  966.              p_region = p_region->p_next )
  967.         {
  968.             for( i = 0; i < p_region->i_object_defs; i++ )
  969.             {
  970.                 int j;
  971.                 if( p_region->p_object_defs[i].i_id != i_id ) continue;
  972.                 p_region->p_object_defs[i].psz_text =
  973.                     realloc( p_region->p_object_defs[i].psz_text,
  974.                              i_number_of_codes + 1 );
  975.                 /* FIXME 16bits -> char ??? See Preamble */
  976.                 for( j = 0; j < i_number_of_codes; j++ )
  977.                 {
  978.                     p_region->p_object_defs[i].psz_text[j] = (char)(bs_read( s, 16 ) & 0xFF);
  979.                 }
  980.                 /* Null terminate the string */
  981.                 p_region->p_object_defs[i].psz_text[j] = 0;
  982.             }
  983.         }
  984.     }
  985. #ifdef DEBUG_DVBSUB
  986.     msg_Dbg( p_dec, "end object: %i", i_id );
  987. #endif
  988. }
  989. static void dvbsub_render_pdata( decoder_t *p_dec, dvbsub_region_t *p_region,
  990.                                  int i_x, int i_y,
  991.                                  uint8_t *p_field, int i_field )
  992. {
  993.     uint8_t *p_pixbuf;
  994.     int i_offset = 0;
  995.     bs_t bs;
  996.     /* Sanity check */
  997.     if( !p_region->p_pixbuf )
  998.     {
  999.         msg_Err( p_dec, "region %i has no pixel buffer!", p_region->i_id );
  1000.         return;
  1001.     }
  1002.     if( i_y < 0 || i_x < 0 || i_y >= p_region->i_height ||
  1003.         i_x >= p_region->i_width )
  1004.     {
  1005.         msg_Dbg( p_dec, "invalid offset (%i,%i)", i_x, i_y );
  1006.         return;
  1007.     }
  1008.     p_pixbuf = p_region->p_pixbuf + i_y * p_region->i_width;
  1009.     bs_init( &bs, p_field, i_field );
  1010.     while( !bs_eof( &bs ) )
  1011.     {
  1012.         /* Sanity check */
  1013.         if( i_y >= p_region->i_height ) return;
  1014.         switch( bs_read( &bs, 8 ) )
  1015.         {
  1016.         case 0x10:
  1017.             dvbsub_pdata2bpp( &bs, p_pixbuf + i_x, p_region->i_width - i_x,
  1018.                               &i_offset );
  1019.             break;
  1020.         case 0x11:
  1021.             dvbsub_pdata4bpp( &bs, p_pixbuf + i_x, p_region->i_width - i_x,
  1022.                               &i_offset );
  1023.             break;
  1024.         case 0x12:
  1025.             dvbsub_pdata8bpp( &bs, p_pixbuf + i_x, p_region->i_width - i_x,
  1026.                               &i_offset );
  1027.             break;
  1028.         case 0x20:
  1029.         case 0x21:
  1030.         case 0x22:
  1031.             /* We don't use map tables */
  1032.             break;
  1033.         case 0xf0: /* End of line code */
  1034.             p_pixbuf += 2*p_region->i_width;
  1035.             i_offset = 0; i_y += 2;
  1036.             break;
  1037.         }
  1038.     }
  1039. }
  1040. static void dvbsub_pdata2bpp( bs_t *s, uint8_t *p, int i_width, int *pi_off )
  1041. {
  1042.     bool b_stop = false;
  1043.     while( !b_stop && !bs_eof( s ) )
  1044.     {
  1045.         int i_count = 0, i_color = 0;
  1046.         i_color = bs_read( s, 2 );
  1047.         if( i_color != 0x00 )
  1048.         {
  1049.             i_count = 1;
  1050.         }
  1051.         else
  1052.         {
  1053.             if( bs_read( s, 1 ) == 0x01 )         // Switch1
  1054.             {
  1055.                 i_count = 3 + bs_read( s, 3 );
  1056.                 i_color = bs_read( s, 2 );
  1057.             }
  1058.             else
  1059.             {
  1060.                 if( bs_read( s, 1 ) == 0x00 )     //Switch2
  1061.                 {
  1062.                     switch( bs_read( s, 2 ) )     //Switch3
  1063.                     {
  1064.                     case 0x00:
  1065.                         b_stop = true;
  1066.                         break;
  1067.                     case 0x01:
  1068.                         i_count = 2;
  1069.                         break;
  1070.                     case 0x02:
  1071.                         i_count =  12 + bs_read( s, 4 );
  1072.                         i_color = bs_read( s, 2 );
  1073.                         break;
  1074.                     case 0x03:
  1075.                         i_count =  29 + bs_read( s, 8 );
  1076.                         i_color = bs_read( s, 2 );
  1077.                         break;
  1078.                     default:
  1079.                         break;
  1080.                     }
  1081.                 }
  1082.                 else
  1083.                 {
  1084.                     /* 1 pixel color 0 */
  1085.                     i_count = 1;
  1086.                 }
  1087.             }
  1088.         }
  1089.         if( !i_count ) continue;
  1090.         /* Sanity check */
  1091.         if( ( i_count + *pi_off ) > i_width ) break;
  1092.         if( i_count == 1 ) p[*pi_off] = i_color;
  1093.         else memset( ( p + *pi_off ), i_color, i_count );
  1094.         (*pi_off) += i_count;
  1095.     }
  1096.     bs_align( s );
  1097. }
  1098. static void dvbsub_pdata4bpp( bs_t *s, uint8_t *p, int i_width, int *pi_off )
  1099. {
  1100.     bool b_stop = false;
  1101.     while( !b_stop && !bs_eof( s ) )
  1102.     {
  1103.         int i_count = 0, i_color = 0;
  1104.         i_color = bs_read( s, 4 );
  1105.         if( i_color != 0x00 )
  1106.         {
  1107.             /* Add 1 pixel */
  1108.             i_count = 1;
  1109.         }
  1110.         else
  1111.         {
  1112.             if( bs_read( s, 1 ) == 0x00 )           // Switch1
  1113.             {
  1114.                 if( bs_show( s, 3 ) != 0x00 )
  1115.                 {
  1116.                     i_count = 2 + bs_read( s, 3 );
  1117.                 }
  1118.                 else
  1119.                 {
  1120.                     bs_skip( s, 3 );
  1121.                     b_stop = true;
  1122.                 }
  1123.             }
  1124.             else
  1125.             {
  1126.                 if( bs_read( s, 1 ) == 0x00)        //Switch2
  1127.                 {
  1128.                     i_count =  4 + bs_read( s, 2 );
  1129.                     i_color = bs_read( s, 4 );
  1130.                 }
  1131.                 else
  1132.                 {
  1133.                     switch ( bs_read( s, 2 ) )     //Switch3
  1134.                     {
  1135.                     case 0x0:
  1136.                         i_count = 1;
  1137.                         break;
  1138.                     case 0x1:
  1139.                         i_count = 2;
  1140.                         break;
  1141.                     case 0x2:
  1142.                         i_count = 9 + bs_read( s, 4 );
  1143.                         i_color = bs_read( s, 4 );
  1144.                         break;
  1145.                     case 0x3:
  1146.                         i_count= 25 + bs_read( s, 8 );
  1147.                         i_color = bs_read( s, 4 );
  1148.                         break;
  1149.                     }
  1150.                 }
  1151.             }
  1152.         }
  1153.         if( !i_count ) continue;
  1154.         /* Sanity check */
  1155.         if( ( i_count + *pi_off ) > i_width ) break;
  1156.         if( i_count == 1 ) p[*pi_off] = i_color;
  1157.         else memset( ( p + *pi_off ), i_color, i_count );
  1158.         (*pi_off) += i_count;
  1159.     }
  1160.     bs_align( s );
  1161. }
  1162. static void dvbsub_pdata8bpp( bs_t *s, uint8_t *p, int i_width, int *pi_off )
  1163. {
  1164.     bool b_stop = false;
  1165.     while( !b_stop && !bs_eof( s ) )
  1166.     {
  1167.         int i_count = 0, i_color = 0;
  1168.         i_color = bs_read( s, 8 );
  1169.         if( i_color != 0x00 )
  1170.         {
  1171.             /* Add 1 pixel */
  1172.             i_count = 1;
  1173.         }
  1174.         else
  1175.         {
  1176.             if( bs_read( s, 1 ) == 0x00 )           // Switch1
  1177.             {
  1178.                 if( bs_show( s, 7 ) != 0x00 )
  1179.                 {
  1180.                     i_count = bs_read( s, 7 );
  1181.                 }
  1182.                 else
  1183.                 {
  1184.                     bs_skip( s, 7 );
  1185.                     b_stop = true;
  1186.                 }
  1187.             }
  1188.             else
  1189.             {
  1190.                 i_count = bs_read( s, 7 );
  1191.                 i_color = bs_read( s, 8 );
  1192.             }
  1193.         }
  1194.         if( !i_count ) continue;
  1195.         /* Sanity check */
  1196.         if( ( i_count + *pi_off ) > i_width ) break;
  1197.         if( i_count == 1 ) p[*pi_off] = i_color;
  1198.         else memset( ( p + *pi_off ), i_color, i_count );
  1199.         (*pi_off) += i_count;
  1200.     }
  1201.     bs_align( s );
  1202. }
  1203. static void free_all( decoder_t *p_dec )
  1204. {
  1205.     decoder_sys_t *p_sys = p_dec->p_sys;
  1206.     dvbsub_region_t *p_reg, *p_reg_next;
  1207.     dvbsub_clut_t *p_clut, *p_clut_next;
  1208.     free( p_sys->p_display );
  1209.     for( p_clut = p_sys->p_cluts; p_clut != NULL; p_clut = p_clut_next )
  1210.     {
  1211.         p_clut_next = p_clut->p_next;
  1212.         free( p_clut );
  1213.     }
  1214.     p_sys->p_cluts = NULL;
  1215.     for( p_reg = p_sys->p_regions; p_reg != NULL; p_reg = p_reg_next )
  1216.     {
  1217.         int i;
  1218.         p_reg_next = p_reg->p_next;
  1219.         for( i = 0; i < p_reg->i_object_defs; i++ )
  1220.             free( p_reg->p_object_defs[i].psz_text );
  1221.         if( p_reg->i_object_defs ) free( p_reg->p_object_defs );
  1222.         free( p_reg->p_pixbuf );
  1223.         free( p_reg );
  1224.     }
  1225.     p_sys->p_regions = NULL;
  1226.     if( p_sys->p_page )
  1227.     {
  1228.         if( p_sys->p_page->i_region_defs )
  1229.             free( p_sys->p_page->p_region_defs );
  1230.         free( p_sys->p_page );
  1231.     }
  1232.     p_sys->p_page = NULL;
  1233. }
  1234. static subpicture_t *render( decoder_t *p_dec )
  1235. {
  1236.     decoder_sys_t *p_sys = p_dec->p_sys;
  1237.     subpicture_t *p_spu;
  1238.     subpicture_region_t **pp_spu_region;
  1239.     int i, j, i_timeout = 0;
  1240.     int i_base_x;
  1241.     int i_base_y;
  1242.     /* Allocate the subpicture internal data. */
  1243.     p_spu = decoder_NewSubpicture( p_dec );
  1244.     if( !p_spu )
  1245.         return NULL;
  1246.     p_spu->b_absolute = p_sys->b_absolute;
  1247.     /* Set the pf_render callback */
  1248.     p_spu->i_start = (mtime_t) p_sys->i_pts;
  1249.     //p_spu->i_stop = (mtime_t) 0;
  1250.     p_spu->b_ephemer = true;
  1251.     //p_spu->b_fade = true;
  1252.     //p_spu->i_stop = p_spu->i_start + (mtime_t) (i_timeout * 1000000);
  1253.     /* Correct positioning of SPU */
  1254.     i_base_x = p_sys->i_spu_x;
  1255.     i_base_y = p_sys->i_spu_y;
  1256.     p_spu->i_original_picture_width = 720;
  1257.     p_spu->i_original_picture_height = 576;
  1258.     if( p_sys->p_display )
  1259.     {
  1260.         p_spu->i_original_picture_width = p_sys->p_display->i_width;
  1261.         p_spu->i_original_picture_height = p_sys->p_display->i_height;
  1262.         if( p_sys->p_display->b_windowed )
  1263.         {
  1264.             /* TODO: check that this actually works */
  1265.             p_spu->i_original_picture_width = p_sys->p_display->i_max_x - p_sys->p_display->i_x;
  1266.             p_spu->i_original_picture_height = p_sys->p_display->i_max_y - p_sys->p_display->i_y;
  1267.             i_base_x += p_sys->p_display->i_x;
  1268.             i_base_y += p_sys->p_display->i_y;
  1269.         }
  1270.     }
  1271.     pp_spu_region = &p_spu->p_region;
  1272.     /* Loop on region definitions */
  1273. #ifdef DEBUG_DVBSUB
  1274.     if( p_sys->p_page )
  1275.         msg_Dbg( p_dec, "rendering %i regions", p_sys->p_page->i_region_defs );
  1276. #endif
  1277.     for( i = 0; p_sys->p_page && ( i < p_sys->p_page->i_region_defs ); i++ )
  1278.     {
  1279.         dvbsub_region_t     *p_region;
  1280.         dvbsub_regiondef_t  *p_regiondef;
  1281.         dvbsub_clut_t       *p_clut;
  1282.         dvbsub_color_t      *p_color;
  1283.         subpicture_region_t *p_spu_region;
  1284.         uint8_t *p_src, *p_dst;
  1285.         video_format_t fmt;
  1286.         video_palette_t palette;
  1287.         int i_pitch;
  1288.         i_timeout = p_sys->p_page->i_timeout;
  1289.         p_regiondef = &p_sys->p_page->p_region_defs[i];
  1290. #ifdef DEBUG_DVBSUB
  1291.         msg_Dbg( p_dec, "rendering region %i (%i,%i)", i,
  1292.                  p_regiondef->i_x, p_regiondef->i_y );
  1293. #endif
  1294.         /* Find associated region */
  1295.         for( p_region = p_sys->p_regions; p_region != NULL;
  1296.              p_region = p_region->p_next )
  1297.         {
  1298.             if( p_regiondef->i_id == p_region->i_id ) break;
  1299.         }
  1300.         if( !p_region )
  1301.         {
  1302.             msg_Dbg( p_dec, "region %i not found", p_regiondef->i_id );
  1303.             continue;
  1304.         }
  1305.         /* Find associated CLUT */
  1306.         for( p_clut = p_sys->p_cluts; p_clut != NULL; p_clut = p_clut->p_next )
  1307.         {
  1308.             if( p_region->i_clut == p_clut->i_id ) break;
  1309.         }
  1310.         if( !p_clut )
  1311.         {
  1312.             msg_Dbg( p_dec, "clut %i not found", p_region->i_clut );
  1313.             continue;
  1314.         }
  1315.         /* FIXME: don't create a subpicture region with VLC_FOURCC YUVP 
  1316.          * when it actually is a TEXT region */
  1317.         /* Create new SPU region */
  1318.         memset( &fmt, 0, sizeof(video_format_t) );
  1319.         fmt.i_chroma = VLC_FOURCC('Y','U','V','P');
  1320.         fmt.i_aspect = 0; /* 0 means use aspect ratio of background video */
  1321.         fmt.i_width = fmt.i_visible_width = p_region->i_width;
  1322.         fmt.i_height = fmt.i_visible_height = p_region->i_height;
  1323.         fmt.i_x_offset = fmt.i_y_offset = 0;
  1324.         fmt.p_palette = &palette;
  1325.         fmt.p_palette->i_entries = ( p_region->i_depth == 1 ) ? 4 :
  1326.             ( ( p_region->i_depth == 2 ) ? 16 : 256 );
  1327.         p_color = ( p_region->i_depth == 1 ) ? p_clut->c_2b :
  1328.             ( ( p_region->i_depth == 2 ) ? p_clut->c_4b : p_clut->c_8b );
  1329.         for( j = 0; j < fmt.p_palette->i_entries; j++ )
  1330.         {
  1331.             fmt.p_palette->palette[j][0] = p_color[j].Y;
  1332.             fmt.p_palette->palette[j][1] = p_color[j].Cb; /* U == Cb */
  1333.             fmt.p_palette->palette[j][2] = p_color[j].Cr; /* V == Cr */
  1334.             fmt.p_palette->palette[j][3] = 0xff - p_color[j].T;
  1335.         }
  1336.         p_spu_region = subpicture_region_New( &fmt );
  1337.         if( !p_spu_region )
  1338.         {
  1339.             msg_Err( p_dec, "cannot allocate SPU region" );
  1340.             continue;
  1341.         }
  1342.         p_spu_region->i_x = i_base_x + p_regiondef->i_x;
  1343.         p_spu_region->i_y = i_base_y + p_regiondef->i_y;
  1344.         p_spu_region->i_align = p_sys->i_spu_position;
  1345.         *pp_spu_region = p_spu_region;
  1346.         pp_spu_region = &p_spu_region->p_next;
  1347.         p_src = p_region->p_pixbuf;
  1348.         p_dst = p_spu_region->p_picture->Y_PIXELS;
  1349.         i_pitch = p_spu_region->p_picture->Y_PITCH;
  1350.         /* Copy pixel buffer */
  1351.         for( j = 0; j < p_region->i_height; j++ )
  1352.         {
  1353.             memcpy( p_dst, p_src, p_region->i_width );
  1354.             p_src += p_region->i_width;
  1355.             p_dst += i_pitch;
  1356.         }
  1357.         /* Check subtitles encoded as strings of characters
  1358.          * (since there are not rendered in the pixbuffer) */
  1359.         for( j = 0; j < p_region->i_object_defs; j++ )
  1360.         {
  1361.             dvbsub_objectdef_t *p_object_def = &p_region->p_object_defs[j];
  1362.             if( ( p_object_def->i_type != 1 ) || !p_object_def->psz_text )
  1363.                 continue;
  1364.             /* Create new SPU region */
  1365.             memset( &fmt, 0, sizeof(video_format_t) );
  1366.             fmt.i_chroma = VLC_FOURCC('T','E','X','T');
  1367.             fmt.i_aspect = VOUT_ASPECT_FACTOR;
  1368.             fmt.i_width = fmt.i_visible_width = p_region->i_width;
  1369.             fmt.i_height = fmt.i_visible_height = p_region->i_height;
  1370.             fmt.i_x_offset = fmt.i_y_offset = 0;
  1371.             p_spu_region = subpicture_region_New( &fmt );
  1372.             if( !p_region )
  1373.             {
  1374.                 msg_Err( p_dec, "cannot allocate SPU region" );
  1375.                 continue;
  1376.             }
  1377.             p_spu_region->psz_text = strdup( p_object_def->psz_text );
  1378.             p_spu_region->i_x = i_base_x + p_regiondef->i_x + p_object_def->i_x;
  1379.             p_spu_region->i_y = i_base_y + p_regiondef->i_y + p_object_def->i_y;
  1380.             p_spu_region->i_align = p_sys->i_spu_position;
  1381.             *pp_spu_region = p_spu_region;
  1382.             pp_spu_region = &p_spu_region->p_next;
  1383.         }
  1384.     }
  1385.     return p_spu;
  1386. }
  1387. /*****************************************************************************
  1388.  * encoder_sys_t : encoder descriptor
  1389.  *****************************************************************************/
  1390. typedef struct encoder_region_t
  1391. {
  1392.     int i_width;
  1393.     int i_height;
  1394. } encoder_region_t;
  1395. struct encoder_sys_t
  1396. {
  1397.     unsigned int i_page_ver;
  1398.     unsigned int i_region_ver;
  1399.     unsigned int i_clut_ver;
  1400.     int i_regions;
  1401.     encoder_region_t *p_regions;
  1402.     mtime_t i_pts;
  1403.     /* subpicture positioning */
  1404.     int i_offset_x;
  1405.     int i_offset_y;
  1406. };
  1407. static void encode_page_composition( encoder_t *, bs_t *, subpicture_t * );
  1408. static void encode_clut( encoder_t *, bs_t *, subpicture_t * );
  1409. static void encode_region_composition( encoder_t *, bs_t *, subpicture_t * );
  1410. static void encode_object( encoder_t *, bs_t *, subpicture_t * );
  1411. /*****************************************************************************
  1412.  * OpenEncoder: probe the encoder and return score
  1413.  *****************************************************************************/
  1414. static int OpenEncoder( vlc_object_t *p_this )
  1415. {
  1416.     encoder_t *p_enc = (encoder_t *)p_this;
  1417.     encoder_sys_t *p_sys;
  1418.     vlc_value_t val;
  1419.     if( ( p_enc->fmt_out.i_codec != VLC_FOURCC('d','v','b','s') ) &&
  1420.         !p_enc->b_force )
  1421.     {
  1422.         return VLC_EGENERIC;
  1423.     }
  1424.     /* Allocate the memory needed to store the decoder's structure */
  1425.     if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
  1426.         return VLC_ENOMEM;
  1427.     p_enc->p_sys = p_sys;
  1428.     p_enc->pf_encode_sub = Encode;
  1429.     p_enc->fmt_out.i_codec = VLC_FOURCC('d','v','b','s');
  1430.     p_enc->fmt_out.subs.dvb.i_id  = 1 << 16 | 1;
  1431.     config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
  1432.     p_sys->i_page_ver = 0;
  1433.     p_sys->i_region_ver = 0;
  1434.     p_sys->i_clut_ver = 0;
  1435.     p_sys->i_regions = 0;
  1436.     p_sys->p_regions = 0;
  1437.     var_Create( p_this, ENC_CFG_PREFIX "x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  1438.     var_Get( p_this, ENC_CFG_PREFIX "x", &val );
  1439.     p_sys->i_offset_x = val.i_int;
  1440.     var_Create( p_this, ENC_CFG_PREFIX "y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  1441.     var_Get( p_this, ENC_CFG_PREFIX "y", &val );
  1442.     p_sys->i_offset_y = val.i_int;
  1443.     return VLC_SUCCESS;
  1444. }
  1445. /* FIXME: this routine is a hack to convert VLC_FOURCC('Y','U','V','A')
  1446.  *        into VLC_FOURCC('Y','U','V','P')
  1447.  */
  1448. static subpicture_t *YuvaYuvp( subpicture_t *p_subpic )
  1449. {
  1450.     subpicture_region_t *p_region = NULL;
  1451.     if( !p_subpic ) return NULL;
  1452.     for( p_region = p_subpic->p_region; p_region; p_region = p_region->p_next )
  1453.     {
  1454.         video_format_t *p_fmt = &p_region->fmt;
  1455.         int i = 0, j = 0, n = 0, p = 0;
  1456.         int i_max_entries = 256;
  1457. #ifdef RANDOM_DITHERING
  1458.         int i_seed = 0xdeadbeef; /* random seed */
  1459. #else
  1460.         int *pi_delta;
  1461. #endif
  1462.         int i_pixels = p_region->p_picture->p[0].i_visible_lines
  1463.                         * p_region->p_picture->p[0].i_pitch;
  1464.         int i_iterator = p_region->p_picture->p[0].i_visible_lines * 3 / 4
  1465.                             * p_region->p_picture->p[0].i_pitch
  1466.                         + p_region->p_picture->p[0].i_pitch * 1 / 3;
  1467.         int i_tolerance = 0;
  1468. #ifdef DEBUG_DVBSUB
  1469.         msg_Dbg( p_enc, "YuvaYuvp: i_pixels=%d, i_iterator=%d", i_pixels, i_iterator );
  1470. #endif
  1471.         p_fmt->i_chroma = VLC_FOURCC('Y','U','V','P');
  1472.         p_fmt->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) );
  1473.         if( !p_fmt->p_palette ) break;
  1474.         p_fmt->p_palette->i_entries = 0;
  1475.         /* Find best iterator using Euclide’s algorithm */
  1476.         for( ; i_iterator > 1 ; i_iterator-- )
  1477.         {
  1478.             int a = i_pixels;
  1479.             int b = i_iterator;
  1480.             int c;
  1481.             while( b )
  1482.             {
  1483.                 c = a % b;
  1484.                 a = b;
  1485.                 b = c;
  1486.             }
  1487.             if( a == 1 )
  1488.             {
  1489.                 break;
  1490.             }
  1491.         }
  1492.         /* Count colors, build best palette */
  1493.         for( i_tolerance = 0; i_tolerance < 128; i_tolerance++ )
  1494.         {
  1495.             bool b_success = true;
  1496.             p_fmt->p_palette->i_entries = 0;
  1497.             for( i = 0; i < i_pixels ; )
  1498.             {
  1499.                 uint8_t y, u, v, a;
  1500.                 y = p_region->p_picture->p[0].p_pixels[i];
  1501.                 u = p_region->p_picture->p[1].p_pixels[i];
  1502.                 v = p_region->p_picture->p[2].p_pixels[i];
  1503.                 a = p_region->p_picture->p[3].p_pixels[i];
  1504.                 for( j = 0; j < p_fmt->p_palette->i_entries; j++ )
  1505.                 {
  1506.                     if( abs((int)p_fmt->p_palette->palette[j][0] - (int)y) <= i_tolerance &&
  1507.                         abs((int)p_fmt->p_palette->palette[j][1] - (int)u) <= i_tolerance &&
  1508.                         abs((int)p_fmt->p_palette->palette[j][2] - (int)v) <= i_tolerance &&
  1509.                         abs((int)p_fmt->p_palette->palette[j][3] - (int)a) <= i_tolerance / 2 )
  1510.                     {
  1511.                         break;
  1512.                     }
  1513.                 }
  1514.                 if( j == p_fmt->p_palette->i_entries )
  1515.                 {
  1516.                     p_fmt->p_palette->palette[j][0] = y;
  1517.                     p_fmt->p_palette->palette[j][1] = u;
  1518.                     p_fmt->p_palette->palette[j][2] = v;
  1519.                     p_fmt->p_palette->palette[j][3] = a;
  1520.                     p_fmt->p_palette->i_entries++;
  1521.                 }
  1522.                 if( p_fmt->p_palette->i_entries >= i_max_entries )
  1523.                 {
  1524.                     b_success = false;
  1525.                     break;
  1526.                 }
  1527.                 i += i_iterator;
  1528.                 if( i > i_pixels )
  1529.                 {
  1530.                     i -= i_pixels;
  1531.                 }
  1532.             }
  1533.             if( b_success )
  1534.             {
  1535.                 break;
  1536.             }
  1537.         }
  1538. #ifdef DEBUG_DVBSUB
  1539.         msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries );
  1540. #endif
  1541. #ifndef RANDOM_DITHERING
  1542.         pi_delta = malloc( ( p_region->p_picture->p[0].i_pitch + 1 )
  1543.                             * sizeof(int) * 4  );
  1544.         for( i = 0; i < (p_region->p_picture->p[0].i_pitch + 1) * 4 ; i++ )
  1545.         {
  1546.             pi_delta[ i ] = 0;
  1547.         }
  1548. #endif
  1549.         /* Fill image with our new colours */
  1550.         for( p = 0; p < p_region->p_picture->p[0].i_visible_lines ; p++ )
  1551.         {
  1552.             int i_ydelta = 0, i_udelta = 0, i_vdelta = 0, i_adelta = 0;
  1553.             for( n = 0; n < p_region->p_picture->p[0].i_pitch ; n++ )
  1554.             {
  1555.                 int i_offset = p * p_region->p_picture->p[0].i_pitch + n;
  1556.                 int y, u, v, a;
  1557.                 int i_mindist, i_best;
  1558.                 y = (int)p_region->p_picture->p[0].p_pixels[i_offset];
  1559.                 u = (int)p_region->p_picture->p[1].p_pixels[i_offset];
  1560.                 v = (int)p_region->p_picture->p[2].p_pixels[i_offset];
  1561.                 a = (int)p_region->p_picture->p[3].p_pixels[i_offset];
  1562.                 /* Add dithering compensation */
  1563. #ifdef RANDOM_DITHERING
  1564.                 y += ((i_seed & 0xff) - 0x80) * i_tolerance / 0x80;
  1565.                 u += (((i_seed >> 8) & 0xff) - 0x80) * i_tolerance / 0x80;
  1566.                 v += (((i_seed >> 16) & 0xff) - 0x80) * i_tolerance / 0x80;
  1567.                 a += (((i_seed >> 24) & 0xff) - 0x80) * i_tolerance / 0x80;
  1568. #else
  1569.                 y += i_ydelta + pi_delta[ n * 4 ];
  1570.                 u += i_udelta + pi_delta[ n * 4 + 1 ];
  1571.                 v += i_vdelta + pi_delta[ n * 4 + 2 ];
  1572.                 a += i_adelta + pi_delta[ n * 4 + 3 ];
  1573. #endif
  1574.                 /* Find best colour in palette */
  1575.                 for( i_mindist = 99999999, i_best = 0, j = 0; j < p_fmt->p_palette->i_entries; j++ )
  1576.                 {
  1577.                     int i_dist = 0;
  1578.                     i_dist += abs((int)p_fmt->p_palette->palette[j][0] - y);
  1579.                     i_dist += abs((int)p_fmt->p_palette->palette[j][1] - u);
  1580.                     i_dist += abs((int)p_fmt->p_palette->palette[j][2] - v);
  1581.                     i_dist += 2 * abs((int)p_fmt->p_palette->palette[j][3] - a);
  1582.                     if( i_dist < i_mindist )
  1583.                     {
  1584.                         i_mindist = i_dist;
  1585.                         i_best = j;
  1586.                     }
  1587.                 }
  1588.                 /* Set pixel to best color */
  1589.                 p_region->p_picture->p[0].p_pixels[i_offset] = i_best;
  1590.                 /* Update dithering state */
  1591. #ifdef RANDOM_DITHERING
  1592.                 i_seed = (i_seed * 0x1283837) ^ 0x789479 ^ (i_seed >> 13);
  1593. #else
  1594.                 i_ydelta = y - (int)p_fmt->p_palette->palette[i_best][0];
  1595.                 i_udelta = u - (int)p_fmt->p_palette->palette[i_best][1];
  1596.                 i_vdelta = v - (int)p_fmt->p_palette->palette[i_best][2];
  1597.                 i_adelta = a - (int)p_fmt->p_palette->palette[i_best][3];
  1598.                 pi_delta[ n * 4 ] = i_ydelta * 3 / 8;
  1599.                 pi_delta[ n * 4 + 1 ] = i_udelta * 3 / 8;
  1600.                 pi_delta[ n * 4 + 2 ] = i_vdelta * 3 / 8;
  1601.                 pi_delta[ n * 4 + 3 ] = i_adelta * 3 / 8;
  1602.                 i_ydelta = i_ydelta * 5 / 8;
  1603.                 i_udelta = i_udelta * 5 / 8;
  1604.                 i_vdelta = i_vdelta * 5 / 8;
  1605.                 i_adelta = i_adelta * 5 / 8;
  1606. #endif
  1607.             }
  1608.         }
  1609. #ifndef RANDOM_DITHERING
  1610.         free( pi_delta );
  1611. #endif
  1612.         /* pad palette */
  1613.         for( i = p_fmt->p_palette->i_entries; i < i_max_entries; i++ )
  1614.         {
  1615.             p_fmt->p_palette->palette[i][0] = 0;
  1616.             p_fmt->p_palette->palette[i][1] = 0;
  1617.             p_fmt->p_palette->palette[i][2] = 0;
  1618.             p_fmt->p_palette->palette[i][3] = 0;
  1619.         }
  1620.         p_fmt->p_palette->i_entries = i_max_entries;
  1621. #ifdef DEBUG_DVBSUB
  1622.         msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries );
  1623. #endif
  1624.     }
  1625.     return p_subpic;
  1626. } /* End of hack */
  1627. /****************************************************************************
  1628.  * Encode: the whole thing
  1629.  ****************************************************************************/
  1630. static block_t *Encode( encoder_t *p_enc, subpicture_t *p_subpic )
  1631. {
  1632.     subpicture_t *p_temp = NULL;
  1633.     subpicture_region_t *p_region = NULL;
  1634.     bs_t bits, *s = &bits;
  1635.     block_t *p_block;
  1636.     if( !p_subpic || !p_subpic->p_region ) return NULL;
  1637.     /* FIXME: this is a hack to convert VLC_FOURCC('Y','U','V','A') into
  1638.      *  VLC_FOURCC('Y','U','V','P')
  1639.      */
  1640.     p_region = p_subpic->p_region;
  1641.     if( p_region->fmt.i_chroma == VLC_FOURCC('Y','U','V','A') )
  1642.     {
  1643.         p_temp = YuvaYuvp( p_subpic );
  1644.         if( !p_temp )
  1645.         {
  1646.             msg_Err( p_enc, "no picture in subpicture" );
  1647.             return NULL;
  1648.         }
  1649.         p_region = p_subpic->p_region;
  1650.     }
  1651.     /* Sanity check */
  1652.     if( !p_region ) return NULL;
  1653.     if( ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) &&
  1654.         ( p_region->fmt.i_chroma != VLC_FOURCC('Y','U','V','P') ) )
  1655.     {
  1656.         char psz_fourcc[5];
  1657.         memset( &psz_fourcc, 0, sizeof( psz_fourcc ) );
  1658.         vlc_fourcc_to_char( p_region->fmt.i_chroma, &psz_fourcc );
  1659.         msg_Err( p_enc, "chroma %4s not supported", psz_fourcc );
  1660.         return NULL;
  1661.     }
  1662.     if( p_region->fmt.p_palette )
  1663.     {
  1664.         switch( p_region->fmt.p_palette->i_entries )
  1665.         {
  1666.             case 0:
  1667.             case 4:
  1668.             case 16:
  1669.             case 256:
  1670.                 break;
  1671.             default:
  1672.                 msg_Err( p_enc, "subpicture palette (%d) not handled",
  1673.                             p_region->fmt.p_palette->i_entries );
  1674.                 return NULL;
  1675.         }
  1676.     }
  1677.     /* End of hack */
  1678. #ifdef DEBUG_DVBSUB
  1679.     msg_Dbg( p_enc, "encoding subpicture" );
  1680. #endif
  1681.     p_block = block_New( p_enc, 64000 );
  1682.     bs_init( s, p_block->p_buffer, p_block->i_buffer );
  1683.     bs_write( s, 8, 0x20 ); /* Data identifier */
  1684.     bs_write( s, 8, 0x0 );  /* Subtitle stream id */
  1685.     encode_page_composition( p_enc, s, p_subpic );
  1686.     encode_region_composition( p_enc, s, p_subpic );
  1687.     encode_clut( p_enc, s, p_subpic );
  1688.     encode_object( p_enc, s, p_subpic );
  1689.     /* End of display */
  1690.     bs_write( s, 8, 0x0f ); /* Sync byte */
  1691.     bs_write( s, 8, DVBSUB_ST_ENDOFDISPLAY ); /* Segment type */
  1692.     bs_write( s, 16, 1 );  /* Page id */
  1693.     bs_write( s, 16, 0 );  /* Segment length */
  1694.     bs_write( s, 8, 0xff );/* End marker */
  1695.     p_block->i_buffer = bs_pos( s ) / 8;
  1696.     p_block->i_pts = p_block->i_dts = p_subpic->i_start;
  1697.     if( !p_subpic->b_ephemer && ( p_subpic->i_stop > p_subpic->i_start ) )
  1698.     {
  1699.         block_t *p_block_stop;
  1700.         p_block->i_length = p_subpic->i_stop - p_subpic->i_start;
  1701.         /* Send another (empty) subtitle to signal the end of display */
  1702.         p_block_stop = block_New( p_enc, 64000 );
  1703.         bs_init( s, p_block_stop->p_buffer, p_block_stop->i_buffer );
  1704.         bs_write( s, 8, 0x20 ); /* Data identifier */
  1705.         bs_write( s, 8, 0x0 );  /* Subtitle stream id */
  1706.         encode_page_composition( p_enc, s, 0 );
  1707.         bs_write( s, 8, 0x0f ); /* Sync byte */
  1708.         bs_write( s, 8, DVBSUB_ST_ENDOFDISPLAY ); /* Segment type */
  1709.         bs_write( s, 16, 1 );  /* Page id */
  1710.         bs_write( s, 16, 0 );  /* Segment length */
  1711.         bs_write( s, 8, 0xff );/* End marker */
  1712.         p_block_stop->i_buffer = bs_pos( s ) / 8;
  1713.         p_block_stop->i_pts = p_block_stop->i_dts = p_subpic->i_stop;
  1714.         block_ChainAppend( &p_block, p_block_stop );
  1715.         p_block_stop->i_length = 100000; /* p_subpic->i_stop - p_subpic->i_start; */
  1716.     }
  1717. #ifdef DEBUG_DVBSUB
  1718.     msg_Dbg( p_enc, "subpicture encoded properly" );
  1719. #endif
  1720.     return p_block;
  1721. }
  1722. /*****************************************************************************
  1723.  * CloseEncoder: encoder destruction
  1724.  *****************************************************************************/
  1725. static void CloseEncoder( vlc_object_t *p_this )
  1726. {
  1727.     encoder_t *p_enc = (encoder_t *)p_this;
  1728.     encoder_sys_t *p_sys = p_enc->p_sys;
  1729.     var_Destroy( p_this , ENC_CFG_PREFIX "x" );
  1730.     var_Destroy( p_this , ENC_CFG_PREFIX "y" );
  1731.     var_Destroy( p_this , ENC_CFG_PREFIX "timeout" );
  1732.     if( p_sys->i_regions ) free( p_sys->p_regions );
  1733.     free( p_sys );
  1734. }
  1735. static void encode_page_composition( encoder_t *p_enc, bs_t *s,
  1736.                                      subpicture_t *p_subpic )
  1737. {
  1738.     encoder_sys_t *p_sys = p_enc->p_sys;
  1739.     subpicture_region_t *p_region;
  1740.     bool b_mode_change = false;
  1741.     int i_regions, i_timeout;
  1742.     bs_write( s, 8, 0x0f ); /* Sync byte */
  1743.     bs_write( s, 8, DVBSUB_ST_PAGE_COMPOSITION ); /* Segment type */
  1744.     bs_write( s, 16, 1 ); /* Page id */
  1745.     for( i_regions = 0, p_region = p_subpic ? p_subpic->p_region : 0;
  1746.          p_region; p_region = p_region->p_next, i_regions++ )
  1747.     {
  1748.         if( i_regions >= p_sys->i_regions )
  1749.         {
  1750.             encoder_region_t region;
  1751.             region.i_width = region.i_height = 0;
  1752.             p_sys->p_regions =
  1753.                 realloc( p_sys->p_regions, sizeof(encoder_region_t) *
  1754.                          (p_sys->i_regions + 1) );
  1755.             p_sys->p_regions[p_sys->i_regions++] = region;
  1756.         }
  1757.         if( ( p_sys->p_regions[i_regions].i_width <
  1758.               (int)p_region->fmt.i_visible_width ) ||
  1759.             ( p_sys->p_regions[i_regions].i_width >
  1760.               (int)p_region->fmt.i_visible_width ) )
  1761.         {
  1762.             b_mode_change = true;
  1763.             msg_Dbg( p_enc, "region %i width change: %i -> %i",
  1764.                      i_regions, p_sys->p_regions[i_regions].i_width,
  1765.                      p_region->fmt.i_visible_width );
  1766.             p_sys->p_regions[i_regions].i_width =
  1767.                 p_region->fmt.i_visible_width;
  1768.         }
  1769.         if( p_sys->p_regions[i_regions].i_height <
  1770.              (int)p_region->fmt.i_visible_height )
  1771.         {
  1772.             b_mode_change = true;
  1773.             msg_Dbg( p_enc, "region %i height change: %i -> %i",
  1774.                      i_regions, p_sys->p_regions[i_regions].i_height,
  1775.                      p_region->fmt.i_visible_height );
  1776.             p_sys->p_regions[i_regions].i_height =
  1777.                 p_region->fmt.i_visible_height;
  1778.         }
  1779.     }
  1780.     bs_write( s, 16, i_regions * 6 + 2 ); /* Segment length */
  1781.     i_timeout = 0;
  1782.     if( p_subpic && !p_subpic->b_ephemer &&
  1783.         ( p_subpic->i_stop > p_subpic->i_start ) )
  1784.     {
  1785.         i_timeout = (p_subpic->i_stop - p_subpic->i_start) / 1000000;
  1786.     }
  1787.     bs_write( s, 8, i_timeout ); /* Timeout */
  1788.     bs_write( s, 4, p_sys->i_page_ver++ );
  1789.     bs_write( s, 2, b_mode_change ?
  1790.               DVBSUB_PCS_STATE_CHANGE : DVBSUB_PCS_STATE_ACQUISITION );
  1791.     bs_write( s, 2, 0 ); /* Reserved */
  1792.     for( i_regions = 0, p_region = p_subpic ? p_subpic->p_region : 0;
  1793.          p_region; p_region = p_region->p_next, i_regions++ )
  1794.     {
  1795.         bs_write( s, 8, i_regions );
  1796.         bs_write( s, 8, 0 ); /* Reserved */
  1797.         if( (p_sys->i_offset_x > 0) && (p_sys->i_offset_y > 0) )
  1798.         {
  1799.             bs_write( s, 16, p_sys->i_offset_x ); /* override x position */
  1800.             bs_write( s, 16, p_sys->i_offset_y ); /* override y position */
  1801.         }
  1802.         else
  1803.         {
  1804.             bs_write( s, 16, p_region->i_x );
  1805.             bs_write( s, 16, p_region->i_y );
  1806.         }
  1807.     }
  1808. }
  1809. static void encode_clut( encoder_t *p_enc, bs_t *s, subpicture_t *p_subpic )
  1810. {
  1811.     encoder_sys_t *p_sys = p_enc->p_sys;
  1812.     subpicture_region_t *p_region = p_subpic->p_region;
  1813.     video_palette_t *p_pal, pal;
  1814.     int i;
  1815.     /* Sanity check */
  1816.     if( !p_region ) return;
  1817.     if( p_region->fmt.i_chroma == VLC_FOURCC('Y','U','V','P') )
  1818.     {
  1819.         p_pal = p_region->fmt.p_palette;
  1820.     }
  1821.     else
  1822.     {
  1823.         pal.i_entries = 4;
  1824.         for( i = 0; i < 4; i++ )
  1825.         {
  1826.             pal.palette[i][0] = 0;
  1827.             pal.palette[i][1] = 0;
  1828.             pal.palette[i][2] = 0;
  1829.             pal.palette[i][3] = 0;
  1830.         }
  1831.         p_pal = &pal;
  1832.     }
  1833.     bs_write( s, 8, 0x0f ); /* Sync byte */
  1834.     bs_write( s, 8, DVBSUB_ST_CLUT_DEFINITION ); /* Segment type */
  1835.     bs_write( s, 16, 1 );  /* Page id */
  1836.     bs_write( s, 16, p_pal->i_entries * 6 + 2 ); /* Segment length */
  1837.     bs_write( s, 8, 1 ); /* Clut id */
  1838.     bs_write( s, 4, p_sys->i_clut_ver++ );
  1839.     bs_write( s, 4, 0 ); /* Reserved */
  1840.     for( i = 0; i < p_pal->i_entries; i++ )
  1841.     {
  1842.         bs_write( s, 8, i ); /* Clut entry id */
  1843.         bs_write( s, 1, p_pal->i_entries == 4 );   /* 2bit/entry flag */
  1844.         bs_write( s, 1, p_pal->i_entries == 16 );  /* 4bit/entry flag */
  1845.         bs_write( s, 1, p_pal->i_entries == 256 ); /* 8bit/entry flag */
  1846.         bs_write( s, 4, 0 ); /* Reserved */
  1847.         bs_write( s, 1, 1 ); /* Full range flag */
  1848.         bs_write( s, 8, p_pal->palette[i][3] ?  /* Y value */
  1849.                   (p_pal->palette[i][0] ? p_pal->palette[i][0] : 16) : 0 );
  1850.         bs_write( s, 8, p_pal->palette[i][1] ); /* Cr value */
  1851.         bs_write( s, 8, p_pal->palette[i][2] ); /* Cb value */
  1852.         bs_write( s, 8, 0xff - p_pal->palette[i][3] ); /* T value */
  1853.     }
  1854. }
  1855. static void encode_region_composition( encoder_t *p_enc, bs_t *s,
  1856.                                        subpicture_t *p_subpic )
  1857. {
  1858.     encoder_sys_t *p_sys = p_enc->p_sys;
  1859.     subpicture_region_t *p_region;
  1860.     int i_region;
  1861.     for( i_region = 0, p_region = p_subpic->p_region; p_region;
  1862.          p_region = p_region->p_next, i_region++ )
  1863.     {
  1864.         int i_entries = 4, i_depth = 0x1, i_bg = 0;
  1865.         bool b_text =
  1866.             ( p_region->fmt.i_chroma == VLC_FOURCC('T','E','X','T') );
  1867.         if( !b_text )
  1868.         {
  1869.             video_palette_t *p_pal = p_region->fmt.p_palette;
  1870.             if( !p_pal )
  1871.             {
  1872.                 msg_Err( p_enc, "subpicture has no palette - ignoring it" );
  1873.                 break;
  1874.             }
  1875.             i_entries = p_pal->i_entries;
  1876.             i_depth = i_entries == 4 ? 0x1 : i_entries == 16 ? 0x2 : 0x3;
  1877.             for( i_bg = 0; i_bg < p_pal->i_entries; i_bg++ )
  1878.             {
  1879.                 if( !p_pal->palette[i_bg][3] ) break;
  1880.             }
  1881.         }
  1882.         bs_write( s, 8, 0x0f ); /* Sync byte */
  1883.         bs_write( s, 8, DVBSUB_ST_REGION_COMPOSITION ); /* Segment type */
  1884.         bs_write( s, 16, 1 );   /* Page id */
  1885.         bs_write( s, 16, 10 + 6 + (b_text ? 2 : 0) ); /* Segment length */
  1886.         bs_write( s, 8, i_region );
  1887.         bs_write( s, 4, p_sys->i_region_ver++ );
  1888.         /* Region attributes */
  1889.         bs_write( s, 1, i_bg < i_entries ); /* Fill */
  1890.         bs_write( s, 3, 0 ); /* Reserved */
  1891.         bs_write( s, 16, p_sys->p_regions[i_region].i_width );
  1892.         bs_write( s, 16, p_sys->p_regions[i_region].i_height );
  1893.         bs_write( s, 3, i_depth );  /* Region level of compatibility */
  1894.         bs_write( s, 3, i_depth  ); /* Region depth */
  1895.         bs_write( s, 2, 0 ); /* Reserved */
  1896.         bs_write( s, 8, 1 ); /* Clut id */
  1897.         bs_write( s, 8, i_bg ); /* region 8bit pixel code */
  1898.         bs_write( s, 4, i_bg ); /* region 4bit pixel code */
  1899.         bs_write( s, 2, i_bg ); /* region 2bit pixel code */
  1900.         bs_write( s, 2, 0 ); /* Reserved */
  1901.         /* In our implementation we only have 1 object per region */
  1902.         bs_write( s, 16, i_region );
  1903.         bs_write( s, 2, b_text ? DVBSUB_OT_BASIC_CHAR:DVBSUB_OT_BASIC_BITMAP );
  1904.         bs_write( s, 2, 0 ); /* object provider flag */
  1905.         bs_write( s, 12, 0 );/* object horizontal position */
  1906.         bs_write( s, 4, 0 ); /* Reserved */
  1907.         bs_write( s, 12, 0 );/* object vertical position */
  1908.         if( b_text )
  1909.         {
  1910.             bs_write( s, 8, 1 ); /* foreground pixel code */
  1911.             bs_write( s, 8, 0 ); /* background pixel code */
  1912.         }
  1913.     }
  1914. }
  1915. static void encode_pixel_data( encoder_t *p_enc, bs_t *s,
  1916.                                subpicture_region_t *p_region,
  1917.                                bool b_top );
  1918. static void encode_object( encoder_t *p_enc, bs_t *s, subpicture_t *p_subpic )
  1919. {
  1920.     encoder_sys_t *p_sys = p_enc->p_sys;
  1921.     subpicture_region_t *p_region;
  1922.     int i_region;
  1923.     int i_length_pos, i_update_pos, i_pixel_data_pos;
  1924.     for( i_region = 0, p_region = p_subpic->p_region; p_region;
  1925.          p_region = p_region->p_next, i_region++ )
  1926.     {
  1927.         bs_write( s, 8, 0x0f ); /* Sync byte */
  1928.         bs_write( s, 8, DVBSUB_ST_OBJECT_DATA ); /* Segment type */
  1929.         bs_write( s, 16, 1 ); /* Page id */
  1930.         i_length_pos = bs_pos( s );
  1931.         bs_write( s, 16, 0 ); /* Segment length */
  1932.         bs_write( s, 16, i_region ); /* Object id */
  1933.         bs_write( s, 4, p_sys->i_region_ver++ );
  1934.         /* object coding method */
  1935.         switch( p_region->fmt.i_chroma )
  1936.         {
  1937.         case VLC_FOURCC( 'Y','U','V','P' ):
  1938.             bs_write( s, 2, 0 );
  1939.             break;
  1940.         case VLC_FOURCC( 'T','E','X','T' ):
  1941.             bs_write( s, 2, 1 );
  1942.             break;
  1943.         default:
  1944.             msg_Err( p_enc, "FOURCC %d not supported by encoder.", p_region->fmt.i_chroma );
  1945.             continue;
  1946.         }
  1947.         bs_write( s, 1, 0 ); /* non modifying color flag */
  1948.         bs_write( s, 1, 0 ); /* Reserved */
  1949.         if( p_region->fmt.i_chroma == VLC_FOURCC( 'T','E','X','T' ) )
  1950.         {
  1951.             int i_size, i;
  1952.             if( !p_region->psz_text ) continue;
  1953.             i_size = __MIN( strlen( p_region->psz_text ), 256 );
  1954.             bs_write( s, 8, i_size ); /* number of characters in string */
  1955.             for( i = 0; i < i_size; i++ )
  1956.             {
  1957.                 bs_write( s, 16, p_region->psz_text[i] );
  1958.             }
  1959.             /* Update segment length */
  1960.             SetWBE( &s->p_start[i_length_pos/8],
  1961.                     (bs_pos(s) - i_length_pos)/8 -2 );
  1962.             continue;
  1963.         }
  1964.         /* Coding of a bitmap object */
  1965.         i_update_pos = bs_pos( s );
  1966.         bs_write( s, 16, 0 ); /* topfield data block length */
  1967.         bs_write( s, 16, 0 ); /* bottomfield data block length */
  1968.         /* Top field */
  1969.         i_pixel_data_pos = bs_pos( s );
  1970.         encode_pixel_data( p_enc, s, p_region, true );
  1971.         i_pixel_data_pos = ( bs_pos( s ) - i_pixel_data_pos ) / 8;
  1972.         SetWBE( &s->p_start[i_update_pos/8], i_pixel_data_pos );
  1973.         /* Bottom field */
  1974.         i_pixel_data_pos = bs_pos( s );
  1975.         encode_pixel_data( p_enc, s, p_region, false );
  1976.         i_pixel_data_pos = ( bs_pos( s ) - i_pixel_data_pos ) / 8;
  1977.         SetWBE( &s->p_start[i_update_pos/8+2], i_pixel_data_pos );
  1978.         /* Stuffing for word alignment */
  1979.         bs_align_0( s );
  1980.         if( bs_pos( s ) % 16 ) bs_write( s, 8, 0 );
  1981.         /* Update segment length */
  1982.         SetWBE( &s->p_start[i_length_pos/8], (bs_pos(s) - i_length_pos)/8 -2 );
  1983.     }
  1984. }
  1985. static void encode_pixel_line_2bp( bs_t *s, subpicture_region_t *p_region,
  1986.                                    int i_line );
  1987. static void encode_pixel_line_4bp( bs_t *s, subpicture_region_t *p_region,
  1988.                                    int i_line );
  1989. static void encode_pixel_line_8bp( bs_t *s, subpicture_region_t *p_region,
  1990.                                    int i_line );
  1991. static void encode_pixel_data( encoder_t *p_enc, bs_t *s,
  1992.                                subpicture_region_t *p_region,
  1993.                                bool b_top )
  1994. {
  1995.     unsigned int i_line;
  1996.     /* Sanity check */
  1997.     if( p_region->fmt.i_chroma != VLC_FOURCC('Y','U','V','P') ) return;
  1998.     /* Encode line by line */
  1999.     for( i_line = !b_top; i_line < p_region->fmt.i_visible_height;
  2000.          i_line += 2 )
  2001.     {
  2002.         switch( p_region->fmt.p_palette->i_entries )
  2003.         {
  2004.         case 0:
  2005.             break;
  2006.         case 4:
  2007.             bs_write( s, 8, 0x10 ); /* 2 bit/pixel code string */
  2008.             encode_pixel_line_2bp( s, p_region, i_line );
  2009.             break;
  2010.         case 16:
  2011.             bs_write( s, 8, 0x11 ); /* 4 bit/pixel code string */
  2012.             encode_pixel_line_4bp( s, p_region, i_line );
  2013.             break;
  2014.         case 256:
  2015.             bs_write( s, 8, 0x12 ); /* 8 bit/pixel code string */
  2016.             encode_pixel_line_8bp( s, p_region, i_line );
  2017.             break;
  2018.         default:
  2019.             msg_Err( p_enc, "subpicture palette (%i) not handled",
  2020.                      p_region->fmt.p_palette->i_entries );
  2021.             break;
  2022.         }
  2023.         bs_write( s, 8, 0xf0 ); /* End of object line code */
  2024.     }
  2025. }
  2026. static void encode_pixel_line_2bp( bs_t *s, subpicture_region_t *p_region,
  2027.                                    int i_line )
  2028. {
  2029.     unsigned int i, i_length = 0;
  2030.     int i_pitch = p_region->p_picture->p->i_pitch;
  2031.     uint8_t *p_data = &p_region->p_picture->p->p_pixels[ i_pitch * i_line ];
  2032.     int i_last_pixel = p_data[0];
  2033.     for( i = 0; i <= p_region->fmt.i_visible_width; i++ )
  2034.     {
  2035.         if( ( i != p_region->fmt.i_visible_width ) &&
  2036.             ( p_data[i] == i_last_pixel ) && ( i_length != 284 ) )
  2037.         {
  2038.             i_length++;
  2039.             continue;
  2040.         }
  2041.         if( ( i_length == 1 ) || ( i_length == 11 ) || ( i_length == 28 ) )
  2042.         {
  2043.             /* 2bit/pixel code */
  2044.             if( i_last_pixel )
  2045.                 bs_write( s, 2, i_last_pixel );
  2046.             else
  2047.             {
  2048.                 bs_write( s, 2, 0 );
  2049.                 bs_write( s, 1, 0 );
  2050.                 bs_write( s, 1, 1 ); /* pseudo color 0 */
  2051.             }
  2052.             i_length--;
  2053.         }
  2054.         if( i_length == 2 )
  2055.         {
  2056.             if( i_last_pixel )
  2057.             {
  2058.                 bs_write( s, 2, i_last_pixel );
  2059.                 bs_write( s, 2, i_last_pixel );
  2060.             }
  2061.             else
  2062.             {
  2063.                 bs_write( s, 2, 0 );
  2064.                 bs_write( s, 1, 0 );
  2065.                 bs_write( s, 1, 0 );
  2066.                 bs_write( s, 2, 1 ); /* 2 * pseudo color 0 */
  2067.             }
  2068.         }
  2069.         else if( i_length > 2 )
  2070.         {
  2071.             bs_write( s, 2, 0 );
  2072.             if( i_length <= 10 )
  2073.             {
  2074.                 bs_write( s, 1, 1 );
  2075.                 bs_write( s, 3, i_length - 3 );
  2076.                 bs_write( s, 2, i_last_pixel );
  2077.             }
  2078.             else
  2079.             {
  2080.                 bs_write( s, 1, 0 );
  2081.                 bs_write( s, 1, 0 );
  2082.                 if( i_length <= 27 )
  2083.                 {
  2084.                     bs_write( s, 2, 2 );
  2085.                     bs_write( s, 4, i_length - 12 );
  2086.                     bs_write( s, 2, i_last_pixel );
  2087.                 }
  2088.                 else
  2089.                 {
  2090.                     bs_write( s, 2, 3 );
  2091.                     bs_write( s, 8, i_length - 29 );
  2092.                     bs_write( s, 2, i_last_pixel );
  2093.                 }
  2094.             }
  2095.         }
  2096.         if( i == p_region->fmt.i_visible_width ) break;
  2097.         i_last_pixel = p_data[i];
  2098.         i_length = 1;
  2099.     }
  2100.     /* Stop */
  2101.     bs_write( s, 2, 0 );
  2102.     bs_write( s, 1, 0 );
  2103.     bs_write( s, 1, 0 );
  2104.     bs_write( s, 2, 0 );
  2105.     /* Stuffing */
  2106.     bs_align_0( s );
  2107. }
  2108. static void encode_pixel_line_4bp( bs_t *s, subpicture_region_t *p_region,
  2109.                                    int i_line )
  2110. {
  2111.     unsigned int i, i_length = 0;
  2112.     int i_pitch = p_region->p_picture->p->i_pitch;
  2113.     uint8_t *p_data = &p_region->p_picture->p->p_pixels[ i_pitch * i_line ];
  2114.     int i_last_pixel = p_data[0];
  2115.     for( i = 0; i <= p_region->fmt.i_visible_width; i++ )
  2116.     {
  2117.         if( i != p_region->fmt.i_visible_width &&
  2118.             p_data[i] == i_last_pixel && i_length != 280 )
  2119.         {
  2120.             i_length++;
  2121.             continue;
  2122.         }
  2123.         if( ( i_length == 1 ) ||
  2124.             ( ( i_length == 3 ) && i_last_pixel ) ||
  2125.             ( i_length == 8 ) )
  2126.         {
  2127.             /* 4bit/pixel code */
  2128.             if( i_last_pixel )
  2129.                 bs_write( s, 4, i_last_pixel );
  2130.             else
  2131.             {
  2132.                 bs_write( s, 4, 0 );
  2133.                 bs_write( s, 1, 1 );
  2134.                 bs_write( s, 1, 1 );
  2135.                 bs_write( s, 2, 0 ); /* pseudo color 0 */
  2136.             }
  2137.             i_length--;
  2138.         }
  2139.         if( i_length == 2 )
  2140.         {
  2141.             if( i_last_pixel )
  2142.             {
  2143.                 bs_write( s, 4, i_last_pixel );
  2144.                 bs_write( s, 4, i_last_pixel );
  2145.             }
  2146.             else
  2147.             {
  2148.                 bs_write( s, 4, 0 );
  2149.                 bs_write( s, 1, 1 );
  2150.                 bs_write( s, 1, 1 );
  2151.                 bs_write( s, 2, 1 ); /* 2 * pseudo color 0 */
  2152.             }
  2153.         }
  2154.         else if( !i_last_pixel && ( i_length >= 3 ) && ( i_length <= 9 ) )
  2155.         {
  2156.             bs_write( s, 4, 0 );
  2157.             bs_write( s, 1, 0 );
  2158.             bs_write( s, 3, i_length - 2 ); /* (i_length - 2) * color 0 */
  2159.         }
  2160.         else if( i_length > 2 )
  2161.         {
  2162.             bs_write( s, 4, 0 );
  2163.             bs_write( s, 1, 1 );
  2164.             if( i_length <= 7 )
  2165.             {
  2166.                 bs_write( s, 1, 0 );
  2167.                 bs_write( s, 2, i_length - 4 );
  2168.                 bs_write( s, 4, i_last_pixel );
  2169.             }
  2170.             else
  2171.             {
  2172.                 bs_write( s, 1, 1 );
  2173.                 if( i_length <= 24 )
  2174.                 {
  2175.                     bs_write( s, 2, 2 );
  2176.                     bs_write( s, 4, i_length - 9 );
  2177.                     bs_write( s, 4, i_last_pixel );
  2178.                 }
  2179.                 else
  2180.                 {
  2181.                     bs_write( s, 2, 3 );
  2182.                     bs_write( s, 8, i_length - 25 );
  2183.                     bs_write( s, 4, i_last_pixel );
  2184.                 }
  2185.             }
  2186.         }
  2187.         if( i == p_region->fmt.i_visible_width ) break;
  2188.         i_last_pixel = p_data[i];
  2189.         i_length = 1;
  2190.     }
  2191.     /* Stop */
  2192.     bs_write( s, 8, 0 );
  2193.     /* Stuffing */
  2194.     bs_align_0( s );
  2195. }
  2196. static void encode_pixel_line_8bp( bs_t *s, subpicture_region_t *p_region,
  2197.                                    int i_line )
  2198. {
  2199.     unsigned int i, i_length = 0;
  2200.     int i_pitch = p_region->p_picture->p->i_pitch;
  2201.     uint8_t *p_data = &p_region->p_picture->p->p_pixels[ i_pitch * i_line ];
  2202.     int i_last_pixel = p_data[0];
  2203.     for( i = 0; i <= p_region->fmt.i_visible_width; i++ )
  2204.     {
  2205.         if( ( i != p_region->fmt.i_visible_width ) &&
  2206.             ( p_data[i] == i_last_pixel ) && ( i_length != 127 ) )
  2207.         {
  2208.             i_length++;
  2209.             continue;
  2210.         }
  2211.         if( ( i_length == 1 ) && i_last_pixel )
  2212.         {
  2213.             /* 8bit/pixel code */
  2214.             bs_write( s, 8, i_last_pixel );
  2215.         }
  2216.         else if( ( i_length == 2 ) && i_last_pixel )
  2217.         {
  2218.             /* 8bit/pixel code */
  2219.             bs_write( s, 8, i_last_pixel );
  2220.             bs_write( s, 8, i_last_pixel );
  2221.         }
  2222.         else if( i_length <= 127 )
  2223.         {
  2224.             bs_write( s, 8, 0 );
  2225.             if( !i_last_pixel )
  2226.             {
  2227.                 bs_write( s, 1, 0 );
  2228.                 bs_write( s, 7, i_length ); /* pseudo color 0 */
  2229.             }
  2230.             else
  2231.             {
  2232.                 bs_write( s, 1, 1 );
  2233.                 bs_write( s, 7, i_length );
  2234.                 bs_write( s, 8, i_last_pixel );
  2235.             }
  2236.         }
  2237.         if( i == p_region->fmt.i_visible_width ) break;
  2238.         i_last_pixel = p_data[i];
  2239.         i_length = 1;
  2240.     }
  2241.     /* Stop */
  2242.     bs_write( s, 8, 0 );
  2243.     bs_write( s, 8, 0 );
  2244.     /* Stuffing */
  2245.     bs_align_0( s );
  2246. }