Commit d0ed0d4b authored by Gildas Bazin's avatar Gildas Bazin

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

parent 81333241
......@@ -2,8 +2,8 @@
* 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>
......@@ -43,32 +43,6 @@ vlc_module_begin();
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
****************************************************************************
......@@ -97,6 +71,7 @@ typedef struct
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 */
......@@ -110,6 +85,7 @@ typedef struct dvbsub_objectdef_s
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
......@@ -130,7 +106,8 @@ typedef struct dvbsub_region_s
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 */
......@@ -142,6 +119,7 @@ typedef struct
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) */
......@@ -154,6 +132,7 @@ typedef struct dvbsub_object_s
dvbsub_image_t* topfield;
dvbsub_image_t* bottomfield;
struct dvbsub_object_s* p_next;
} dvbsub_object_t;
/* The entry in the palette CLUT */
......@@ -163,6 +142,7 @@ typedef struct
uint8_t Cr;
uint8_t Cb;
uint8_t T;
} dvbsub_color_t;
/* */
......@@ -173,6 +153,7 @@ typedef struct
dvbsub_color_t c_2b[0xff];
dvbsub_color_t c_4b[0xff];
dvbsub_color_t c_8b[0xff];
} dvbsub_clut_t;
typedef struct
......@@ -181,6 +162,7 @@ typedef struct
uint16_t i_y;
dvbsub_image_t* p_rle_top;
dvbsub_image_t* p_rle_bot;
} dvbsub_render_t;
typedef struct
......@@ -193,6 +175,7 @@ typedef struct
dvbsub_page_t* p_page;
dvbsub_object_t* p_objects;
subpicture_t* p_spu[16];
} dvbsub_all_t;
struct subpicture_sys_t
......@@ -243,11 +226,10 @@ static void Decode ( decoder_t *, block_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
......@@ -266,11 +248,11 @@ static int Open( vlc_object_t *p_this )
}
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' ) );
......@@ -293,15 +275,15 @@ static void Close( vlc_object_t *p_this )
{
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 );
}
......@@ -346,14 +328,14 @@ static void Decode( decoder_t *p_dec, block_t **pp_block )
{
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 );
......@@ -385,8 +367,7 @@ static vout_thread_t *FindVout( decoder_t *p_dec )
}
}
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;
......@@ -394,8 +375,8 @@ static int dvbsub_init( dvbsub_all_t *p_dvbsub, int i_id )
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;
......@@ -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 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;
......@@ -450,31 +429,45 @@ static void dvbsub_decode_segment( dvbsub_all_t *p_dvbspu, bs_t *s )
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;
......@@ -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_processed_length;
......@@ -513,12 +506,11 @@ static void dvbsub_decode_clut( dvbsub_all_t *p_dvbsub, bs_t *s )
}
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;
......@@ -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_state;
......@@ -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 );
/* 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 );
......@@ -599,22 +591,22 @@ static void dvbsub_decode_page_composition( dvbsub_all_t *p_dvbsub, bs_t *s )
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 );
......@@ -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;
unsigned int i_segment_length;
......@@ -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 )
{
/* 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;
......@@ -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 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 );
......@@ -748,20 +742,21 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
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 */
......@@ -769,17 +764,18 @@ static void dvbsub_decode_object( dvbsub_all_t *p_dvbsub, bs_t *s )
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)
......@@ -825,18 +821,16 @@ static dvbsub_image_t* dvbsub_parse_pdata( dvbsub_all_t *p_dvbsub, bs_t *s, uint
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;
......@@ -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;
}
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;
......@@ -936,16 +930,16 @@ static void free_image (dvbsub_image_t* p_i)
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)
......@@ -956,7 +950,7 @@ 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;
}
}
......@@ -966,7 +960,7 @@ static void free_regions (dvbsub_region_t* p_r, uint8_t nb)
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;
}
......@@ -986,13 +980,13 @@ static void free_objects (dvbsub_object_t* p_o)
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;
}
......@@ -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_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;
}
}
......@@ -1035,7 +1029,7 @@ static void RenderYUY2( vout_thread_t *p_vout, picture_t *p_pic,
//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;
......@@ -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 )
{
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;
......@@ -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 )
{
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;
......@@ -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,
const subpicture_t *p_spu )
{
......@@ -1110,12 +1103,12 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
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])
......@@ -1132,11 +1125,11 @@ static void RenderI42x( vout_thread_t *p_vout, picture_t *p_pic,
{
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])
......@@ -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,
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 */
......@@ -1199,7 +1192,7 @@ static void dvbsub_Destroy( subpicture_t *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_objectdef_t* p_objectdef;
......@@ -1208,8 +1201,7 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
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++ )
......@@ -1217,77 +1209,85 @@ static void dvbsub_render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout )
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);
......@@ -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