]> git.sesse.net Git - vlc/commitdiff
* src/video_output/vout_subpictures.c : New OSD channels
authorYoann Peronneau <yoann@videolan.org>
Thu, 17 Jun 2004 03:37:03 +0000 (03:37 +0000)
committerYoann Peronneau <yoann@videolan.org>
Thu, 17 Jun 2004 03:37:03 +0000 (03:37 +0000)
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.

24 files changed:
doc/developer/video_output.xml
include/osd.h
include/video_output.h
include/vlc_video.h
modules/codec/cmml/intf.c
modules/codec/dvbsub.c
modules/codec/ogt/cvd.c
modules/codec/ogt/cvd_parse.c
modules/codec/ogt/ogt.c
modules/codec/ogt/ogt_parse.c
modules/codec/ogt/subtitle.h
modules/codec/spudec/parse.c
modules/codec/spudec/spudec.c
modules/codec/spudec/spudec.h
modules/codec/subsdec.c
modules/control/corba/mediacontrol-core.c
modules/control/hotkeys.c
modules/control/lirc.c
modules/gui/macosx/controls.m
modules/gui/macosx/playlist.m
modules/misc/freetype.c
src/video_output/video_output.c
src/video_output/video_widgets.c
src/video_output/vout_subpictures.c

index 47a43a69bf1090d79a3190a81f5064370791cd24..3cdb855e508e9966fc2ad338438d2461825ee4d5 100644 (file)
@@ -126,8 +126,9 @@ and <function> vout_DatePicture </function> upon necessary.
 
       <listitem> <para> <type> subpicture_t * </type> <function>
       vout_CreateSubPicture </function> <parameter> ( vout_thread_t *p_vout,
-      int i_type, int i_size ) </parameter> :
-      Returns an allocated subpicture buffer. <parameter> i_type
+      int i_channel, int i_type ) </parameter> :
+      Returns an allocated subpicture buffer. <parameter> i_channel
+      </parameter> is the ID of the subpicture channel, <parameter> i_type
       </parameter> is <constant> DVD_SUBPICTURE </constant> or
       <constant> TEXT_SUBPICTURE</constant>, <parameter> i_size
       </parameter> is the length in bytes of the packet.
index 97bcdc4bd54d535d5c08c7885750d744bff2093b..9bd1f49edc1ce785908c261bf9a3e2125a962ffc 100644 (file)
@@ -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 ) );
index 08bfce59632ad23ef08a704187f6b418874d3c8c..1770ecfd8a2730c322d3f215343190247969d159 100644 (file)
@@ -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 *,
index bbbe2594610e8eb8fe28807755ff123525b283b7..4c938e188f013dd9f629be4a8a873f64a1aebf46 100644 (file)
@@ -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
  *****************************************************************************/
index 511b9b33b7bfc2d81ab28c436c80f8b5e70ad3a4..360208398f3e0517cbefcf05dd5bc76b5f232a73 100644 (file)
@@ -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 )
         {
index 89648b50c16b254da44e6c3d240dba798daa3bc8..957c9100fe78f0fe371b29460f13ab6ead3e1a38 100644 (file)
@@ -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 )
             {
index 04423495f3da51afea99cad0856b3f4bc4ef4974..ed6c5d633ccccc35f7f9ab894bbc8cb1a24215cb 100644 (file)
@@ -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;
 }
index 79a4ed063e847dbfdbfd151d716615bb9f435fac..a1916fa29b4c4e3b18df3503556bb5c9214061b4 100644 (file)
@@ -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 )
     {
index 80b3e8fd2111aecfcd5df1510da8d83138c87655..359d3e3761e4b115725e92cf524b0821001ac3ec 100644 (file)
@@ -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 )
 }
 
 \f
-/* 
+/*
  * Local variables:
  *  c-file-style: "gnu"
  *  tab-width: 8
index 09dfea8cb63987ee35c7197103bdabb223018467..b2b0b248741451bd6af313525f6ef3b4049db065 100644 (file)
@@ -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 )
     {
index fac2fc09a985986e48b5a931f0f6148e9377540c..4e553003744f65e575f667c5b66b3aa720ba6387 100644 (file)
@@ -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 " \
     )
 
 #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
 
 
 /* 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 */
 
 };
index bbad591d7b32c1fa0ca63f989a1c4bc84b051d55..6ada5fd7391794a4bb0406e60e5035f86a3b7f13 100644 (file)
@@ -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 )
     {
index 37f643ffd0f7f532885060d57f2bf8528007cd7d..ca8f481595838e342493a865d2fb4f2282df27c6 100644 (file)
@@ -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 <sam@zoy.org>
  *          Laurent Aimar <fenrir@via.ecp.fr>
@@ -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 );
 
index 3eaae0da07352df078e9250dc8407fba48a4887f..6f68d2a0f96b484a85dfabe6a4e8a3afe620cda3 100644 (file)
@@ -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 <sam@zoy.org>
  *
@@ -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 */
index 93547c46990464820bcf8b5cf860116435edc8c6..0b1828f2e8526bb6f3dc18362ed6c7ae21c1586b 100644 (file)
@@ -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';
 }
-                            
index d7a412e206c70d9d5b616fd32acf03da009f3933..94d0a249b1975394fac6f3bef6a8a8edd632874f 100644 (file)
@@ -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 );
index 4639d5b66dafb6a107270af4875b1b4e7ead6506..5c73be7dc1c9a0f344a0d857de026711fd33c0df 100755 (executable)
 #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 ] );
+    }
+}
index 7c2a52c17666a7917350b2961fd41ff6bcde60a2..86a45d4e07f9172665a8bbad5a9f411137d4d4ee 100644 (file)
@@ -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 );
                 }
index f3e26d672f12afb16b486ac593548d39649224b5..5f12f1066129cd5e0934926bbdc5cbf18b7b69b7 100644 (file)
@@ -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 );
     }
         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 );
     }
 }
         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 );
     }
 }
     {
         playlist_Prev( p_playlist );
         vlc_object_release( p_playlist );
-        vout_OSDMessage( p_intf, SOLO_CHAN, _( "Previous" ) );
+        vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Previous" ) );
     }
 }
 
     {
         playlist_Next( p_playlist );
         vlc_object_release( p_playlist );
-        vout_OSDMessage( p_intf, SOLO_CHAN, _( "Next" ) );
+        vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Next" ) );
     }
 }
 
     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;
     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;    
     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;
         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 );
     }
 }
         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 );
     }
 }
 
     [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 );
 }
 
index c9061139a2dc890efd70d60c937b741903afa27d..fb73965d8c6e28c9bdeecaccb73eb821c3204ad6 100644 (file)
@@ -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;
      }
index 7be8d7a49df7dbefb2a3c159914572b946ec8fae..1a2078307d4b9a4dd6f4336ffe285f069905319d 100644 (file)
@@ -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;
index 0ac229b0831552d7f01fa3813e9458c0ea7a04bf..1ab932ebd1094fa014a1c93786ac4d71aa5b062a 100644 (file)
@@ -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;
index 674f4f92fd9677452a07493f2d338dd2f3eab203..fd368de69320ae6b21f195f83fd1960dab736c05 100644 (file)
@@ -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 )
     {
index 0baa6e02a7ca3d26cd262ff49c8c50598583ef35..aed96f7b0c66f7fa2ea289b7105fc9462e51d90d 100644 (file)
@@ -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 );
+}