X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fdvbsub.c;h=3f19f1a6f3eae4e5da88ec310757f02a63a1a800;hb=9583fbe0872045afbadf4e822ab8881932e7c057;hp=7fa1cd33cacb58d1bdf69175287871e38e40b8e5;hpb=223dadeb3189d2288e9554d912ccfb41882ca815;p=vlc diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c index 7fa1cd33ca..3f19f1a6f3 100644 --- a/modules/codec/dvbsub.c +++ b/modules/codec/dvbsub.c @@ -3,7 +3,7 @@ * DVB subtitles encoder (developed for Anevia, www.anevia.com) ***************************************************************************** * Copyright (C) 2003 ANEVIA - * Copyright (C) 2003-2005 VideoLAN (Centrale Réseaux) and its contributors + * Copyright (C) 2003-2005 the VideoLAN team * $Id$ * * Authors: Gildas Bazin @@ -23,14 +23,14 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble * * FIXME: * DVB subtitles coded as strings of characters are not handled correctly. - * The character codes in the string should actually be indexes refering to a + * The character codes in the string should actually be indexes referring to a * character table identified in the subtitle descriptor. *****************************************************************************/ #include @@ -42,31 +42,25 @@ /* #define DEBUG_DVBSUB 1 */ -#define POSX_TEXT N_("X coordinate of the subpicture") -#define POSX_LONGTEXT N_("You can reposition the subpicture by providing another value here." ) +#define POSX_TEXT N_("Decoding X coordinate") +#define POSX_LONGTEXT N_("X coordinate of the rendered subtitle") -#define POSY_TEXT N_("Y coordinate of the subpicture") -#define POSY_LONGTEXT N_("You can reposition the subpicture by providing another value here." ) +#define POSY_TEXT N_("Decoding Y coordinate") +#define POSY_LONGTEXT N_("Y coordinate of the rendered subtitle") #define POS_TEXT N_("Subpicture position") #define POS_LONGTEXT N_( \ "You can enforce the subpicture position on the video " \ "(0=center, 1=left, 2=right, 4=top, 8=bottom, you can " \ - "also use combinations of these values).") + "also use combinations of these values, e.g. 6=top-right).") -#define ENC_POSX_TEXT N_("X coordinate of the encoded subpicture") -#define ENC_POSX_LONGTEXT N_("You can reposition the subpicture by providing another value here." ) - -#define ENC_POSY_TEXT N_("Y coordinate of encoded the subpicture") -#define ENC_POSY_LONGTEXT N_("You can reposition the subpicture by providing another value here." ) - -#define TIMEOUT_TEXT N_("Timeout of subpictures") -#define TIMEOUT_LONGTEXT N_( \ - "Subpictures get a default timeout of 15 seconds added to their remaining time." \ - "This will ensure that they are at least the specified time visible.") +#define ENC_POSX_TEXT N_("Encoding X coordinate") +#define ENC_POSX_LONGTEXT N_("X coordinate of the encoded subtitle" ) +#define ENC_POSY_TEXT N_("Encoding Y coordinate") +#define ENC_POSY_LONGTEXT N_("Y coordinate of the encoded subtitle" ) static int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 }; -static char *ppsz_pos_descriptions[] = +static const char *ppsz_pos_descriptions[] = { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"), N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") }; @@ -102,10 +96,10 @@ vlc_module_begin(); add_integer( ENC_CFG_PREFIX "x", -1, NULL, ENC_POSX_TEXT, ENC_POSX_LONGTEXT, VLC_FALSE ); add_integer( ENC_CFG_PREFIX "y", -1, NULL, ENC_POSY_TEXT, ENC_POSY_LONGTEXT, VLC_FALSE ); - add_integer( ENC_CFG_PREFIX "timeout", 15, NULL, TIMEOUT_TEXT, TIMEOUT_LONGTEXT, VLC_FALSE ); + add_suppressed_integer( ENC_CFG_PREFIX "timeout" ); /* Suppressed since 0.8.5 */ vlc_module_end(); -static const char *ppsz_enc_options[] = { NULL }; +static const char *ppsz_enc_options[] = { "x", "y", NULL }; /**************************************************************************** * Local structures @@ -241,7 +235,7 @@ struct decoder_sys_t /* List of different Page Composition Segment state */ /* According to EN 300-743, 7.2.1 table 3 */ #define DVBSUB_PCS_STATE_ACQUISITION 0x01 -#define DVBSUB_PCS_STATE_CHANGE 0x10 +#define DVBSUB_PCS_STATE_CHANGE 0x02 /***************************************************************************** * Local prototypes @@ -328,7 +322,7 @@ static void Close( vlc_object_t *p_this ) var_Destroy( p_this, DVBSUB_CFG_PREFIX "x" ); var_Destroy( p_this, DVBSUB_CFG_PREFIX "y" ); - var_Destroy( p_this, DVBSUB_CFG_PREFIX "position" ); + var_Destroy( p_this, DVBSUB_CFG_PREFIX "position" ); free_all( p_dec ); free( p_sys ); @@ -425,8 +419,8 @@ static void default_clut_init( decoder_t *p_dec ) else R = G = B = 0x7F; p_sys->default_clut.c_2b[i].Y = RGB_TO_Y(R,G,B); - p_sys->default_clut.c_2b[i].Cr = RGB_TO_U(R,G,B); p_sys->default_clut.c_2b[i].Cb = RGB_TO_V(R,G,B); + p_sys->default_clut.c_2b[i].Cr = RGB_TO_U(R,G,B); p_sys->default_clut.c_2b[i].T = T; } @@ -456,8 +450,8 @@ static void default_clut_init( decoder_t *p_dec ) } p_sys->default_clut.c_4b[i].Y = RGB_TO_Y(R,G,B); - p_sys->default_clut.c_4b[i].Cr = RGB_TO_U(R,G,B); - p_sys->default_clut.c_4b[i].Cb = RGB_TO_V(R,G,B); + p_sys->default_clut.c_4b[i].Cr = RGB_TO_V(R,G,B); + p_sys->default_clut.c_4b[i].Cb = RGB_TO_U(R,G,B); p_sys->default_clut.c_4b[i].T = T; } @@ -837,7 +831,8 @@ static void decode_region_composition( decoder_t *p_dec, bs_t *s ) { if( p_region->p_pixbuf ) { - msg_Dbg( p_dec, "region size changed (not allowed)" ); + msg_Dbg( p_dec, "region size changed (%dx%d->%dx%d)", + p_region->i_width, p_region->i_height, i_width, i_height ); free( p_region->p_pixbuf ); } @@ -922,7 +917,7 @@ static void decode_object( decoder_t *p_dec, bs_t *s ) if( i_coding_method > 1 ) { - msg_Dbg( p_dec, "Unknown DVB subtitling coding %d is not handled!", i_coding_method ); + msg_Dbg( p_dec, "unknown DVB subtitling coding %d is not handled!", i_coding_method ); bs_skip( s, 8 * (i_segment_length - 2) - 6 ); return; } @@ -1410,8 +1405,8 @@ static subpicture_t *render( decoder_t *p_dec ) for( j = 0; j < fmt.p_palette->i_entries; j++ ) { fmt.p_palette->palette[j][0] = p_color[j].Y; - fmt.p_palette->palette[j][1] = p_color[j].Cr; - fmt.p_palette->palette[j][2] = p_color[j].Cb; + fmt.p_palette->palette[j][1] = p_color[j].Cb; /* U == Cb */ + fmt.p_palette->palette[j][2] = p_color[j].Cr; /* V == Cr */ fmt.p_palette->palette[j][3] = 0xff - p_color[j].T; } @@ -1469,6 +1464,8 @@ static subpicture_t *render( decoder_t *p_dec ) p_spu->i_flags = p_sys->i_spu_position; p_spu->i_x = p_sys->i_spu_x; p_spu->i_y = p_sys->i_spu_y; + p_spu->i_original_picture_width = 720; + p_spu->i_original_picture_height = 576; return p_spu; } @@ -1497,7 +1494,6 @@ struct encoder_sys_t /* subpicture positioning */ int i_offset_x; int i_offset_y; - int i_timeout_delay; }; static void encode_page_composition( encoder_t *, bs_t *, subpicture_t * ); @@ -1532,7 +1528,7 @@ static int OpenEncoder( vlc_object_t *p_this ) p_enc->fmt_out.i_codec = VLC_FOURCC('d','v','b','s'); p_enc->fmt_out.subs.dvb.i_id = 1 << 16 | 1; - sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); + config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); p_sys->i_page_ver = 0; p_sys->i_region_ver = 0; @@ -1546,9 +1542,6 @@ static int OpenEncoder( vlc_object_t *p_this ) var_Create( p_this, ENC_CFG_PREFIX "y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_this, ENC_CFG_PREFIX "y", &val ); p_sys->i_offset_y = val.i_int; - var_Create( p_this, ENC_CFG_PREFIX "timeout", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); - var_Get( p_this, ENC_CFG_PREFIX "timeout", &val ); - p_sys->i_timeout_delay = val.i_int; return VLC_SUCCESS; } @@ -1580,7 +1573,7 @@ static subpicture_t *YuvaYuvp( encoder_t *p_enc, subpicture_t *p_subpic ) + p_region->picture.p[0].i_pitch * 1 / 3; int i_tolerance = 0; -#if DEBUG_DVBSUB +#ifdef DEBUG_DVBSUB msg_Dbg( p_enc, "YuvaYuvp: i_pixels=%d, i_iterator=%d", i_pixels, i_iterator ); #endif p_fmt->i_chroma = VLC_FOURCC('Y','U','V','P'); @@ -1657,7 +1650,7 @@ static subpicture_t *YuvaYuvp( encoder_t *p_enc, subpicture_t *p_subpic ) } } -#if DEBUG_DVBSUB +#ifdef DEBUG_DVBSUB msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries ); #endif @@ -1751,7 +1744,7 @@ static subpicture_t *YuvaYuvp( encoder_t *p_enc, subpicture_t *p_subpic ) p_fmt->p_palette->palette[i][3] = 0; } p_fmt->p_palette->i_entries = i_max_entries; -#if DEBUG_DVBSUB +#ifdef DEBUG_DVBSUB msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries ); #endif } @@ -1808,7 +1801,7 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_subpic ) } /* End of hack */ -#if DEBUG_DVBSUB +#ifdef DEBUG_DVBSUB msg_Dbg( p_enc, "encoding subpicture" ); #endif p_block = block_New( p_enc, 64000 ); @@ -1912,10 +1905,8 @@ static void encode_page_composition( encoder_t *p_enc, bs_t *s, p_sys->p_regions[i_regions].i_width = p_region->fmt.i_visible_width; } - if( ( p_sys->p_regions[i_regions].i_height < - (int)p_region->fmt.i_visible_height ) || - ( p_sys->p_regions[i_regions].i_height > - (int)p_region->fmt.i_visible_height ) ) + if( p_sys->p_regions[i_regions].i_height < + (int)p_region->fmt.i_visible_height ) { b_mode_change = VLC_TRUE; msg_Dbg( p_enc, "region %i height change: %i -> %i", @@ -1935,7 +1926,7 @@ static void encode_page_composition( encoder_t *p_enc, bs_t *s, i_timeout = (p_subpic->i_stop - p_subpic->i_start) / 1000000; } - bs_write( s, 8, i_timeout + p_sys->i_timeout_delay ); /* Timeout */ + bs_write( s, 8, i_timeout ); /* Timeout */ bs_write( s, 4, p_sys->i_page_ver++ ); bs_write( s, 2, b_mode_change ? DVBSUB_PCS_STATE_CHANGE : DVBSUB_PCS_STATE_ACQUISITION );