Commit d0ed0d4b authored by Gildas Bazin's avatar Gildas Bazin

* modules/codec/dvbsub.c: coding style changes.

parent 81333241
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* dvbsub.c : DVB subtitles decoder thread * dvbsub.c : DVB subtitles decoder thread
***************************************************************************** *****************************************************************************
* Copyright (C) 2003 ANEVIA * Copyright (C) 2003 ANEVIA
* Copyright (C) 2003 VideoLAN * Copyright (C) 2003-2004 VideoLAN
* $Id: dvbsub.c,v 1.10 2004/03/02 13:53:13 kuehne Exp $ * $Id$
* *
* Authors: Damien LUCAS <damien.lucas@anevia.com> * Authors: Damien LUCAS <damien.lucas@anevia.com>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -43,32 +43,6 @@ vlc_module_begin(); ...@@ -43,32 +43,6 @@ vlc_module_begin();
set_callbacks( Open, Close ); set_callbacks( Open, Close );
vlc_module_end(); 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 * Local structures
**************************************************************************** ****************************************************************************
...@@ -97,6 +71,7 @@ typedef struct ...@@ -97,6 +71,7 @@ typedef struct
uint16_t i_cols[576]; uint16_t i_cols[576];
dvbsub_rle_t* p_last; dvbsub_rle_t* p_last;
dvbsub_rle_t* p_codes; dvbsub_rle_t* p_codes;
} dvbsub_image_t; } dvbsub_image_t;
/* The object definition gives the position of the object in a region */ /* The object definition gives the position of the object in a region */
...@@ -110,6 +85,7 @@ typedef struct dvbsub_objectdef_s ...@@ -110,6 +85,7 @@ typedef struct dvbsub_objectdef_s
uint8_t i_fg_pc; uint8_t i_fg_pc;
uint8_t i_bg_pc; uint8_t i_bg_pc;
struct dvbsub_objectdef_s* p_next; struct dvbsub_objectdef_s* p_next;
} dvbsub_objectdef_t; } dvbsub_objectdef_t;
/* The Region is an aera on the image /* The Region is an aera on the image
...@@ -130,7 +106,8 @@ typedef struct dvbsub_region_s ...@@ -130,7 +106,8 @@ typedef struct dvbsub_region_s
uint8_t i_8bp_code; uint8_t i_8bp_code;
uint8_t i_4bp_code; uint8_t i_4bp_code;
uint8_t i_2bp_code; uint8_t i_2bp_code;
dvbsub_objectdef_t* p_object; dvbsub_objectdef_t* p_object;
} dvbsub_region_t; } dvbsub_region_t;
/* The page defines the list of regions */ /* The page defines the list of regions */
...@@ -142,6 +119,7 @@ typedef struct ...@@ -142,6 +119,7 @@ typedef struct
uint8_t i_version_number; uint8_t i_version_number;
uint8_t i_regions_number; uint8_t i_regions_number;
dvbsub_region_t* regions; dvbsub_region_t* regions;
} dvbsub_page_t; } dvbsub_page_t;
/* An object is constituted of 2 images (for interleaving) */ /* An object is constituted of 2 images (for interleaving) */
...@@ -154,6 +132,7 @@ typedef struct dvbsub_object_s ...@@ -154,6 +132,7 @@ typedef struct dvbsub_object_s
dvbsub_image_t* topfield; dvbsub_image_t* topfield;
dvbsub_image_t* bottomfield; dvbsub_image_t* bottomfield;
struct dvbsub_object_s* p_next; struct dvbsub_object_s* p_next;
} dvbsub_object_t; } dvbsub_object_t;
/* The entry in the palette CLUT */ /* The entry in the palette CLUT */
...@@ -163,6 +142,7 @@ typedef struct ...@@ -163,6 +142,7 @@ typedef struct
uint8_t Cr; uint8_t Cr;
uint8_t Cb; uint8_t Cb;
uint8_t T; uint8_t T;
} dvbsub_color_t; } dvbsub_color_t;
/* */ /* */
...@@ -173,6 +153,7 @@ typedef struct ...@@ -173,6 +153,7 @@ typedef struct
dvbsub_color_t c_2b[0xff]; dvbsub_color_t c_2b[0xff];
dvbsub_color_t c_4b[0xff]; dvbsub_color_t c_4b[0xff];
dvbsub_color_t c_8b[0xff]; dvbsub_color_t c_8b[0xff];
} dvbsub_clut_t; } dvbsub_clut_t;
typedef struct typedef struct
...@@ -181,6 +162,7 @@ typedef struct ...@@ -181,6 +162,7 @@ typedef struct
uint16_t i_y; uint16_t i_y;
dvbsub_image_t* p_rle_top; dvbsub_image_t* p_rle_top;
dvbsub_image_t* p_rle_bot; dvbsub_image_t* p_rle_bot;
} dvbsub_render_t; } dvbsub_render_t;
typedef struct typedef struct
...@@ -193,6 +175,7 @@ typedef struct ...@@ -193,6 +175,7 @@ typedef struct
dvbsub_page_t* p_page; dvbsub_page_t* p_page;
dvbsub_object_t* p_objects; dvbsub_object_t* p_objects;
subpicture_t* p_spu[16]; subpicture_t* p_spu[16];
} dvbsub_all_t; } dvbsub_all_t;
struct subpicture_sys_t struct subpicture_sys_t
...@@ -243,11 +226,10 @@ static void Decode ( decoder_t *, block_t ** ); ...@@ -243,11 +226,10 @@ static void Decode ( decoder_t *, block_t ** );
static vout_thread_t *FindVout( decoder_t * ); static vout_thread_t *FindVout( decoder_t * );
static int dvbsub_init( dvbsub_all_t *, int ); static int init( dvbsub_all_t *, int );
static void dvbsub_decode_segment( dvbsub_all_t *p_dvbsub, bs_t *s ); static void decode_segment( decoder_t *, dvbsub_all_t *, bs_t * );
static void dvbsub_render( dvbsub_all_t *, vout_thread_t * ); static void render( dvbsub_all_t *, vout_thread_t * );
static void dvbsub_clean( dvbsub_all_t * ); static void dvbsub( dvbsub_all_t * );
/***************************************************************************** /*****************************************************************************
* Open: probe the decoder and return score * Open: probe the decoder and return score
...@@ -266,11 +248,11 @@ static int Open( vlc_object_t *p_this ) ...@@ -266,11 +248,11 @@ static int Open( vlc_object_t *p_this )
} }
p_dec->pf_decode_sub = Decode; 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; 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' ) ); es_format_Init( &p_dec->fmt_out, SPU_ES, VLC_FOURCC( 'd','v','b','s' ) );
...@@ -293,15 +275,15 @@ static void Close( vlc_object_t *p_this ) ...@@ -293,15 +275,15 @@ static void Close( vlc_object_t *p_this )
{ {
p_subpic = &p_sys->p_vout->p_subpicture[i_subpic]; p_subpic = &p_sys->p_vout->p_subpicture[i_subpic];
if( p_subpic != NULL && if( p_subpic != NULL &&
( ( p_subpic->i_status == RESERVED_SUBPICTURE ) || ( p_subpic->i_status == RESERVED_SUBPICTURE ||
( p_subpic->i_status == READY_SUBPICTURE ) ) ) p_subpic->i_status == READY_SUBPICTURE ) )
{ {
vout_DestroySubPicture( p_sys->p_vout, p_subpic ); vout_DestroySubPicture( p_sys->p_vout, p_subpic );
} }
} }
} }
dvbsub_clean( &p_sys->dvbsub ); dvbsub( &p_sys->dvbsub );
free( p_sys ); free( p_sys );
} }
...@@ -346,14 +328,14 @@ static void Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -346,14 +328,14 @@ static void Decode( decoder_t *p_dec, block_t **pp_block )
{ {
break; 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 ); i_end_data_marker = bs_read( &p_sys->bs, 8 );
/* Check if the page is to be displayed */ /* Check if the page is to be displayed */
if( p_sys->dvbsub.p_page && p_sys->dvbsub.p_objects ) 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 ); vlc_object_release( p_sys->p_vout );
...@@ -385,8 +367,7 @@ static vout_thread_t *FindVout( decoder_t *p_dec ) ...@@ -385,8 +367,7 @@ static vout_thread_t *FindVout( decoder_t *p_dec )
} }
} }
static int init( dvbsub_all_t *p_dvbsub, int i_id )
static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
{ {
int i; int i;
...@@ -394,8 +375,8 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id ) ...@@ -394,8 +375,8 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
p_dvbsub->i_pts = 0; p_dvbsub->i_pts = 0;
p_dvbsub->i_id = i_id; p_dvbsub->i_id = i_id;
p_dvbsub->p_page = NULL; p_dvbsub->p_page = NULL;
p_dvbsub->p_objects = NULL; p_dvbsub->p_objects = NULL;
for( i = 0; i < 255; i++ ) for( i = 0; i < 255; i++ )
{ {
p_dvbsub->p_clut[i] = NULL; p_dvbsub->p_clut[i] = NULL;
...@@ -409,22 +390,20 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id ) ...@@ -409,22 +390,20 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
static void free_all( dvbsub_all_t * ); 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 ); 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 free_page( dvbsub_page_t* p_p );
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 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_type;
int i_page_id; int i_page_id;
...@@ -450,31 +429,45 @@ static void dvbsub_decode_segment( dvbsub_all_t *p_dvbspu, bs_t *s ) ...@@ -450,31 +429,45 @@ static void dvbsub_decode_segment( dvbsub_all_t *p_dvbspu, bs_t *s )
switch( i_type ) switch( i_type )
{ {
case DVBSUB_ST_CLUT_DEFINITION: case DVBSUB_ST_CLUT_DEFINITION:
dvbsub_decode_clut( p_dvbspu, s ); #ifdef DEBUG_DVBSUB
break; msg_Dbg( p_dec, "subtitle dvbsub_decode_clut" );
case DVBSUB_ST_PAGE_COMPOSITION: #endif
dvbsub_decode_page_composition( p_dvbspu, s ); decode_clut( p_dvbspu, s );
break; break;
case DVBSUB_ST_REGION_COMPOSITION: case DVBSUB_ST_PAGE_COMPOSITION:
dvbsub_decode_region_composition( p_dvbspu, s ); #ifdef DEBUG_DVBSUB
break; msg_Dbg( p_dec, "subtitle dvbsub_decode_page_composition" );
case DVBSUB_ST_OBJECT_DATA: #endif
dvbsub_decode_object( p_dvbspu, s ); decode_page_composition( p_dvbspu, s );
break; break;
case DVBSUB_ST_ENDOFDISPLAY: case DVBSUB_ST_REGION_COMPOSITION:
dvbsub_stop_display( p_dvbspu ); #ifdef DEBUG_DVBSUB
break; msg_Dbg( p_dec, "subtitle dvbsub_decode_region_composition" );
case DVBSUB_ST_STUFFING: #endif
default: decode_region_composition( p_dvbspu, s );
fprintf( stderr, "DVBSUB - Unsupported segment type : (%04x)", break;
i_type ); case DVBSUB_ST_OBJECT_DATA:
bs_skip( s, 8 * ( 2 + i_size ) ); #ifdef DEBUG_DVBSUB
break; 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; int i;
...@@ -484,7 +477,7 @@ static void dvbsub_stop_display( dvbsub_all_t *p_dvbsub ) ...@@ -484,7 +477,7 @@ static void dvbsub_stop_display( dvbsub_all_t *p_dvbsub )
} }
} }
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_segment_length;
uint16_t i_processed_length; uint16_t i_processed_length;
...@@ -513,12 +506,11 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -513,12 +506,11 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
} }
else 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]; clut = p_dvbsub->p_clut[i_clut_id];
/* We don't have this version of the CLUT: /* We don't have this version of the CLUT: Parse it */
* Parse it */
clut->i_version_number = i_version_number; clut->i_version_number = i_version_number;
bs_skip( s, 4 ); /* Reserved bits */ bs_skip( s, 4 ); /* Reserved bits */
i_processed_length = 2; i_processed_length = 2;
...@@ -578,7 +570,7 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -578,7 +570,7 @@ 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 decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
{ {
unsigned int i_version_number; unsigned int i_version_number;
unsigned int i_state; unsigned int i_state;
...@@ -589,9 +581,9 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -589,9 +581,9 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
i_segment_length = bs_read( s, 16 ); i_segment_length = bs_read( s, 16 );
/* A page is composed by one or more region: */ /* A page is composed by one or more region: */
i_timeout = bs_read( s, 8 ); i_timeout = bs_read( s, 8 );
i_version_number = bs_read( s, 4 ); i_version_number = bs_read( s, 4 );
i_state = bs_read( s, 2 ); i_state = bs_read( s, 2 );
/* TODO We assume it is a new page (i_state) */ /* TODO We assume it is a new page (i_state) */
if( p_dvbsub->p_page ) free_page( p_dvbsub->p_page ); if( p_dvbsub->p_page ) free_page( p_dvbsub->p_page );
...@@ -599,22 +591,22 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -599,22 +591,22 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
bs_skip( s, 2 ); /* Reserved */ bs_skip( s, 2 ); /* Reserved */
/* Allocate a new page */ /* 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; p_dvbsub->p_page->i_timeout = i_timeout;
/* Number of regions: */ /* Number of regions: */
p_dvbsub->p_page->i_regions_number = (i_segment_length-2) / 6; p_dvbsub->p_page->i_regions_number = (i_segment_length-2) / 6;
/* Special workaround for CAVENA encoders /* Special workaround for CAVENA encoders: a page with no regions is sent
* a page with no regions is sent instead of a 0x80 packet (End Of Display) */ * instead of a 0x80 packet (End Of Display) */
if( p_dvbsub->p_page->i_regions_number == 0 ) 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 = 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++ ) for( i = 0; i < p_dvbsub->p_page->i_regions_number; i++ )
{ {
p_dvbsub->p_page->regions[i].i_id = bs_read( s, 8 ); p_dvbsub->p_page->regions[i].i_id = bs_read( s, 8 );
...@@ -626,7 +618,7 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -626,7 +618,7 @@ 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 decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
{ {
dvbsub_region_t* p_region = NULL; dvbsub_region_t* p_region = NULL;
unsigned int i_segment_length; unsigned int i_segment_length;
...@@ -684,7 +676,7 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -684,7 +676,7 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
while( i_processed_length < i_segment_length ) while( i_processed_length < i_segment_length )
{ {
/* We create a new object */ /* 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 */ /* We parse object properties */
p_obj->p_next = NULL; p_obj->p_next = NULL;
...@@ -725,16 +717,18 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -725,16 +717,18 @@ static void dvbsub_decode_region_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
} }
} }
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,
static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p, dvbsub_image_t* p_image); 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; dvbsub_object_t *p_obj;
uint16_t i_segment_length; uint16_t i_segment_length;
/* Memory Allocation */ /* Memory Allocation */
p_obj = trox_malloc ( sizeof ( dvbsub_object_t ) ); p_obj = malloc( sizeof(dvbsub_object_t) );
p_obj->p_next = NULL; p_obj->p_next = NULL;
i_segment_length = bs_read( s, 16 ); i_segment_length = bs_read( s, 16 );
...@@ -748,20 +742,21 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -748,20 +742,21 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
if( p_obj->i_coding_method == 0x00 ) if( p_obj->i_coding_method == 0x00 )
{ {
uint16_t i_topfield_length; uint16_t i_topfield_length;
uint16_t i_bottomfield_length; uint16_t i_bottomfield_length;
i_topfield_length = bs_read( s, 16 ); i_topfield_length = bs_read( s, 16 );
i_bottomfield_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->topfield =
p_obj->bottomfield = dvbsub_parse_pdata( p_dvbsub, s, i_bottomfield_length ); dvbsub_parse_pdata( p_dvbsub, s, i_topfield_length );
p_obj->bottomfield =
dvbsub_parse_pdata( p_dvbsub, s, i_bottomfield_length );
} }
else else
{ {
bs_skip( s, (i_segment_length - 3 ) * 8 ); bs_skip( s, (i_segment_length - 3 ) * 8 );
/*TODO /*TODO: DVB subtitling as characters */
* DVB subtitling as characters */
} }
/* Add this object to the list of the page */ /* Add this object to the list of the page */
...@@ -769,17 +764,18 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s ) ...@@ -769,17 +764,18 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
p_dvbsub->p_objects = p_obj; 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; dvbsub_image_t* p_image;
uint16_t i_processed_length=0; uint16_t i_processed_length = 0;
uint16_t i_lines=0; uint16_t i_lines = 0;
uint16_t i_cols_last=0; uint16_t i_cols_last = 0;
p_image = trox_malloc ( sizeof ( dvbsub_image_t) ); p_image = malloc( sizeof(dvbsub_image_t) );
p_image->p_last=NULL; 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 */ /* Let's parse it a first time to determine the size of the buffer */
while( i_processed_length < length) while( i_processed_length < length)
...@@ -825,18 +821,16 @@ static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint ...@@ -825,18 +821,16 @@ static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint
return p_image; return p_image;
} }
static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color ) static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color )
{ {
if(p->p_last != NULL) 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; p->p_last = p->p_last->p_next;
} }
else 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 = p->p_codes;
} }
p->p_last->i_num = num; p->p_last->i_num = num;
...@@ -844,8 +838,8 @@ static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color ) ...@@ -844,8 +838,8 @@ static void add_rle_code( dvbsub_image_t *p, uint16_t num, uint8_t color )
p->p_last->p_next = NULL; p->p_last->p_next = NULL;
} }
static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p,
static uint16_t dvbsub_count0x11( bs_t *s, uint16_t* p, dvbsub_image_t* p_image ) dvbsub_image_t* p_image )
{ {
uint16_t i_processed=0; uint16_t i_processed=0;
vlc_bool_t b_stop=0; vlc_bool_t b_stop=0;
...@@ -936,16 +930,16 @@ static void free_image (dvbsub_image_t* p_i) ...@@ -936,16 +930,16 @@ static void free_image (dvbsub_image_t* p_i)
for( p1 = p_i->p_codes; p1 != NULL; p1=p2) for( p1 = p_i->p_codes; p1 != NULL; p1=p2)
{ {
p2=p1->p_next; p2=p1->p_next;
trox_free(p1); free(p1);
p1=NULL; p1=NULL;
} }
trox_free(p_i); free(p_i);
} }
static void free_object (dvbsub_object_t* p_o) 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) static void free_objectdefs ( dvbsub_objectdef_t* p_o)
...@@ -956,7 +950,7 @@ static void free_objectdefs ( dvbsub_objectdef_t* p_o) ...@@ -956,7 +950,7 @@ static void free_objectdefs ( dvbsub_objectdef_t* p_o)
for( p1 = p_o; p1 != NULL; p1=p2) for( p1 = p_o; p1 != NULL; p1=p2)
{ {
p2=p1->p_next; p2=p1->p_next;
trox_free(p1); free(p1);
p1=NULL; p1=NULL;
} }
} }
...@@ -966,7 +960,7 @@ static void free_regions (dvbsub_region_t* p_r, uint8_t nb) ...@@ -966,7 +960,7 @@ static void free_regions (dvbsub_region_t* p_r, uint8_t nb)
unsigned int i; unsigned int i;
for (i = 0; i<nb; i++) free_objectdefs ( p_r[i].p_object ); for (i = 0; i<nb; i++) free_objectdefs ( p_r[i].p_object );
trox_free (p_r); free (p_r);
p_r = NULL; p_r = NULL;
} }
...@@ -986,13 +980,13 @@ static void free_objects (dvbsub_object_t* p_o) ...@@ -986,13 +980,13 @@ static void free_objects (dvbsub_object_t* p_o)
static void free_clut ( dvbsub_clut_t* p_c ) 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) static void free_page (dvbsub_page_t* p_p)
{ {
free_regions (p_p->regions, p_p->i_regions_number); free_regions (p_p->regions, p_p->i_regions_number);
trox_free(p_p); free(p_p);
p_p = NULL; p_p = NULL;
} }
...@@ -1002,8 +996,8 @@ static void free_spu( subpicture_t *p_spu ) ...@@ -1002,8 +996,8 @@ static void free_spu( subpicture_t *p_spu )
{ {
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_top);
free_image(((dvbsub_render_t *)p_spu->p_sys->p_data)->p_rle_bot); free_image(((dvbsub_render_t *)p_spu->p_sys->p_data)->p_rle_bot);
trox_free(p_spu->p_sys->p_data); free(p_spu->p_sys->p_data);
trox_free( p_spu->p_sys ); free( p_spu->p_sys );
p_spu->p_sys = NULL; p_spu->p_sys = NULL;
} }
} }
...@@ -1035,7 +1029,7 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1035,7 +1029,7 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
//let's render the 1st frame //let's render the 1st frame
for(p_c = p_im->p_codes; p_c->p_next != NULL; p_c=p_c->p_next) 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) if( p_c->y != 0 && p_c->t < 0x20)
{ {
x = j+ p_r->i_x; x = j+ p_r->i_x;
...@@ -1045,9 +1039,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1045,9 +1039,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
for( i_cnt = 0; i_cnt < p_c->i_num; i_cnt+=2 ) 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, 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+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+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+3, p_c->cb, 1);
} }
} }
j += p_c->i_num; j += p_c->i_num;
...@@ -1070,9 +1064,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1070,9 +1064,9 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
for( i_cnt = 0; i_cnt < p_c->i_num; i_cnt+=2 ) 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, 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+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+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+3, p_c->cb, 1);
} }
} }
j += p_c->i_num; j += p_c->i_num;
...@@ -1084,7 +1078,6 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1084,7 +1078,6 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
} }
} }
static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic, static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
const subpicture_t *p_spu ) const subpicture_t *p_spu )
{ {
...@@ -1110,12 +1103,12 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1110,12 +1103,12 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
x = j+ p_r->i_x; x = j+ p_r->i_x;
y = 2*i+p_r->i_y; 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_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_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_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+ 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->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->V_PITCH + x, p_c->cb, p_c->i_num);
} }
j += p_c->i_num; j += p_c->i_num;
if(j >= p_im->i_cols[i]) if(j >= p_im->i_cols[i])
...@@ -1132,11 +1125,11 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1132,11 +1125,11 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
{ {
x = j+ p_r->i_x; x = j+ p_r->i_x;
y = 2*i+1+p_r->i_y; 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->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->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+ 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->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->V_PITCH + x, p_c->cb, p_c->i_num);
} }
j += p_c->i_num; j += p_c->i_num;
if(j >= p_im->i_cols[i]) if(j >= p_im->i_cols[i])
...@@ -1147,8 +1140,8 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -1147,8 +1140,8 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
} }
} }
static void dvbsub_RenderDVBSUB( vout_thread_t *p_vout, picture_t *p_pic, static void RenderDVBSUB( vout_thread_t *p_vout, picture_t *p_pic,
const subpicture_t *p_spu ) const subpicture_t *p_spu )
{ {
/* If we have changed the language on the fly */ /* If we have changed the language on the fly */
...@@ -1199,7 +1192,7 @@ static void dvbsub_Destroy( subpicture_t *p_spu ) ...@@ -1199,7 +1192,7 @@ static void dvbsub_Destroy( subpicture_t *p_spu )
free_spu( p_spu ); 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_region_t* p_region;
dvbsub_objectdef_t* p_objectdef; dvbsub_objectdef_t* p_objectdef;
...@@ -1208,8 +1201,7 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout ) ...@@ -1208,8 +1201,7 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
dvbsub_object_t* p_object_old; dvbsub_object_t* p_object_old;
dvbsub_render_t* p_render; dvbsub_render_t* p_render;
dvbsub_rle_t* p_c; dvbsub_rle_t* p_c;
uint8_t i,j; uint8_t i , j = 0;
j=0;
/* loop on regions */ /* loop on regions */
for( i = 0; i < dvbsub->p_page->i_regions_number; i++ ) for( i = 0; i < dvbsub->p_page->i_regions_number; i++ )
...@@ -1217,77 +1209,85 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout ) ...@@ -1217,77 +1209,85 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
p_region = &(dvbsub->p_page->regions[i]); p_region = &(dvbsub->p_page->regions[i]);
/* loop on objects */ /* 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 */ /* Look for the right object */
p_object = dvbsub->p_objects; 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; 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; return;
} }
/* Allocate the render structure */ /* 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_x = p_region->i_x + p_objectdef->i_xoffset;
p_render->i_y = p_region->i_y + p_objectdef->i_yoffset; p_render->i_y = p_region->i_y + p_objectdef->i_yoffset;
p_render->p_rle_top = p_object->topfield; p_render->p_rle_top = p_object->topfield;
p_render->p_rle_bot = p_object->bottomfield; p_render->p_rle_bot = p_object->bottomfield;
// if we did not recieved the CLUT yet // 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 */ /* 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 //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->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->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->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->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 //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->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->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->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->t = dvbsub->p_clut[p_region->i_clut]->c_4b[p_c->i_color_code].T;
} }
/* Allocate the subpicture internal data. */ /* 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 ) if( dvbsub->p_spu[j] == NULL )
{ {
msg_Err(p_vout, "Unable to allocate memory, skipping"); msg_Err(p_vout, "Unable to allocate memory, skipping");
return; return;
} }
/* Set the pf_render callback */ /* Set the pf_render callback */
dvbsub->p_spu[j]->pf_render = dvbsub_RenderDVBSUB; dvbsub->p_spu[j]->pf_render = RenderDVBSUB;
dvbsub->p_spu[j]->p_sys = trox_malloc( sizeof( subpicture_sys_t )); 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->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]->pf_destroy = dvbsub_Destroy;
dvbsub->p_spu[j]->i_start = dvbsub->i_pts; 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; dvbsub->p_spu[j]->b_ephemer = VLC_FALSE;
// At this stage, we have all we need in p_render // At this stage, we have all we need in p_render
// We need to free the object // We need to free the object
//Remove this object from the list //Remove this object from the list
p_object_old = p_object; p_object_old = p_object;
if(p_object == dvbsub->p_objects) if( p_object == dvbsub->p_objects )
dvbsub->p_objects = p_object->p_next; {
dvbsub->p_objects = p_object->p_next;
}
else else
{ {
for(p_o = dvbsub->p_objects; p_o->p_next != p_object; p_o=p_o->p_next); for( p_o = dvbsub->p_objects; p_o->p_next != p_object;
p_o->p_next = p_object->p_next; p_o = p_o->p_next );
p_o->p_next = p_object->p_next;
} }
free_object(p_object_old); free_object(p_object_old);
...@@ -1297,4 +1297,3 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout ) ...@@ -1297,4 +1297,3 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
} }
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment