From: Yoann Peronneau Date: Thu, 17 Jun 2004 03:37:03 +0000 (+0000) Subject: * src/video_output/vout_subpictures.c : New OSD channels X-Git-Tag: 0.8.0~1123 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=11e8ae92009d27accae414feeb8f30c6822b0955;p=vlc * src/video_output/vout_subpictures.c : New OSD channels When you want to use OSD, you have to register an OSD channel, by calling vout_RegisterOSDChannel, then pass it to vout_CreateSubPicture. There is a particular channel, DEFAULT_CHANNEL that can be used for general purpose. See modules/control/hotkeys.c for an example. --- diff --git a/doc/developer/video_output.xml b/doc/developer/video_output.xml index 47a43a69bf..3cdb855e50 100644 --- a/doc/developer/video_output.xml +++ b/doc/developer/video_output.xml @@ -126,8 +126,9 @@ and vout_DatePicture upon necessary. subpicture_t * vout_CreateSubPicture ( vout_thread_t *p_vout, - int i_type, int i_size ) : - Returns an allocated subpicture buffer. i_type + int i_channel, int i_type ) : + Returns an allocated subpicture buffer. i_channel + is the ID of the subpicture channel, i_type is DVD_SUBPICTURE or TEXT_SUBPICTURE, i_size is the length in bytes of the packet. diff --git a/include/osd.h b/include/osd.h index 97bcdc4bd5..9bd1f49edc 100644 --- a/include/osd.h +++ b/include/osd.h @@ -65,4 +65,4 @@ VLC_EXPORT( void, __vout_OSDMessage, ( vlc_object_t *, int, char *, ... ) ); # define vout_OSDMessage __vout_OSDMessage #endif VLC_EXPORT( void, vout_OSDSlider, ( vlc_object_t *, int, int , short ) ); -VLC_EXPORT( void, vout_OSDIcon, ( vlc_object_t *, short ) ); +VLC_EXPORT( void, vout_OSDIcon, ( vlc_object_t *, int, short ) ); diff --git a/include/video_output.h b/include/video_output.h index 08bfce5963..1770ecfd8a 100644 --- a/include/video_output.h +++ b/include/video_output.h @@ -125,6 +125,10 @@ struct vout_thread_t /* Picture and subpicture heaps */ picture_t p_picture[2*VOUT_MAX_PICTURES]; /**< pictures */ subpicture_t p_subpicture[VOUT_MAX_PICTURES]; /**< subpictures */ + subpicture_t *p_default_channel; /**< subpicture in the default + channel */ + int i_channel_count; /**< index of last subpicture + channel registered */ /* Statistics */ count_t c_loops; @@ -256,9 +260,11 @@ enum output_query_e * \addtogroup subpicture * @{ */ -VLC_EXPORT( subpicture_t *, vout_CreateSubPicture, ( vout_thread_t *, int, int, int ) ); +VLC_EXPORT( subpicture_t *, vout_CreateSubPicture, ( vout_thread_t *, int, int ) ); VLC_EXPORT( void, vout_DestroySubPicture, ( vout_thread_t *, subpicture_t * ) ); VLC_EXPORT( void, vout_DisplaySubPicture, ( vout_thread_t *, subpicture_t * ) ); +VLC_EXPORT( int, vout_RegisterOSDChannel, ( vout_thread_t * ) ); +VLC_EXPORT( void, vout_ClearOSDChannel, ( vout_thread_t *, int ) ); subpicture_t * vout_SortSubPictures ( vout_thread_t *, mtime_t ); void vout_RenderSubPictures ( vout_thread_t *, picture_t *, diff --git a/include/vlc_video.h b/include/vlc_video.h index bbbe259461..4c938e188f 100644 --- a/include/vlc_video.h +++ b/include/vlc_video.h @@ -193,10 +193,9 @@ struct picture_heap_t */ struct subpicture_t { - /** \name Channel and content type */ + /** \name Channel ID */ /**@{*/ - int i_channel; /**< subpicture channel */ - int i_content; /**< content type */ + int i_channel; /**< subpicture channel ID */ /**@}*/ /** \name Type and flags @@ -241,24 +240,14 @@ struct subpicture_t #define EMPTY_SUBPICTURE 0 /* subtitle slot is empty and available */ #define MEMORY_SUBPICTURE 100 /* subpicture stored in memory */ +/* Default subpicture channel ID */ +#define DEFAULT_CHAN 1 + /* Subpicture status */ #define FREE_SUBPICTURE 0 /* free and not allocated */ #define RESERVED_SUBPICTURE 1 /* allocated and reserved */ #define READY_SUBPICTURE 2 /* ready for display */ -/* Subpicture channel */ -#define SUBT1_CHAN 1 -#define SUBT2_CHAN 2 -#define BEGIN_EXCLUSIVE_CHAN 3 /* exclusive subpic-channels list */ -#define POSITION_CHAN 3 -#define VOLUME_CHAN 4 -#define SOLO_CHAN 5 -#define END_EXCLUSIVE_CHAN 5 /*end of list */ - -/* Subpicture content type */ -#define TEXT_CONTENT 0 -#define GRAPH_CONTENT 1 /* used for OSD icon, slider... */ - /***************************************************************************** * Prototypes *****************************************************************************/ diff --git a/modules/codec/cmml/intf.c b/modules/codec/cmml/intf.c index 511b9b33b7..360208398f 100644 --- a/modules/codec/cmml/intf.c +++ b/modules/codec/cmml/intf.c @@ -843,7 +843,7 @@ static int DisplayAnchor( intf_thread_t *p_intf, /* TODO: p_subpicture doesn't have the proper i_x and i_y * coordinates. Need to look at the subpicture display system to * work out why. */ - if ( vout_ShowTextAbsolute( p_vout, SOLO_CHAN, + if ( vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, psz_anchor_description, p_style, OSD_ALIGN_BOTTOM, i_margin_h, i_margin_v, i_now, 0 ) == VLC_SUCCESS ) { diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c index 89648b50c1..957c9100fe 100644 --- a/modules/codec/dvbsub.c +++ b/modules/codec/dvbsub.c @@ -175,6 +175,7 @@ typedef struct dvbsub_page_t* p_page; dvbsub_object_t* p_objects; subpicture_t* p_spu[16]; + int i_subpic_channel; } dvbsub_all_t; @@ -295,6 +296,7 @@ static void Decode( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; block_t *p_block; + vout_thread_t *p_last_vout; if( pp_block == NULL || *pp_block == NULL ) { @@ -311,6 +313,7 @@ static void Decode( decoder_t *p_dec, block_t **pp_block ) return; } + p_last_vout = p_sys->p_vout; if( ( p_sys->p_vout = FindVout( p_dec ) ) ) { int i_data_identifier; @@ -332,6 +335,12 @@ static void Decode( decoder_t *p_dec, block_t **pp_block ) } i_end_data_marker = bs_read( &p_sys->bs, 8 ); + if( p_last_vout != p_sys->p_vout ) + { + p_sys->dvbsub.i_subpic_channel = + vout_RegisterOSDChannel( p_sys->p_vout ); + } + /* Check if the page is to be displayed */ if( p_sys->dvbsub.p_page && p_sys->dvbsub.p_objects ) { @@ -1258,7 +1267,7 @@ static void render( dvbsub_all_t *dvbsub, vout_thread_t *p_vout ) /* Allocate the subpicture internal data. */ dvbsub->p_spu[j] = - vout_CreateSubPicture( p_vout, SUBT1_CHAN, TEXT_CONTENT, + vout_CreateSubPicture( p_vout, dvbsub->i_subpic_channel, MEMORY_SUBPICTURE ); if( dvbsub->p_spu[j] == NULL ) { diff --git a/modules/codec/ogt/cvd.c b/modules/codec/ogt/cvd.c index 04423495f3..ed6c5d633c 100644 --- a/modules/codec/ogt/cvd.c +++ b/modules/codec/ogt/cvd.c @@ -48,7 +48,7 @@ vlc_module_begin(); set_callbacks( VCDSubOpen, VCDSubClose ); add_integer ( MODULE_STRING "-debug", 0, NULL, - DEBUG_TEXT, DEBUG_LONGTEXT, VLC_TRUE ); + DEBUG_TEXT, DEBUG_LONGTEXT, VLC_TRUE ); add_integer ( MODULE_STRING "-horizontal-correct", 0, NULL, HORIZONTAL_CORRECT, HORIZONTAL_CORRECT_LONGTEXT, VLC_FALSE ); @@ -57,12 +57,12 @@ vlc_module_begin(); VERTICAL_CORRECT, VERTICAL_CORRECT_LONGTEXT, VLC_FALSE ); add_string( MODULE_STRING "-aspect-ratio", "", NULL, - SUB_ASPECT_RATIO_TEXT, SUB_ASPECT_RATIO_LONGTEXT, - VLC_TRUE ); + SUB_ASPECT_RATIO_TEXT, SUB_ASPECT_RATIO_LONGTEXT, + VLC_TRUE ); add_integer( MODULE_STRING "-duration-scaling", 3, NULL, - DURATION_SCALE_TEXT, DURATION_SCALE_LONGTEXT, - VLC_TRUE ); + DURATION_SCALE_TEXT, DURATION_SCALE_LONGTEXT, + VLC_TRUE ); add_submodule(); set_description( _("Chaoji VCD subtitle packetizer") ); @@ -145,6 +145,7 @@ Decode ( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; block_t *p_spu = Reassemble( p_dec, pp_block ); + vout_thread_t *p_last_vout = p_dec->p_sys->p_vout; dbg_print( (DECODE_DBG_CALL) , ""); @@ -156,6 +157,12 @@ Decode ( decoder_t *p_dec, block_t **pp_block ) if( ( p_sys->p_vout = VCDSubFindVout( p_dec ) ) ) { + if( p_last_vout != p_sys->p_vout ) + { + p_sys->i_subpic_channel = + vout_RegisterOSDChannel( p_sys->p_vout ); + } + /* Parse and decode */ E_(ParsePacket)( p_dec ); @@ -229,36 +236,37 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) p_buffer = p_block->p_buffer; - dbg_print( (DECODE_DBG_CALL|DECODE_DBG_PACKET), - "header: 0x%02x 0x%02x 0x%02x 0x%02x, 0x%02x, 0x%02x, size: %i", - p_buffer[1], p_buffer[2], p_buffer[3], p_buffer[4], - p_buffer[5], p_buffer[6], - p_block->i_buffer); + dbg_print( (DECODE_DBG_CALL|DECODE_DBG_PACKET), + "header: 0x%02x 0x%02x 0x%02x 0x%02x, 0x%02x, 0x%02x, size: %i", + p_buffer[1], p_buffer[2], p_buffer[3], p_buffer[4], + p_buffer[5], p_buffer[6], + p_block->i_buffer); /* Attach to our input thread and see if subtitle is selected. */ { vlc_object_t * p_input; vlc_value_t val; - - p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_PARENT ); - if( !p_input ) return NULL; + p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_PARENT ); + + if( !p_input ) return NULL; + + if( var_Get( p_input, "spu-channel", &val ) ) + { + vlc_object_release( p_input ); + return NULL; + } - if( var_Get( p_input, "spu-channel", &val ) ) { - vlc_object_release( p_input ); - return NULL; - } - vlc_object_release( p_input ); - /* Number could be 0bd, 1bd, 2bd, 3bd for 0..3. If so - reduce it to 0..3. - */ - if ( (val.i_int & 0xff) == 0xbd ) val.i_int >>= 8; - - if( val.i_int == -1 || val.i_int != p_buffer[0] ) - return NULL; + /* Number could be 0bd, 1bd, 2bd, 3bd for 0..3. If so + reduce it to 0..3. + */ + if ( (val.i_int & 0xff) == 0xbd ) val.i_int >>= 8; + + if( val.i_int == -1 || val.i_int != p_buffer[0] ) + return NULL; } @@ -268,8 +276,8 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) image don't. */ if ( p_sys->state == SUBTITLE_BLOCK_EMPTY && p_block->i_pts == 0 ) { - msg_Warn( p_dec, - "first packet expected but no PTS present -- skipped\n"); + msg_Warn( p_dec, + "first packet expected but no PTS present -- skipped\n"); return NULL; } @@ -280,8 +288,8 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) } /* FIXME - remove append_data and use chainappend */ - VCDSubAppendData( p_dec, p_buffer + SPU_HEADER_LEN, - p_block->i_buffer - SPU_HEADER_LEN ); + VCDSubAppendData( p_dec, p_buffer + SPU_HEADER_LEN, + p_block->i_buffer - SPU_HEADER_LEN ); block_ChainAppend( &p_sys->p_block, p_block ); @@ -295,6 +303,5 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) p_sys->state = SUBTITLE_BLOCK_PARTIAL; } - return NULL; } diff --git a/modules/codec/ogt/cvd_parse.c b/modules/codec/ogt/cvd_parse.c index 79a4ed063e..a1916fa29b 100644 --- a/modules/codec/ogt/cvd_parse.c +++ b/modules/codec/ogt/cvd_parse.c @@ -292,7 +292,7 @@ E_(ParsePacket)( decoder_t *p_dec) dbg_print( (DECODE_DBG_CALL|DECODE_DBG_EXT) , ""); /* Allocate the subpicture internal data. */ - p_spu = vout_CreateSubPicture( p_sys->p_vout, SUBT1_CHAN, TEXT_CONTENT, + p_spu = vout_CreateSubPicture( p_sys->p_vout, p_sys->i_subpic_channel, MEMORY_SUBPICTURE ); if( p_spu == NULL ) { diff --git a/modules/codec/ogt/ogt.c b/modules/codec/ogt/ogt.c index 80b3e8fd21..359d3e3761 100644 --- a/modules/codec/ogt/ogt.c +++ b/modules/codec/ogt/ogt.c @@ -48,7 +48,7 @@ vlc_module_begin(); set_callbacks( VCDSubOpen, VCDSubClose ); add_integer ( MODULE_STRING "-debug", 0, NULL, - DEBUG_TEXT, DEBUG_LONGTEXT, VLC_TRUE ); + DEBUG_TEXT, DEBUG_LONGTEXT, VLC_TRUE ); add_integer ( MODULE_STRING "-horizontal-correct", 0, NULL, HORIZONTAL_CORRECT, HORIZONTAL_CORRECT_LONGTEXT, VLC_FALSE ); @@ -57,12 +57,10 @@ vlc_module_begin(); VERTICAL_CORRECT, VERTICAL_CORRECT_LONGTEXT, VLC_FALSE ); add_string( MODULE_STRING "-aspect-ratio", "", NULL, - SUB_ASPECT_RATIO_TEXT, SUB_ASPECT_RATIO_LONGTEXT, - VLC_TRUE ); + SUB_ASPECT_RATIO_TEXT, SUB_ASPECT_RATIO_LONGTEXT, VLC_TRUE ); add_integer( MODULE_STRING "-duration-scaling", 9, NULL, - DURATION_SCALE_TEXT, DURATION_SCALE_LONGTEXT, - VLC_TRUE ); + DURATION_SCALE_TEXT, DURATION_SCALE_LONGTEXT, VLC_TRUE ); add_submodule(); set_description( _("Philips OGT (SVCD subtitle) packetizer") ); @@ -145,6 +143,7 @@ Decode ( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; block_t *p_spu = Reassemble( p_dec, pp_block ); + vout_thread_t *p_last_vout = p_dec->p_sys->p_vout; dbg_print( (DECODE_DBG_CALL) , ""); @@ -156,6 +155,12 @@ Decode ( decoder_t *p_dec, block_t **pp_block ) if( ( p_sys->p_vout = VCDSubFindVout( p_dec ) ) ) { + if( p_last_vout != p_sys->p_vout ) + { + p_sys->i_subpic_channel = + vout_RegisterOSDChannel( p_sys->p_vout ); + } + /* Parse and decode */ E_(ParsePacket)( p_dec ); @@ -239,34 +244,36 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) p_buffer = p_block->p_buffer; - dbg_print( (DECODE_DBG_CALL|DECODE_DBG_PACKET), - "header: 0x%02x 0x%02x 0x%02x 0x%02x, size: %i", - p_buffer[1], p_buffer[2], p_buffer[3], p_buffer[4], - p_block->i_buffer); + dbg_print( (DECODE_DBG_CALL|DECODE_DBG_PACKET), + "header: 0x%02x 0x%02x 0x%02x 0x%02x, size: %i", + p_buffer[1], p_buffer[2], p_buffer[3], p_buffer[4], + p_block->i_buffer); /* Attach to our input thread and see if subtitle is selected. */ { vlc_object_t * p_input; vlc_value_t val; - - p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_PARENT ); - if( !p_input ) return NULL; + p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_PARENT ); + + if( !p_input ) return NULL; - if( var_Get( p_input, "spu-channel", &val ) ) { - vlc_object_release( p_input ); + if( var_Get( p_input, "spu-channel", &val ) ) + { + vlc_object_release( p_input ); return NULL; } - + vlc_object_release( p_input ); - dbg_print( (DECODE_DBG_PACKET), + dbg_print( (DECODE_DBG_PACKET), "val.i_int %x p_buffer[i] %x", val.i_int, p_buffer[1]); /* The dummy ES that the menu selection uses has an 0x70 at the head which we need to strip off. */ - if( val.i_int == -1 || (val.i_int & 0x03) != p_buffer[1] ) { - dbg_print( DECODE_DBG_PACKET, "subtitle not for us.\n"); - return NULL; + if( val.i_int == -1 || (val.i_int & 0x03) != p_buffer[1] ) + { + dbg_print( DECODE_DBG_PACKET, "subtitle not for us.\n"); + return NULL; } } @@ -332,7 +339,7 @@ Reassemble( decoder_t *p_dec, block_t **pp_block ) } -/* +/* * Local variables: * c-file-style: "gnu" * tab-width: 8 diff --git a/modules/codec/ogt/ogt_parse.c b/modules/codec/ogt/ogt_parse.c index 09dfea8cb6..b2b0b24874 100644 --- a/modules/codec/ogt/ogt_parse.c +++ b/modules/codec/ogt/ogt_parse.c @@ -165,7 +165,7 @@ E_(ParsePacket)( decoder_t *p_dec) dbg_print( (DECODE_DBG_CALL|DECODE_DBG_EXT) , ""); /* Allocate the subpicture internal data. */ - p_spu = vout_CreateSubPicture( p_sys->p_vout, SUBT1_CHAN, TEXT_CONTENT, + p_spu = vout_CreateSubPicture( p_sys->p_vout, p_sys->i_subpic_channel, MEMORY_SUBPICTURE ); if( p_spu == NULL ) { diff --git a/modules/codec/ogt/subtitle.h b/modules/codec/ogt/subtitle.h index fac2fc09a9..4e55300374 100644 --- a/modules/codec/ogt/subtitle.h +++ b/modules/codec/ogt/subtitle.h @@ -35,7 +35,7 @@ #define DECODE_DBG_PNG 64 /* Extract subtitles to PNG files. */ #define DECODE_DBG_INFO 128 -#define DEBUG_TEXT N_( \ +#define DEBUG_TEXT N_( \ "If nonzero, this gives additional debug information." \ ) @@ -51,7 +51,7 @@ "misc info 128\n" ) #define SUB_ASPECT_RATIO_TEXT N_("Subtitle aspect-ratio correction") -#define SUB_ASPECT_RATIO_LONGTEXT N_( \ +#define SUB_ASPECT_RATIO_LONGTEXT N_( \ "Use this to force the subtitle aspect ratio. If you give a null string " \ "the right value will be determined automatically. Usually this is what " \ "you want. For OGT and CVD subtitles this undoes the effect " \ @@ -66,26 +66,26 @@ ) #define DURATION_SCALE_TEXT N_("Factor to increase subtitle display interval") -#define DURATION_SCALE_LONGTEXT N_( \ +#define DURATION_SCALE_LONGTEXT N_( \ "If you find you need extra time for reading subtitles, " \ - "you can set this higher and it will multiply the display " \ - "time by that amount. Use 0 to mean until the next " \ + "you can set this higher and it will multiply the display " \ + "time by that amount. Use 0 to mean until the next " \ "subtitle.") #define HORIZONTAL_CORRECT \ N_("Add this to starting horizontal position of subtitle.") -#define HORIZONTAL_CORRECT_LONGTEXT N_( \ +#define HORIZONTAL_CORRECT_LONGTEXT N_( \ "If you need to adjust the subtitle starting position horizontally, " \ "set this. Negative values shift left and positive values right. 0 would " \ - "be no deviation from where the position specified in the subtitle." \ + "be no deviation from where the position specified in the subtitle." \ ) #define VERTICAL_CORRECT \ N_("Add this to starting vertical position of subtitle.") -#define VERTICAL_CORRECT_LONGTEXT N_( \ +#define VERTICAL_CORRECT_LONGTEXT N_( \ "If you need to adjust the subtitle starting position vertically, " \ - "set this. Negative values shift up, positive values down. 0 would " \ - "be no deviation from where the position specified in the subtitle." \ + "set this. Negative values shift up, positive values down. 0 would " \ + "be no deviation from where the position specified in the subtitle." \ ) #define DECODE_DEBUG 1 @@ -107,7 +107,7 @@ /* The number of color palette entries allowed in a subtitle. */ -#define NUM_SUBTITLE_COLORS 4 +#define NUM_SUBTITLE_COLORS 4 typedef enum { SUBTITLE_BLOCK_EMPTY, @@ -118,7 +118,7 @@ typedef enum { /* The byte storage used by one pixel */ #define PIXEL_SIZE 4 -/* Size in bytes of YUV portion above. */ +/* Size in bytes of YUV portion above. */ #define YUV_SIZE 3 @@ -133,50 +133,52 @@ struct decoder_sys_t int i_spu; packet_state_t state; /* data-gathering state for this subtitle */ - uint16_t i_image; /* image number in the subtitle stream; 0 is the - first one. */ - uint8_t i_packet;/* packet number for above image number; 0 is the - first one. */ + uint16_t i_image; /* image number in the subtitle stream; 0 is the + first one. */ + uint8_t i_packet;/* packet number for above image number; 0 is the + first one. */ block_t *p_block;/* Bytes of the packet. */ - + uint8_t buffer[65536 + 20 ]; /* we will never overflow more than 11 - bytes if I'm right */ + bytes if I'm right */ int b_packetizer; - int i_spu_size; /* goal for subtitle_data_pos while gathering, - size of used subtitle_data later */ + int i_spu_size; /* goal for subtitle_data_pos while gathering, + size of used subtitle_data later */ vout_thread_t *p_vout; + int i_subpic_channel; /* Subpicture channel in which subtitles will + be written */ + /* FIXME: Remove this? */ - uint8_t *subtitle_data; /* buffer used to accumulate data from - successive packets in the same subtitle */ - int subtitle_data_size; /* size of the allocated subtitle_data */ + uint8_t *subtitle_data; /* buffer used to accumulate data from + successive packets in the same subtitle */ + int subtitle_data_size; /* size of the allocated subtitle_data */ /* Move into subpicture_sys_t? */ - uint16_t i_image_offset; /* offset from subtitle_data to compressed - image data */ - int i_image_length; /* size of the compressed image data */ + uint16_t i_image_offset; /* offset from subtitle_data to compressed + image data */ + int i_image_length; /* size of the compressed image data */ int first_field_offset; /* offset of even raster lines. Used - only for CVD. - */ + only for CVD. */ int second_field_offset; /* offset of odd raster lines */ int metadata_offset; /* offset to data describing the image */ int metadata_length; /* length of metadata */ - int subtitle_data_pos; /* where to write next chunk */ + int subtitle_data_pos; /* where to write next chunk */ - mtime_t i_duration; /* how long to display the image, 0 stands - for "until next subtitle" */ + mtime_t i_duration; /* how long to display the image, 0 stands + for "until next subtitle" */ uint16_t i_x_start, i_y_start; /* position of top leftmost pixel of - image when displayed */ - uint16_t i_width, i_height; /* dimensions in pixels of image */ + image when displayed */ + uint16_t i_width, i_height; /* dimensions in pixels of image */ ogt_yuvt_t p_palette[NUM_SUBTITLE_COLORS]; /* Palette of colors used - in subtitle */ + in subtitle */ ogt_yuvt_t p_palette_highlight[NUM_SUBTITLE_COLORS]; /* Only used - for CVD */ + for CVD */ uint8_t i_options; uint8_t i_options2; @@ -194,7 +196,7 @@ struct subpicture_sys_t /* Link to our input */ vlc_object_t * p_input; - + /* Cropping properties */ vlc_mutex_t lock; vlc_bool_t b_crop; @@ -202,6 +204,6 @@ struct subpicture_sys_t /* This is only used for color palette Chromas like RGB2. */ ogt_yuvt_t p_palette[NUM_SUBTITLE_COLORS]; /* Palette of colors used - in subtitle */ + in subtitle */ }; diff --git a/modules/codec/spudec/parse.c b/modules/codec/spudec/parse.c index bbad591d7b..6ada5fd739 100644 --- a/modules/codec/spudec/parse.c +++ b/modules/codec/spudec/parse.c @@ -70,9 +70,10 @@ void E_(ParsePacket)( decoder_t *p_dec) decoder_sys_t *p_sys = p_dec->p_sys; subpicture_t *p_spu; + int i_spu_channel; /* Allocate the subpicture internal data. */ - p_spu = vout_CreateSubPicture( p_sys->p_vout, SUBT1_CHAN, TEXT_CONTENT, + p_spu = vout_CreateSubPicture( p_sys->p_vout, p_sys->i_subpic_channel, MEMORY_SUBPICTURE ); if( p_spu == NULL ) { diff --git a/modules/codec/spudec/spudec.c b/modules/codec/spudec/spudec.c index 37f643ffd0..ca8f481595 100644 --- a/modules/codec/spudec/spudec.c +++ b/modules/codec/spudec/spudec.c @@ -2,7 +2,7 @@ * spudec.c : SPU decoder thread ***************************************************************************** * Copyright (C) 2000-2001 VideoLAN - * $Id: spudec.c,v 1.33 2004/01/30 16:50:26 fenrir Exp $ + * $Id$ * * Authors: Samuel Hocevar * Laurent Aimar @@ -153,10 +153,11 @@ static void Close( vlc_object_t *p_this ) /***************************************************************************** * Decode: *****************************************************************************/ -static void Decode ( decoder_t *p_dec, block_t **pp_block ) +static void Decode( decoder_t *p_dec, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; block_t *p_spu = Reassemble( p_dec, pp_block ); + vout_thread_t *p_last_vout = p_dec->p_sys->p_vout; if( p_spu ) { @@ -166,6 +167,12 @@ static void Decode ( decoder_t *p_dec, block_t **pp_block ) if( ( p_sys->p_vout = FindVout( p_dec ) ) ) { + if( p_last_vout != p_sys->p_vout ) + { + p_sys->i_subpic_channel = + vout_RegisterOSDChannel( p_sys->p_vout ); + } + /* Parse and decode */ E_(ParsePacket)( p_dec ); diff --git a/modules/codec/spudec/spudec.h b/modules/codec/spudec/spudec.h index 3eaae0da07..6f68d2a0f9 100644 --- a/modules/codec/spudec/spudec.h +++ b/modules/codec/spudec/spudec.h @@ -2,7 +2,7 @@ * spudec.h : sub picture unit decoder thread interface ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN - * $Id: spudec.h,v 1.8 2003/11/22 19:55:47 fenrir Exp $ + * $Id$ * * Authors: Samuel Hocevar * @@ -30,6 +30,8 @@ struct decoder_sys_t int i_rle_size; int i_spu; + int i_subpic_channel; + block_t *p_block; uint8_t buffer[65536 + 20 ]; /* we will never overflow more than 11 bytes if I'm right */ diff --git a/modules/codec/subsdec.c b/modules/codec/subsdec.c index 93547c4699..0b1828f2e8 100644 --- a/modules/codec/subsdec.c +++ b/modules/codec/subsdec.c @@ -43,6 +43,9 @@ struct decoder_sys_t { int i_align; /* Subtitles alignment on the vout */ + int i_subpic_channel; /* Subpic channel for subtitles */ + + vout_thread_t *p_vout; /* last vout used */ #if defined(HAVE_ICONV) iconv_t iconv_handle; /* handle to iconv instance */ @@ -182,6 +185,8 @@ static int OpenDecoder( vlc_object_t *p_this ) msg_Dbg( p_dec, "no iconv support available" ); #endif + + p_dec->p_sys->p_vout = NULL; return VLC_SUCCESS; } @@ -204,6 +209,10 @@ static void DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_vout = vlc_object_find( p_dec, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout ) { + if( p_dec->p_sys->p_vout != p_vout ) + { + p_dec->p_sys->i_subpic_channel = vout_RegisterOSDChannel( p_vout ); + } ParseText( p_dec, *pp_block, p_vout ); vlc_object_release( p_vout ); } @@ -211,6 +220,7 @@ static void DecodeBlock( decoder_t *p_dec, block_t **pp_block ) { msg_Warn( p_dec, "couldn't find a video output, trashing subtitle" ); } + p_dec->p_sys->p_vout = p_vout; block_Release( *pp_block ); *pp_block = NULL; @@ -271,7 +281,7 @@ static void ParseText( decoder_t *p_dec, block_t *p_block, msg_Warn( p_dec, "subtitle without a date" ); return; } - + /* Check validity of packet data */ if( p_block->i_buffer <= 1 || p_block->p_buffer[0] == '\0' ) { @@ -281,7 +291,7 @@ static void ParseText( decoder_t *p_dec, block_t *p_block, /* Should be resiliant against bad subtitles */ psz_subtitle = strndup( p_block->p_buffer, p_block->i_buffer ); - + i_align_h = p_sys->i_align ? 20 : 0; i_align_v = 10; @@ -371,7 +381,7 @@ static void ParseText( decoder_t *p_dec, block_t *p_block, } } StripTags( psz_subtitle ); - vout_ShowTextAbsolute( p_vout, SUBT1_CHAN, psz_subtitle, NULL, + vout_ShowTextAbsolute( p_vout, p_sys->i_subpic_channel, psz_subtitle, NULL, OSD_ALIGN_BOTTOM | p_sys->i_align, i_align_h, i_align_v, p_block->i_pts, p_block->i_length ? p_block->i_pts + p_block->i_length : 0 ); @@ -421,4 +431,3 @@ static void StripTags( char *psz_text ) } psz_text[ i - i_left_moves ] = '\0'; } - diff --git a/modules/control/corba/mediacontrol-core.c b/modules/control/corba/mediacontrol-core.c index d7a412e206..94d0a249b1 100644 --- a/modules/control/corba/mediacontrol-core.c +++ b/modules/control/corba/mediacontrol-core.c @@ -742,8 +742,8 @@ mediacontrol_display_text( mediacontrol_Instance *self, mediacontrol_MediaTime, end->value ); - vout_ShowTextRelative( p_vout, SUBT1_CHAN, ( char* ) message, NULL, - OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20, + vout_ShowTextRelative( p_vout, DEFAULT_CHAN, ( char* ) message, NULL, + OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20, i_duration ); } else @@ -768,9 +768,9 @@ mediacontrol_display_text( mediacontrol_Instance *self, ( mediacontrol_Position * ) end ); i_fin += i_now; - vout_ShowTextAbsolute( p_vout, SUBT1_CHAN, ( char* )message, NULL, - OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20, - i_debut, i_fin ); + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, ( char* ) message, NULL, + OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20, + i_debut, i_fin ); } vlc_object_release( p_vout ); diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index 4639d5b66d..5c73be7dc1 100755 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -36,6 +36,12 @@ #include "vlc_keys.h" #define BUFFER_SIZE 10 + +#define CHANNELS_NUMBER 4 +#define VOLUME_TEXT_CHAN p_intf->p_sys->p_channels[ 0 ] +#define VOLUME_WIDGET_CHAN p_intf->p_sys->p_channels[ 1 ] +#define POSITION_TEXT_CHAN p_intf->p_sys->p_channels[ 2 ] +#define POSITION_WIDGET_CHAN p_intf->p_sys->p_channels[ 3 ] /***************************************************************************** * intf_sys_t: description and status of FB interface *****************************************************************************/ @@ -48,6 +54,8 @@ struct intf_sys_t int p_keys[ BUFFER_SIZE ]; /* buffer that contains * keyevents */ int i_size; /* number of events in buffer */ + int p_channels[ CHANNELS_NUMBER ]; /* contains registered + * channel IDs */ input_thread_t * p_input; /* pointer to input */ vout_thread_t * p_vout; /* pointer to vout object */ }; @@ -65,8 +73,9 @@ static int ActionKeyCB( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); static void PlayBookmark( intf_thread_t *, int ); static void SetBookmark ( intf_thread_t *, int ); -static void DisplayPosition( vout_thread_t *, input_thread_t * ); -static void DisplayVolume ( vout_thread_t *, audio_volume_t ); +static void DisplayPosition( intf_thread_t *, vout_thread_t *, input_thread_t * ); +static void DisplayVolume ( intf_thread_t *, vout_thread_t *, audio_volume_t ); +static void ClearChannels ( intf_thread_t *, vout_thread_t * ); /***************************************************************************** * Module descriptor @@ -163,6 +172,7 @@ static void Run( intf_thread_t *p_intf ) playlist_t *p_playlist; input_thread_t *p_input; vout_thread_t *p_vout = NULL; + vout_thread_t *p_last_vout; struct hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys; vlc_value_t val; int i; @@ -200,6 +210,7 @@ static void Run( intf_thread_t *p_intf ) p_input = p_intf->p_sys->p_input; /* Update the vout */ + p_last_vout = p_intf->p_sys->p_vout; if( p_vout == NULL ) { p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); @@ -212,6 +223,16 @@ static void Run( intf_thread_t *p_intf ) p_intf->p_sys->p_vout = NULL; } + /* Register OSD channels */ + if( p_vout && p_vout != p_last_vout ) + { + for( i = 0; i < CHANNELS_NUMBER; i++ ) + { + p_intf->p_sys->p_channels[ i ] = + vout_RegisterOSDChannel( p_vout ); + } + } + /* Find action triggered by hotkey */ i_action = 0; i_key = GetKey( p_intf ); @@ -233,20 +254,21 @@ static void Run( intf_thread_t *p_intf ) if( i_action == ACTIONID_QUIT ) { p_intf->p_vlc->b_die = VLC_TRUE; - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Quit" ) ); + ClearChannels( p_intf, p_vout ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Quit" ) ); continue; } else if( i_action == ACTIONID_VOL_UP ) { audio_volume_t i_newvol; aout_VolumeUp( p_intf, 1, &i_newvol ); - DisplayVolume( p_vout, i_newvol ); + DisplayVolume( p_intf, p_vout, i_newvol ); } else if( i_action == ACTIONID_VOL_DOWN ) { audio_volume_t i_newvol; aout_VolumeDown( p_intf, 1, &i_newvol ); - DisplayVolume( p_vout, i_newvol ); + DisplayVolume( p_intf, p_vout, i_newvol ); } else if( i_action == ACTIONID_VOL_MUTE ) { @@ -256,11 +278,13 @@ static void Run( intf_thread_t *p_intf ) { if( i_newvol == 0 ) { - vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_MUTE_ICON ); + ClearChannels( p_intf, p_vout ); + vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, + OSD_MUTE_ICON ); } else { - DisplayVolume( p_vout, i_newvol ); + DisplayVolume( p_intf, p_vout, i_newvol ); } } } @@ -273,7 +297,8 @@ static void Run( intf_thread_t *p_intf ) { i_delay--; input_Control( p_input, INPUT_SET_SUBDELAY, i_delay ); - vout_OSDMessage( p_intf, SOLO_CHAN, "Subtitle delay %i ms", + ClearChannels( p_intf, p_vout ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, "Subtitle delay %i ms", i_delay*100); } } @@ -285,7 +310,8 @@ static void Run( intf_thread_t *p_intf ) { i_delay++; input_Control( p_input, INPUT_SET_SUBDELAY, i_delay ); - vout_OSDMessage( p_intf, SOLO_CHAN, "Subtitle delay %i ms", + ClearChannels( p_intf, p_vout ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, "Subtitle delay %i ms", i_delay*100); } } @@ -313,7 +339,9 @@ static void Run( intf_thread_t *p_intf ) } if( p_input && val.i_int != PAUSE_S ) { - vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PAUSE_ICON ); + ClearChannels( p_intf, p_vout ); + vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, + OSD_PAUSE_ICON ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } @@ -323,7 +351,9 @@ static void Run( intf_thread_t *p_intf ) FIND_ANYWHERE ); if( p_playlist ) { - vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PLAY_ICON ); + ClearChannels( p_intf, p_vout ); + vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, + OSD_PLAY_ICON ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } @@ -335,7 +365,9 @@ static void Run( intf_thread_t *p_intf ) if( i_action == ACTIONID_PAUSE ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Pause" ) ); + ClearChannels( p_intf, p_vout ); + vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, + OSD_PAUSE_ICON ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } @@ -343,37 +375,37 @@ static void Run( intf_thread_t *p_intf ) { val.i_time = -10000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_10SEC && b_seekable ) { val.i_time = 10000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_BACKWARD_1MIN && b_seekable ) { val.i_time = -60000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_1MIN && b_seekable ) { val.i_time = 60000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_BACKWARD_5MIN && b_seekable ) { val.i_time = -300000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_5MIN && b_seekable ) { val.i_time = 300000000; var_Set( p_input, "time-offset", val ); - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_NEXT ) { @@ -417,7 +449,7 @@ static void Run( intf_thread_t *p_intf ) } else if( i_action == ACTIONID_POSITION && b_seekable ) { - DisplayPosition( p_vout, p_input ); + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action >= ACTIONID_PLAY_BOOKMARK1 && i_action <= ACTIONID_PLAY_BOOKMARK10 ) @@ -544,7 +576,8 @@ static void SetBookmark( intf_thread_t *p_intf, int i_num ) } } -static void DisplayPosition( vout_thread_t *p_vout, input_thread_t *p_input ) +static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout, + input_thread_t *p_input ) { char psz_duration[MSTRTIME_MAX_SIZE]; char psz_time[MSTRTIME_MAX_SIZE]; @@ -555,6 +588,7 @@ static void DisplayPosition( vout_thread_t *p_vout, input_thread_t *p_input ) { return; } + ClearChannels( p_intf, p_vout ); var_Get( p_input, "time", &time ); i_seconds = time.i_time / 1000000; @@ -564,37 +598,50 @@ static void DisplayPosition( vout_thread_t *p_vout, input_thread_t *p_input ) if( time.i_time > 0 ) { secstotimestr( psz_duration, time.i_time / 1000000 ); - vout_OSDMessage( p_input, POSITION_CHAN, "%s / %s", + vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s / %s", psz_time, psz_duration ); } else if( i_seconds > 0 ) { - vout_OSDMessage( p_input, POSITION_CHAN, psz_time ); + vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time ); } if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) { var_Get( p_input, "position", &pos ); - vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_CHAN, + vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN, pos.f_float * 100, OSD_HOR_SLIDER ); } } -static void DisplayVolume( vout_thread_t *p_vout, audio_volume_t i_vol ) +static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, + audio_volume_t i_vol ) { if( p_vout == NULL ) { return; } + ClearChannels( p_intf, p_vout ); if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) { - vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_CHAN, + vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN, i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER ); } else { - vout_OSDMessage( p_vout, VOLUME_CHAN, "Vol %d%%", + vout_OSDMessage( p_vout, VOLUME_TEXT_CHAN, "Vol %d%%", 2*i_vol*100/AOUT_VOLUME_MAX ); } } + +static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ) +{ + int i; + + vout_ClearOSDChannel( p_vout, DEFAULT_CHAN ); + for( i = 0; i < CHANNELS_NUMBER; i++ ) + { + vout_ClearOSDChannel( p_vout, p_intf->p_sys->p_channels[ i ] ); + } +} diff --git a/modules/control/lirc.c b/modules/control/lirc.c index 7c2a52c176..86a45d4e07 100644 --- a/modules/control/lirc.c +++ b/modules/control/lirc.c @@ -45,6 +45,8 @@ struct intf_sys_t struct lirc_config *config; vlc_mutex_t change_lock; + int i_osd_channel; + input_thread_t * p_input; vout_thread_t * p_vout; }; @@ -189,21 +191,21 @@ static void Run( intf_thread_t *p_intf ) if( !strcmp( c, "QUIT" ) ) { p_intf->p_vlc->b_die = VLC_TRUE; - vout_OSDMessage( p_intf, SOLO_CHAN, _("Quit" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Quit" ) ); continue; } else if( !strcmp( c, "VOL_UP" ) ) { audio_volume_t i_newvol; aout_VolumeUp( p_intf, 1, &i_newvol ); - vout_OSDMessage( p_intf, SOLO_CHAN, _("Vol %%%d"), + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %%%d"), i_newvol * 100 / AOUT_VOLUME_MAX ); } else if( !strcmp( c, "VOL_DOWN" ) ) { audio_volume_t i_newvol; aout_VolumeDown( p_intf, 1, &i_newvol ); - vout_OSDMessage( p_intf, SOLO_CHAN, _("Vol %%%d"), + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %%%d"), i_newvol * 100 / AOUT_VOLUME_MAX ); } else if( !strcmp( c, "MUTE" ) ) @@ -212,11 +214,11 @@ static void Run( intf_thread_t *p_intf ) aout_VolumeMute( p_intf, &i_newvol ); if( i_newvol == 0 ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Mute" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Mute" ) ); } else { - vout_OSDMessage( p_intf, SOLO_CHAN, _("Vol %d%%"), + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Vol %d%%"), i_newvol * 100 / AOUT_VOLUME_MAX ); } } @@ -305,7 +307,7 @@ static void Run( intf_thread_t *p_intf ) } if( p_input && val.i_int != PAUSE_S ) { - vout_OSDMessage( VLC_OBJECT(p_intf), SOLO_CHAN, + vout_OSDMessage( VLC_OBJECT(p_intf), DEFAULT_CHAN, _( "Pause" ) ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); @@ -320,7 +322,7 @@ static void Run( intf_thread_t *p_intf ) if( p_playlist->i_size ) { vlc_mutex_unlock( &p_playlist->object_lock ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Play" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Play" ) ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } @@ -367,7 +369,7 @@ static void Run( intf_thread_t *p_intf ) list.p_list->p_values[i+1] ); i++; } - vout_OSDMessage( VLC_OBJECT(p_input), SOLO_CHAN, + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Audio track: %s"), list2.p_list->p_values[i].psz_string ); } @@ -403,14 +405,14 @@ static void Run( intf_thread_t *p_intf ) var_Set( p_input, "spu-es", list.p_list->p_values[i+1] ); i = i + 1; } - vout_OSDMessage( VLC_OBJECT(p_input), SOLO_CHAN, + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), list2.p_list->p_values[i].psz_string ); } else if( !strcmp( c, "PAUSE" ) ) { vlc_value_t val; - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Pause" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Pause" ) ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index f3e26d672f..5f12f10661 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -56,7 +56,7 @@ } if( p_input && val.i_int != PAUSE_S ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Pause" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Pause" ) ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } @@ -70,7 +70,7 @@ if( p_playlist->i_size ) { vlc_mutex_unlock( &p_playlist->object_lock ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Play" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Play" ) ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } @@ -92,7 +92,7 @@ FIND_ANYWHERE ); if( p_playlist != NULL ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Stop" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Stop" ) ); playlist_Stop( p_playlist ); vlc_object_release( p_playlist ); } @@ -108,7 +108,7 @@ vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-faster", val ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Faster" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Faster" ) ); vlc_object_release( p_input ); } } @@ -123,7 +123,7 @@ vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-slower", val ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Slower" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Slower" ) ); vlc_object_release( p_input ); } } @@ -137,7 +137,7 @@ { playlist_Prev( p_playlist ); vlc_object_release( p_playlist ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Previous" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Previous" ) ); } } @@ -150,7 +150,7 @@ { playlist_Next( p_playlist ); vlc_object_release( p_playlist ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Next" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Next" ) ); } } @@ -170,11 +170,11 @@ var_Set( p_playlist, "random", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Random On" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random On" ) ); } else { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Random Off" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random Off" ) ); } p_intf->p_sys->b_playlist_update = VLC_TRUE; @@ -202,11 +202,11 @@ var_Set( p_playlist, "repeat", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat All" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); } else { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat Off" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } p_intf->p_sys->b_playlist_update = VLC_TRUE; @@ -234,11 +234,11 @@ var_Set( p_playlist, "loop", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat One" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); } else { - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat Off" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } p_intf->p_sys->b_playlist_update = VLC_TRUE; @@ -256,7 +256,7 @@ vlc_value_t time; time.i_time = 10 * 1000000; var_Set( p_input, "time-offset", time ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Jump +10 Seconds" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Jump +10 Seconds" ) ); vlc_object_release( p_input ); } } @@ -271,7 +271,7 @@ vlc_value_t time; time.i_time = -10 * 1000000; var_Set( p_input, "time-offset", time ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Jump -10 Seconds" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Jump -10 Seconds" ) ); vlc_object_release( p_input ); } } @@ -333,7 +333,7 @@ [o_volumeslider setFloatValue: (float)(i_volume / AOUT_VOLUME_STEP)]; - vout_OSDMessage( p_intf, SOLO_CHAN, "Vol %d%%", + vout_OSDMessage( p_intf, DEFAULT_CHAN, "Vol %d%%", i_volume*100/AOUT_VOLUME_MAX ); } diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index c9061139a2..fb73965d8c 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -545,7 +545,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ var_Set( p_playlist, "loop", val1 ); val1.b_bool = 1; var_Set( p_playlist, "repeat", val1 ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat One" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); break; case 2: @@ -553,7 +553,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ var_Set( p_playlist, "repeat", val1 ); val1.b_bool = 1; var_Set( p_playlist, "loop", val1 ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat All" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); break; default: @@ -564,7 +564,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ val1.b_bool = 0; var_Set( p_playlist, "repeat", val1 ); var_Set( p_playlist, "loop", val1 ); - vout_OSDMessage( p_intf, SOLO_CHAN, _( "Repeat Off" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } break; } diff --git a/modules/misc/freetype.c b/modules/misc/freetype.c index 7be8d7a49d..1a2078307d 100644 --- a/modules/misc/freetype.c +++ b/modules/misc/freetype.c @@ -706,8 +706,7 @@ static subpicture_t *AddText ( vout_thread_t *p_vout, int i_channel, p_subpic = 0; /* Create and initialize a subpicture */ - p_subpic = vout_CreateSubPicture( p_vout, i_channel, TEXT_CONTENT, - MEMORY_SUBPICTURE ); + p_subpic = vout_CreateSubPicture( p_vout, i_channel, MEMORY_SUBPICTURE ); if ( p_subpic == NULL ) { return NULL; diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 0ac229b083..1ab932ebd1 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -253,6 +253,10 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, /* No images in the heap */ p_vout->i_heap_size = 0; + /* Register the default subpicture channel */ + p_vout->p_default_channel = NULL; + p_vout->i_channel_count = 1; + /* Initialize the rendering heap */ I_RENDERPICTURES = 0; p_vout->render.i_width = i_width; diff --git a/src/video_output/video_widgets.c b/src/video_output/video_widgets.c index 674f4f92fd..fd368de693 100644 --- a/src/video_output/video_widgets.c +++ b/src/video_output/video_widgets.c @@ -382,8 +382,7 @@ subpicture_t *vout_CreateWidget( vout_thread_t *p_vout, int i_channel ) p_widget = 0; /* Create and initialize a subpicture */ - p_subpic = vout_CreateSubPicture( p_vout, i_channel, GRAPH_CONTENT, - MEMORY_SUBPICTURE ); + p_subpic = vout_CreateSubPicture( p_vout, i_channel, MEMORY_SUBPICTURE ); if( p_subpic == NULL ) { return NULL; @@ -493,29 +492,19 @@ void vout_OSDSlider( vlc_object_t *p_caller, int i_channel, int i_position, * Displays an OSD icon. * Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON *****************************************************************************/ -void vout_OSDIcon( vlc_object_t *p_caller, short i_type ) +void vout_OSDIcon( vlc_object_t *p_caller, int i_channel, short i_type ) { vout_thread_t *p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT, FIND_ANYWHERE ); subpicture_t *p_subpic; subpicture_sys_t *p_widget; - int i_x_margin, i_y_margin, i_channel; + int i_x_margin, i_y_margin; if( p_vout == NULL || !config_GetInt( p_caller, "osd" ) ) { return; } - switch( i_type ) - { - case OSD_SPEAKER_ICON: - i_channel = VOLUME_CHAN; - break; - default: - i_channel = SOLO_CHAN; - break; - } - p_subpic = vout_CreateWidget( p_vout, i_channel ); if( p_subpic == NULL ) { diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 0baa6e02a7..aed96f7b0c 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -42,7 +42,7 @@ * \param p_vout the video output this subpicture should be displayed on * \param p_subpic the subpicture to display */ -void vout_DisplaySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) +void vout_DisplaySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) { int i_margin; @@ -83,44 +83,20 @@ void vout_DisplaySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) * \return NULL on error, a reserved subpicture otherwise */ subpicture_t *vout_CreateSubPicture( vout_thread_t *p_vout, int i_channel, - int i_content, int i_type ) + int i_type ) { int i_subpic; /* subpicture index */ subpicture_t * p_subpic = NULL; /* first free subpicture */ - /* Get lock */ - vlc_mutex_lock( &p_vout->subpicture_lock ); - - /* - * Destroy all subpics which are not in the correct channel and - * subpics which are in the right channel and have the same content type - * (only concerns exclusive channels) - */ - if( i_channel >= BEGIN_EXCLUSIVE_CHAN ) + /* Clear the default channel before writing into it */ + if( i_channel == DEFAULT_CHAN ) { - for( i_subpic = 0; i_subpic < VOUT_MAX_SUBPICTURES; i_subpic++ ) - { - p_subpic = &p_vout->p_subpicture[i_subpic]; - if( p_subpic->i_status == FREE_SUBPICTURE - || ( p_subpic->i_status != RESERVED_SUBPICTURE - && p_subpic->i_status != READY_SUBPICTURE ) ) - { - continue; - } - if( ( p_subpic->i_channel != i_channel - && p_subpic->i_channel >= BEGIN_EXCLUSIVE_CHAN ) - || ( p_subpic->i_channel == i_channel - && p_subpic->i_content == i_content ) ) - { - if( p_subpic->pf_destroy ) - { - p_subpic->pf_destroy( p_subpic ); - } - p_subpic->i_status = FREE_SUBPICTURE; - } - } + vout_ClearOSDChannel( p_vout, DEFAULT_CHAN ); } + /* Get lock */ + vlc_mutex_lock( &p_vout->subpicture_lock ); + /* * Look for an empty place */ @@ -146,8 +122,6 @@ subpicture_t *vout_CreateSubPicture( vout_thread_t *p_vout, int i_channel, /* Copy subpicture information, set some default values */ p_subpic->i_channel = i_channel; - p_subpic->i_content = i_content; - p_subpic->i_type = i_type; p_subpic->i_status = RESERVED_SUBPICTURE; @@ -160,6 +134,12 @@ subpicture_t *vout_CreateSubPicture( vout_thread_t *p_vout, int i_channel, p_subpic->i_width = 0; p_subpic->i_height = 0; + /* Remain last subpicture displayed in DEFAULT_CHAN */ + if( i_channel == DEFAULT_CHAN ) + { + p_vout->p_default_channel = p_subpic; + } + vlc_mutex_unlock( &p_vout->subpicture_lock ); return p_subpic; @@ -337,3 +317,58 @@ subpicture_t *vout_SortSubPictures( vout_thread_t *p_vout, return p_subpic; } +/***************************************************************************** + * vout_RegisterOSDChannel: register an OSD channel + ***************************************************************************** + * This function affects an ID to an OSD channel + *****************************************************************************/ +int vout_RegisterOSDChannel( vout_thread_t *p_vout ) +{ + msg_Dbg( p_vout, "Registering OSD channel, ID: %i", p_vout->i_channel_count + 1 ); + return ++p_vout->i_channel_count; +} + +/***************************************************************************** + * vout_ClearOSDChannel: clear an OSD channel + ***************************************************************************** + * This function destroys the subpictures which belong to the OSD channel + * corresponding to i_channel_id. + *****************************************************************************/ +void vout_ClearOSDChannel( vout_thread_t *p_vout, int i_channel ) +{ + int i_subpic; /* subpicture index */ + subpicture_t * p_subpic = NULL; /* first free subpicture */ + + if( i_channel == DEFAULT_CHAN ) + { + if( p_vout->p_default_channel != NULL ) + { + vout_DestroySubPicture( p_vout, p_vout->p_default_channel ); + } + p_vout->p_default_channel = NULL; + return; + } + + vlc_mutex_lock( &p_vout->subpicture_lock ); + + for( i_subpic = 0; i_subpic < VOUT_MAX_SUBPICTURES; i_subpic++ ) + { + p_subpic = &p_vout->p_subpicture[i_subpic]; + if( p_subpic->i_status == FREE_SUBPICTURE + || ( p_subpic->i_status != RESERVED_SUBPICTURE + && p_subpic->i_status != READY_SUBPICTURE ) ) + { + continue; + } + if( p_subpic->i_channel == i_channel ) + { + if( p_subpic->pf_destroy ) + { + p_subpic->pf_destroy( p_subpic ); + } + p_subpic->i_status = FREE_SUBPICTURE; + } + } + + vlc_mutex_unlock( &p_vout->subpicture_lock ); +}