* dvbsub.c : DVB subtitles decoder thread
*****************************************************************************
* Copyright (C) 2003 ANEVIA
- * Copyright (C) 2003 VideoLAN
- * $Id: dvbsub.c,v 1.10 2004/03/02 13:53:13 kuehne Exp $
+ * Copyright (C) 2003-2004 VideoLAN
+ * $Id$
*
* Authors: Damien LUCAS <damien.lucas@anevia.com>
* Laurent Aimar <fenrir@via.ecp.fr>
set_callbacks( Open, Close );
vlc_module_end();
-
-// Wow, that's ugly but very usefull for a memory leak track
-// so I just keep it
-#if 0
-static long long unsigned int trox_malloc_nb = 0;
-static long long unsigned int trox_free_nb = 0;
-
-static void* trox_malloc (size_t size)
-{ ++trox_malloc_nb; return malloc (size); }
-
-static void trox_free (void* ptr)
-{ ++trox_free_nb; free(ptr); return; }
-
-static void trox_call ()
-{
- fprintf(stderr, "dvbbsub -- Memory usage: %llu mallocs %llu frees (%llu)\n",
- trox_malloc_nb,
- trox_free_nb,
- trox_malloc_nb - trox_free_nb);
- return;
-}
-#else
-# define trox_malloc malloc
-# define trox_free free
-# define trox_call()
-#endif
/****************************************************************************
* Local structures
****************************************************************************
uint16_t i_cols[576];
dvbsub_rle_t* p_last;
dvbsub_rle_t* p_codes;
+
} dvbsub_image_t;
/* The object definition gives the position of the object in a region */
uint8_t i_fg_pc;
uint8_t i_bg_pc;
struct dvbsub_objectdef_s* p_next;
+
} dvbsub_objectdef_t;
/* The Region is an aera on the image
uint8_t i_8bp_code;
uint8_t i_4bp_code;
uint8_t i_2bp_code;
- dvbsub_objectdef_t* p_object;
+ dvbsub_objectdef_t* p_object;
+
} dvbsub_region_t;
/* The page defines the list of regions */
uint8_t i_version_number;
uint8_t i_regions_number;
dvbsub_region_t* regions;
+
} dvbsub_page_t;
/* An object is constituted of 2 images (for interleaving) */
dvbsub_image_t* topfield;
dvbsub_image_t* bottomfield;
struct dvbsub_object_s* p_next;
+
} dvbsub_object_t;
/* The entry in the palette CLUT */
uint8_t Cr;
uint8_t Cb;
uint8_t T;
+
} dvbsub_color_t;
/* */
dvbsub_color_t c_2b[0xff];
dvbsub_color_t c_4b[0xff];
dvbsub_color_t c_8b[0xff];
+
} dvbsub_clut_t;
typedef struct
uint16_t i_y;
dvbsub_image_t* p_rle_top;
dvbsub_image_t* p_rle_bot;
+
} dvbsub_render_t;
typedef struct
dvbsub_page_t* p_page;
dvbsub_object_t* p_objects;
subpicture_t* p_spu[16];
+
} dvbsub_all_t;
struct subpicture_sys_t
static vout_thread_t *FindVout( decoder_t * );
-static int dvbsub_init( dvbsub_all_t *, int );
-static void dvbsub_decode_segment( dvbsub_all_t *p_dvbsub, bs_t *s );
-static void dvbsub_render( dvbsub_all_t *, vout_thread_t * );
-static void dvbsub_clean( dvbsub_all_t * );
-
+static int init( dvbsub_all_t *, int );
+static void decode_segment( decoder_t *, dvbsub_all_t *, bs_t * );
+static void render( dvbsub_all_t *, vout_thread_t * );
+static void dvbsub( dvbsub_all_t * );
/*****************************************************************************
* Open: probe the decoder and return score
}
p_dec->pf_decode_sub = Decode;
- p_sys = p_dec->p_sys = malloc( sizeof( decoder_sys_t ) );
+ p_sys = p_dec->p_sys = malloc( sizeof(decoder_sys_t) );
p_sys->p_vout = NULL;
- dvbsub_init( &p_sys->dvbsub, p_dec->fmt_in.subs.dvb.i_id );
+ init( &p_sys->dvbsub, p_dec->fmt_in.subs.dvb.i_id );
es_format_Init( &p_dec->fmt_out, SPU_ES, VLC_FOURCC( 'd','v','b','s' ) );
{
p_subpic = &p_sys->p_vout->p_subpicture[i_subpic];
if( p_subpic != NULL &&
- ( ( p_subpic->i_status == RESERVED_SUBPICTURE ) ||
- ( p_subpic->i_status == READY_SUBPICTURE ) ) )
+ ( p_subpic->i_status == RESERVED_SUBPICTURE ||
+ p_subpic->i_status == READY_SUBPICTURE ) )
{
vout_DestroySubPicture( p_sys->p_vout, p_subpic );
}
}
}
- dvbsub_clean( &p_sys->dvbsub );
+ dvbsub( &p_sys->dvbsub );
free( p_sys );
}
{
break;
}
- dvbsub_decode_segment( &p_sys->dvbsub, &p_sys->bs );
+ decode_segment( p_dec, &p_sys->dvbsub, &p_sys->bs );
}
i_end_data_marker = bs_read( &p_sys->bs, 8 );
/* Check if the page is to be displayed */
if( p_sys->dvbsub.p_page && p_sys->dvbsub.p_objects )
{
- dvbsub_render( &p_sys->dvbsub, p_sys->p_vout );
+ render( &p_sys->dvbsub, p_sys->p_vout );
}
vlc_object_release( p_sys->p_vout );
}
}
-
-static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
+static int init( dvbsub_all_t *p_dvbsub, int i_id )
{
int i;
p_dvbsub->i_pts = 0;
p_dvbsub->i_id = i_id;
- p_dvbsub->p_page = NULL;
- p_dvbsub->p_objects = NULL;
+ p_dvbsub->p_page = NULL;
+ p_dvbsub->p_objects = NULL;
for( i = 0; i < 255; i++ )
{
p_dvbsub->p_clut[i] = NULL;
static void free_all( dvbsub_all_t * );
-static void dvbsub_clean( dvbsub_all_t *p_dvbsub )
+static void dvbsub( dvbsub_all_t *p_dvbsub )
{
free_all( p_dvbsub );
- trox_call() ;
}
+static void decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s );
+static void decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s);
+static void decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s );
+static void stop_display( dvbsub_all_t* p_dvbsub );
+static void decode_object( dvbsub_all_t *p_dvbsub, bs_t *s );
-static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s );
-static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s);
-static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s );
-static void dvbsub_stop_display( dvbsub_all_t* p_dvbsub );
-static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s );
-
-static void free_page (dvbsub_page_t* p_p);
+static void free_page( dvbsub_page_t* p_p );
-static void dvbsub_decode_segment( dvbsub_all_t *p_dvbspu, bs_t *s )
+static void decode_segment( decoder_t *p_dec, dvbsub_all_t *p_dvbspu, bs_t *s )
{
int i_type;
int i_page_id;
switch( i_type )
{
- case DVBSUB_ST_CLUT_DEFINITION:
- dvbsub_decode_clut( p_dvbspu, s );
- break;
- case DVBSUB_ST_PAGE_COMPOSITION:
- dvbsub_decode_page_composition( p_dvbspu, s );
- break;
- case DVBSUB_ST_REGION_COMPOSITION:
- dvbsub_decode_region_composition( p_dvbspu, s );
- break;
- case DVBSUB_ST_OBJECT_DATA:
- dvbsub_decode_object( p_dvbspu, s );
- break;
- case DVBSUB_ST_ENDOFDISPLAY:
- dvbsub_stop_display( p_dvbspu );
- break;
- case DVBSUB_ST_STUFFING:
- default:
- fprintf( stderr, "DVBSUB - Unsupported segment type : (%04x)",
- i_type );
- bs_skip( s, 8 * ( 2 + i_size ) );
- break;
+ case DVBSUB_ST_CLUT_DEFINITION:
+#ifdef DEBUG_DVBSUB
+ msg_Dbg( p_dec, "subtitle dvbsub_decode_clut" );
+#endif
+ decode_clut( p_dvbspu, s );
+ break;
+ case DVBSUB_ST_PAGE_COMPOSITION:
+#ifdef DEBUG_DVBSUB
+ msg_Dbg( p_dec, "subtitle dvbsub_decode_page_composition" );
+#endif
+ decode_page_composition( p_dvbspu, s );
+ break;
+ case DVBSUB_ST_REGION_COMPOSITION:
+#ifdef DEBUG_DVBSUB
+ msg_Dbg( p_dec, "subtitle dvbsub_decode_region_composition" );
+#endif
+ decode_region_composition( p_dvbspu, s );
+ break;
+ case DVBSUB_ST_OBJECT_DATA:
+#ifdef DEBUG_DVBSUB
+ msg_Dbg( p_dec, "subtitle dvbsub_decode_object" );
+#endif
+ decode_object( p_dvbspu, s );
+ break;
+ case DVBSUB_ST_ENDOFDISPLAY:
+#ifdef DEBUG_DVBSUB
+ msg_Dbg( p_dec, "subtitle dvbsub_stop_display" );
+#endif
+ stop_display( p_dvbspu );
+ break;
+ case DVBSUB_ST_STUFFING:
+ default:
+ msg_Warn( p_dec, "unsupported segment type: (%04x)", i_type );
+ bs_skip( s, 8 * ( 2 + i_size ) );
+ break;
}
}
-static void dvbsub_stop_display( dvbsub_all_t *p_dvbsub )
+static void stop_display( dvbsub_all_t *p_dvbsub )
{
int i;
}
}
-static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
+static void decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
{
uint16_t i_segment_length;
uint16_t i_processed_length;
}
else
{
- p_dvbsub->p_clut[i_clut_id] = trox_malloc( sizeof(dvbsub_clut_t) );
+ p_dvbsub->p_clut[i_clut_id] = malloc( sizeof(dvbsub_clut_t) );
}
clut = p_dvbsub->p_clut[i_clut_id];
- /* We don't have this version of the CLUT:
- * Parse it */
+ /* We don't have this version of the CLUT: Parse it */
clut->i_version_number = i_version_number;
bs_skip( s, 4 ); /* Reserved bits */
i_processed_length = 2;
}
}
-static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
+static void decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
{
unsigned int i_version_number;
unsigned int i_state;
i_segment_length = bs_read( s, 16 );
/* A page is composed by one or more region: */
- i_timeout = bs_read( s, 8 );
- i_version_number = bs_read( s, 4 );
- i_state = bs_read( s, 2 );
+ i_timeout = bs_read( s, 8 );
+ i_version_number = bs_read( s, 4 );
+ i_state = bs_read( s, 2 );
/* TODO We assume it is a new page (i_state) */
if( p_dvbsub->p_page ) free_page( p_dvbsub->p_page );
bs_skip( s, 2 ); /* Reserved */
/* Allocate a new page */
- p_dvbsub->p_page = trox_malloc( sizeof(dvbsub_page_t) );
+ p_dvbsub->p_page = malloc( sizeof(dvbsub_page_t) );
p_dvbsub->p_page->i_timeout = i_timeout;
/* Number of regions: */
p_dvbsub->p_page->i_regions_number = (i_segment_length-2) / 6;
- /* Special workaround for CAVENA encoders
- * a page with no regions is sent instead of a 0x80 packet (End Of Display) */
+ /* Special workaround for CAVENA encoders: a page with no regions is sent
+ * instead of a 0x80 packet (End Of Display) */
if( p_dvbsub->p_page->i_regions_number == 0 )
{
- dvbsub_stop_display( p_dvbsub );
+ stop_display( p_dvbsub );
}
- /* /Special workaround */
+ /* End of workaround */
p_dvbsub->p_page->regions =
- trox_malloc(p_dvbsub->p_page->i_regions_number*sizeof(dvbsub_region_t));
+ malloc( p_dvbsub->p_page->i_regions_number * sizeof(dvbsub_region_t) );
for( i = 0; i < p_dvbsub->p_page->i_regions_number; i++ )
{
p_dvbsub->p_page->regions[i].i_id = bs_read( s, 8 );
}
-static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
+static void decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
{
dvbsub_region_t* p_region = NULL;
unsigned int i_segment_length;
while( i_processed_length < i_segment_length )
{
/* We create a new object */
- dvbsub_objectdef_t *p_obj = trox_malloc(sizeof(dvbsub_objectdef_t));
+ dvbsub_objectdef_t *p_obj = malloc( sizeof(dvbsub_objectdef_t) );
/* We parse object properties */
p_obj->p_next = NULL;
}
}
-static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint16_t length );
-static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p, dvbsub_image_t* p_image);
+static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s,
+ uint16_t length );
+static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p,
+ dvbsub_image_t* p_image);
-static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
+static void decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
{
dvbsub_object_t *p_obj;
uint16_t i_segment_length;
/* Memory Allocation */
- p_obj = trox_malloc ( sizeof ( dvbsub_object_t ) );
+ p_obj = malloc( sizeof(dvbsub_object_t) );
p_obj->p_next = NULL;
i_segment_length = bs_read( s, 16 );
if( p_obj->i_coding_method == 0x00 )
{
- uint16_t i_topfield_length;
- uint16_t i_bottomfield_length;
+ uint16_t i_topfield_length;
+ uint16_t i_bottomfield_length;
- i_topfield_length = bs_read( s, 16 );
- i_bottomfield_length= bs_read( s, 16 );
+ i_topfield_length = bs_read( s, 16 );
+ i_bottomfield_length = bs_read( s, 16 );
- p_obj->topfield = dvbsub_parse_pdata( p_dvbsub, s, i_topfield_length );
- p_obj->bottomfield = dvbsub_parse_pdata( p_dvbsub, s, i_bottomfield_length );
+ p_obj->topfield =
+ dvbsub_parse_pdata( p_dvbsub, s, i_topfield_length );
+ p_obj->bottomfield =
+ dvbsub_parse_pdata( p_dvbsub, s, i_bottomfield_length );
}
else
{
bs_skip( s, (i_segment_length - 3 ) * 8 );
- /*TODO
- * DVB subtitling as characters */
+ /*TODO: DVB subtitling as characters */
}
/* Add this object to the list of the page */
p_dvbsub->p_objects = p_obj;
}
-static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint16_t length )
+static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s,
+ uint16_t length )
{
dvbsub_image_t* p_image;
- uint16_t i_processed_length=0;
- uint16_t i_lines=0;
- uint16_t i_cols_last=0;
+ uint16_t i_processed_length = 0;
+ uint16_t i_lines = 0;
+ uint16_t i_cols_last = 0;
- p_image = trox_malloc ( sizeof ( dvbsub_image_t) );
- p_image->p_last=NULL;
+ p_image = malloc( sizeof(dvbsub_image_t) );
+ p_image->p_last = NULL;
- memset(p_image->i_cols, 0, 576*sizeof(uint16_t));
+ memset( p_image->i_cols, 0, 576 * sizeof(uint16_t) );
/* Let's parse it a first time to determine the size of the buffer */
while( i_processed_length < length)
return p_image;
}
-
-
static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color )
{
if(p->p_last != NULL)
{
- p->p_last->p_next = trox_malloc (sizeof (dvbsub_rle_t));
+ p->p_last->p_next = malloc( sizeof(dvbsub_rle_t) );
p->p_last = p->p_last->p_next;
}
else
{
- p->p_codes = trox_malloc (sizeof (dvbsub_rle_t));
+ p->p_codes = malloc( sizeof(dvbsub_rle_t) );
p->p_last = p->p_codes;
}
p->p_last->i_num = num;
p->p_last->p_next = NULL;
}
-
-static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p, dvbsub_image_t* p_image )
+static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p,
+ dvbsub_image_t* p_image )
{
uint16_t i_processed=0;
vlc_bool_t b_stop=0;
for( p1 = p_i->p_codes; p1 != NULL; p1=p2)
{
p2=p1->p_next;
- trox_free(p1);
+ free(p1);
p1=NULL;
}
- trox_free(p_i);
+ free(p_i);
}
static void free_object (dvbsub_object_t* p_o)
{
- trox_free(p_o);
+ free(p_o);
}
static void free_objectdefs ( dvbsub_objectdef_t* p_o)
for( p1 = p_o; p1 != NULL; p1=p2)
{
p2=p1->p_next;
- trox_free(p1);
+ free(p1);
p1=NULL;
}
}
unsigned int i;
for (i = 0; i<nb; i++) free_objectdefs ( p_r[i].p_object );
- trox_free (p_r);
+ free (p_r);
p_r = NULL;
}
static void free_clut ( dvbsub_clut_t* p_c )
{
- trox_free(p_c);
+ free(p_c);
}
static void free_page (dvbsub_page_t* p_p)
{
free_regions (p_p->regions, p_p->i_regions_number);
- trox_free(p_p);
+ free(p_p);
p_p = NULL;
}
{
free_image(((dvbsub_render_t *)p_spu->p_sys->p_data)->p_rle_top);
free_image(((dvbsub_render_t *)p_spu->p_sys->p_data)->p_rle_bot);
- trox_free(p_spu->p_sys->p_data);
- trox_free( p_spu->p_sys );
+ free(p_spu->p_sys->p_data);
+ free( p_spu->p_sys );
p_spu->p_sys = NULL;
}
}
//let's render the 1st frame
for(p_c = p_im->p_codes; p_c->p_next != NULL; p_c=p_c->p_next)
{
-// if( p_c->y != 0 && p_c->t < 0x20)
+ //if( p_c->y != 0 && p_c->t < 0x20)
if( p_c->y != 0 && p_c->t < 0x20)
{
x = j+ p_r->i_x;
for( i_cnt = 0; i_cnt < p_c->i_num; i_cnt+=2 )
{
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt, p_c->y, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
}
}
j += p_c->i_num;
for( i_cnt = 0; i_cnt < p_c->i_num; i_cnt+=2 )
{
memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt, p_c->y, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
- // memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+1, p_c->cr, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+2, p_c->y, 1);
+ //memset(p_desty+ y*p_pic->Y_PITCH + 2*x + i_cnt+3, p_c->cb, 1);
}
}
j += p_c->i_num;
}
}
-
static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
const subpicture_t *p_spu )
{
x = j+ p_r->i_x;
y = 2*i+p_r->i_y;
//memset(p_dest+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
-// memset(p_desty+ (y)*p_pic->Y_PITCH + x, p_c->cr, p_c->i_num);
+ //memset(p_desty+ (y)*p_pic->Y_PITCH + x, p_c->cr, p_c->i_num);
//memset(p_dest+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
//memset(p_destu+ (y)*p_pic->Y_PITCH + x, p_c->cb, p_c->i_num);
memset(p_desty+ y*p_pic->Y_PITCH + x, p_c->y, p_c->i_num);
- // memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
- // memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
+ //memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
+ //memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
}
j += p_c->i_num;
if(j >= p_im->i_cols[i])
{
x = j+ p_r->i_x;
y = 2*i+1+p_r->i_y;
-// memset(p_desty+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
-// memset(p_desty+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
+ //memset(p_desty+ y*p_pic->U_PITCH*2 + x, p_c->cr, p_c->i_num);
+ //memset(p_desty+ y*p_pic->V_PITCH*2 + x, p_c->cb, p_c->i_num);
memset(p_desty+ y*p_pic->Y_PITCH + x, p_c->y, p_c->i_num);
-// memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
-// memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
+ //memset(p_desty+ 2*y*p_pic->U_PITCH + x, p_c->cr, p_c->i_num);
+ //memset(p_desty+ 2*y*p_pic->V_PITCH + x, p_c->cb, p_c->i_num);
}
j += p_c->i_num;
if(j >= p_im->i_cols[i])
}
}
-static void dvbsub_RenderDVBSUB( vout_thread_t *p_vout, picture_t *p_pic,
- const subpicture_t *p_spu )
+static void RenderDVBSUB( vout_thread_t *p_vout, picture_t *p_pic,
+ const subpicture_t *p_spu )
{
/* If we have changed the language on the fly */
free_spu( p_spu );
}
-static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
+static void render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
{
dvbsub_region_t* p_region;
dvbsub_objectdef_t* p_objectdef;
dvbsub_object_t* p_object_old;
dvbsub_render_t* p_render;
dvbsub_rle_t* p_c;
- uint8_t i,j;
- j=0;
+ uint8_t i , j = 0;
/* loop on regions */
for( i = 0; i < dvbsub->p_page->i_regions_number; i++ )
p_region = &(dvbsub->p_page->regions[i]);
/* loop on objects */
- for(p_objectdef = p_region->p_object; p_objectdef != NULL; p_objectdef = p_objectdef->p_next )
+ for( p_objectdef = p_region->p_object; p_objectdef != NULL;
+ p_objectdef = p_objectdef->p_next )
{
/* Look for the right object */
p_object = dvbsub->p_objects;
- while((p_object!=NULL) && (p_object->i_id != p_objectdef->i_id))
+ while( !p_object && p_object->i_id != p_objectdef->i_id )
{
p_object = p_object->p_next;
}
- if(p_object==NULL)
+ if( !p_object )
{
- msg_Err(p_vout, "internal DvbSub decoder error");
+ msg_Err( p_vout, "internal decoder error");
return;
}
/* Allocate the render structure */
- p_render = trox_malloc(sizeof(dvbsub_render_t));
+ p_render = malloc( sizeof(dvbsub_render_t) );
p_render->i_x = p_region->i_x + p_objectdef->i_xoffset;
p_render->i_y = p_region->i_y + p_objectdef->i_yoffset;
p_render->p_rle_top = p_object->topfield;
p_render->p_rle_bot = p_object->bottomfield;
// if we did not recieved the CLUT yet
- if ( !dvbsub->p_clut[p_region->i_clut] ) return;
+ if( !dvbsub->p_clut[p_region->i_clut] ) return;
/* Compute the color datas according to the appropriate CLUT */
- for(p_c=p_render->p_rle_top->p_codes;p_c->p_next!=NULL; p_c=p_c->p_next)
+ for( p_c = p_render->p_rle_top->p_codes;
+ p_c->p_next != NULL; p_c = p_c->p_next )
{
//TODO We assume here we are working in 4bp
- p_c->y=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Y;
- p_c->cr=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cr;
- p_c->cb=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cb;
- p_c->t=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].T;
+ p_c->y = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Y;
+ p_c->cr = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cr;
+ p_c->cb = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cb;
+ p_c->t = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].T;
}
- for(p_c=p_render->p_rle_bot->p_codes;p_c->p_next!=NULL; p_c=p_c->p_next)
+ for( p_c = p_render->p_rle_bot->p_codes; p_c->p_next != NULL;
+ p_c = p_c->p_next )
{
//TODO We assume here we are working in 4bp
- p_c->y=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Y;
- p_c->cr=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cr;
- p_c->cb=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cb;
- p_c->t=dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].T;
+ p_c->y = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Y;
+ p_c->cr = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cr;
+ p_c->cb = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].Cb;
+ p_c->t = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].T;
}
/* Allocate the subpicture internal data. */
- dvbsub->p_spu[j] = vout_CreateSubPicture( p_vout, MEMORY_SUBPICTURE );
+ dvbsub->p_spu[j] =
+ vout_CreateSubPicture( p_vout, MEMORY_SUBPICTURE );
if( dvbsub->p_spu[j] == NULL )
{
msg_Err(p_vout, "Unable to allocate memory, skipping");
return;
}
/* Set the pf_render callback */
- dvbsub->p_spu[j]->pf_render = dvbsub_RenderDVBSUB;
- dvbsub->p_spu[j]->p_sys = trox_malloc( sizeof( subpicture_sys_t ));
+ dvbsub->p_spu[j]->pf_render = RenderDVBSUB;
+ dvbsub->p_spu[j]->p_sys = malloc( sizeof(subpicture_sys_t) );
dvbsub->p_spu[j]->p_sys->p_data = p_render;
- dvbsub->p_spu[j]->p_sys->b_obsolete=0;
+ dvbsub->p_spu[j]->p_sys->b_obsolete = 0;
dvbsub->p_spu[j]->pf_destroy = dvbsub_Destroy;
dvbsub->p_spu[j]->i_start = dvbsub->i_pts;
- dvbsub->p_spu[j]->i_stop = dvbsub->p_spu[j]->i_start + dvbsub->p_page->i_timeout*1000000;
+ dvbsub->p_spu[j]->i_stop = dvbsub->p_spu[j]->i_start +
+ dvbsub->p_page->i_timeout * 1000000;
dvbsub->p_spu[j]->b_ephemer = VLC_FALSE;
// At this stage, we have all we need in p_render
// We need to free the object
//Remove this object from the list
p_object_old = p_object;
- if(p_object == dvbsub->p_objects)
- dvbsub->p_objects = p_object->p_next;
+ if( p_object == dvbsub->p_objects )
+ {
+ dvbsub->p_objects = p_object->p_next;
+ }
else
{
- for(p_o = dvbsub->p_objects; p_o->p_next != p_object; p_o=p_o->p_next);
- p_o->p_next = p_object->p_next;
+ for( p_o = dvbsub->p_objects; p_o->p_next != p_object;
+ p_o = p_o->p_next );
+ p_o->p_next = p_object->p_next;
}
free_object(p_object_old);
}
}
}
-