X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fsvcdsub.c;h=c6d9ee922994a75a407b306bfa63f081ea637010;hb=7ecf78a8cbc66e79e69e049ee7e6c70a6a751ec0;hp=4762b3c8ec39fd3f9287e3536addfcf9718bba22;hpb=6ebae83db81a80cdc3cead264455074702223ac0;p=vlc diff --git a/modules/codec/svcdsub.c b/modules/codec/svcdsub.c index 4762b3c8ec..c6d9ee9229 100644 --- a/modules/codec/svcdsub.c +++ b/modules/codec/svcdsub.c @@ -51,22 +51,22 @@ static void DecoderClose ( vlc_object_t * ); "calls 1\n" \ "packet assembly info 2\n" ) -vlc_module_begin(); - set_description( N_("Philips OGT (SVCD subtitle) decoder") ); - set_shortname( N_("SVCD subtitles") ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_SCODEC ); - set_capability( "decoder", 50 ); - set_callbacks( DecoderOpen, DecoderClose ); +vlc_module_begin () + set_description( N_("Philips OGT (SVCD subtitle) decoder") ) + set_shortname( N_("SVCD subtitles") ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_SCODEC ) + set_capability( "decoder", 50 ) + set_callbacks( DecoderOpen, DecoderClose ) add_integer ( MODULE_STRING "-debug", 0, NULL, - DEBUG_TEXT, DEBUG_LONGTEXT, true ); + DEBUG_TEXT, DEBUG_LONGTEXT, true ) - add_submodule(); - set_description( N_("Philips OGT (SVCD subtitle) packetizer") ); - set_capability( "packetizer", 50 ); - set_callbacks( PacketizerOpen, DecoderClose ); -vlc_module_end(); + add_submodule () + set_description( N_("Philips OGT (SVCD subtitle) packetizer") ) + set_capability( "packetizer", 50 ) + set_callbacks( PacketizerOpen, DecoderClose ) +vlc_module_end () /***************************************************************************** * Local prototypes @@ -437,7 +437,7 @@ static void ParseHeader( decoder_t *p_dec, block_t *p_block ) p_sys->i_image_length = p_sys->i_spu_size - p_sys->i_image_offset; p_sys->metadata_length = p_sys->i_image_offset; - if (p_sys && p_sys->i_debug & DECODE_DBG_PACKET) + if( p_sys->i_debug & DECODE_DBG_PACKET ) { msg_Dbg( p_dec, "x-start: %d, y-start: %d, width: %d, height %d, " "spu size: %zu, duration: %"PRIu64" (d:%zu p:%"PRIu16")", @@ -445,7 +445,7 @@ static void ParseHeader( decoder_t *p_dec, block_t *p_block ) p_sys->i_width, p_sys->i_height, p_sys->i_spu_size, p_sys->i_duration, p_sys->i_image_length, p_sys->i_image_offset); - + for( i = 0; i < 4; i++ ) { msg_Dbg( p_dec, "palette[%d]= T: %2x, Y: %2x, u: %2x, v: %2x", i, @@ -467,16 +467,13 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) subpicture_t *p_spu; subpicture_region_t *p_region; video_format_t fmt; + video_palette_t palette; int i; /* Allocate the subpicture internal data. */ - p_spu = p_dec->pf_spu_buffer_new( p_dec ); + p_spu = decoder_NewSubpicture( p_dec ); if( !p_spu ) return NULL; - p_spu->b_pausable = true; - - p_spu->i_x = p_sys->i_x_start; - p_spu->i_y = p_sys->i_y_start; p_spu->i_start = p_data->i_pts; p_spu->i_stop = p_data->i_pts + p_sys->i_duration; p_spu->b_ephemer = true; @@ -498,19 +495,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) fmt.i_width = fmt.i_visible_width = p_sys->i_width; fmt.i_height = fmt.i_visible_height = p_sys->i_height; fmt.i_x_offset = fmt.i_y_offset = 0; - p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt ); - if( !p_region ) - { - msg_Err( p_dec, "cannot allocate SVCD subtitle region" ); - //goto error; - } - - p_region->fmt.i_aspect = VOUT_ASPECT_FACTOR; - - p_spu->p_region = p_region; - p_region->i_x = p_region->i_y = 0; - - /* Build palette */ + fmt.p_palette = &palette; fmt.p_palette->i_entries = 4; for( i = 0; i < fmt.p_palette->i_entries; i++ ) { @@ -520,6 +505,18 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data ) fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3]; } + p_region = subpicture_region_New( &fmt ); + if( !p_region ) + { + msg_Err( p_dec, "cannot allocate SVCD subtitle region" ); + decoder_DeleteSubpicture( p_dec, p_spu ); + return NULL; + } + + p_spu->p_region = p_region; + p_region->i_x = p_sys->i_x_start; + p_region->i_y = p_sys->i_y_start; + SVCDSubRenderImage( p_dec, p_data, p_region ); return p_spu; @@ -547,7 +544,7 @@ static void SVCDSubRenderImage( decoder_t *p_dec, block_t *p_data, subpicture_region_t *p_region ) { decoder_sys_t *p_sys = p_dec->p_sys; - uint8_t *p_dest = p_region->picture.Y_PIXELS; + uint8_t *p_dest = p_region->p_picture->Y_PIXELS; int i_field; /* The subtitles are interlaced */ int i_row, i_column; /* scanline row/column number */ uint8_t i_color, i_count; @@ -566,13 +563,13 @@ static void SVCDSubRenderImage( decoder_t *p_dec, block_t *p_data, if( i_color == 0 && (i_count = bs_read( &bs, 2 )) ) { i_count = __MIN( i_count, p_sys->i_width - i_column ); - memset( &p_dest[i_row * p_region->picture.Y_PITCH + + memset( &p_dest[i_row * p_region->p_picture->Y_PITCH + i_column], 0, i_count + 1 ); i_column += i_count; continue; } - p_dest[i_row * p_region->picture.Y_PITCH + i_column] = i_color; + p_dest[i_row * p_region->p_picture->Y_PITCH + i_column] = i_color; } bs_align( &bs );