]> git.sesse.net Git - vlc/commitdiff
*p_es->p_demux_data is available in p_config->p_demux_data so that the input
authorStéphane Borel <stef@videolan.org>
Thu, 14 Mar 2002 01:35:28 +0000 (01:35 +0000)
committerStéphane Borel <stef@videolan.org>
Thu, 14 Mar 2002 01:35:28 +0000 (01:35 +0000)
can pass information directly to the decoder.

*First application: aspect ratio for DVD is read from the ifo (should fix
the buf with aspect ratio in anamorphic DVDs).

*The DVD plugin also copy the spu yuv palette in p_demux_data so that the
spudec can display subtitle with the right color (sam !).

*Removed duplicate code and useless lock in gtk.

include/input_ext-dec.h
plugins/dvd/dvd_es.c
plugins/gtk/gtk_menu.c
plugins/mpeg_vdec/vpar_headers.c
plugins/spudec/spu_decoder.c
src/input/input_dec.c

index c4e03932ad1bf4690c5b1ad9e4c582c17682c323..8b7a2a1c0f1c3e2773dc0d1fbe27e6f7fc9110d7 100644 (file)
@@ -2,7 +2,7 @@
  * input_ext-dec.h: structures exported to the VideoLAN decoders
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: input_ext-dec.h,v 1.53 2002/03/01 00:33:17 massiot Exp $
+ * $Id: input_ext-dec.h,v 1.54 2002/03/14 01:35:28 stef Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Michel Kaempf <maxx@via.ecp.fr>
@@ -532,6 +532,7 @@ typedef struct decoder_config_s
     u16                     i_id;
     u8                      i_type;         /* type of the elementary stream */
 
+    void *                  p_demux_data;
     struct stream_ctrl_s *  p_stream_ctrl;
     struct decoder_fifo_s * p_decoder_fifo;
 } decoder_config_t;
index ea3c8db143b5c7b7965f77174de3c6a688053acd..13498ee3cd47139a9565fd93e065779e06626148 100644 (file)
@@ -1,7 +1,7 @@
 /* dvd_es.c: functions to find and select ES
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: dvd_es.c,v 1.4 2002/03/12 18:37:46 stef Exp $
+ * $Id: dvd_es.c,v 1.5 2002/03/14 01:35:28 stef Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -70,9 +70,9 @@ void DVDLaunchDecoders( input_thread_t * p_input );
 #define vmg p_dvd->p_ifo->vmg
 #define vts p_dvd->p_ifo->vts
 
-#define ADDES( stream_id, private_id, type, cat, lang )                 \
+#define ADDES( stream_id, private_id, type, cat, lang, size )           \
     i_id = ( (private_id) << 8 ) | (stream_id);                         \
-    p_es = input_AddES( p_input, NULL, i_id, 0 );                       \
+    p_es = input_AddES( p_input, NULL, i_id, size );                    \
     p_es->i_stream_id = (stream_id);                                    \
     p_es->i_type = (type);                                              \
     p_es->i_cat = (cat);                                                \
@@ -90,13 +90,24 @@ void DVDReadVideo( input_thread_t * p_input )
     thread_dvd_data_t * p_dvd;
     es_descriptor_t *   p_es;
     int                 i_id;
+    int                 i_ratio;
 
     p_dvd = (thread_dvd_data_t*)(p_input->p_access_data);
 
     /* ES 0 -> video MPEG2 */
     IfoPrintVideo( p_dvd );
-
-    ADDES( 0xe0, 0, MPEG2_VIDEO_ES, VIDEO_ES, 0 );
+    i_ratio = vts.manager_inf.video_attr.i_ratio;
+    
+    if( i_ratio )
+    {
+        ADDES( 0xe0, 0, MPEG2_VIDEO_ES, VIDEO_ES, 0, sizeof(int) );
+        *(int*)(p_es->p_demux_data) = i_ratio;
+    }
+    else
+    {
+        ADDES( 0xe0, 0, MPEG2_VIDEO_ES, VIDEO_ES, 0, 0 );
+    }
+        
 }
 
 /*****************************************************************************
@@ -132,7 +143,7 @@ void DVDReadAudio( input_thread_t * p_input )
             {
             case 0x00:              /* AC3 */
                 ADDES( 0xbd, 0x80 + audio_status.i_position,
-                       AC3_AUDIO_ES, AUDIO_ES, i_lang );
+                       AC3_AUDIO_ES, AUDIO_ES, i_lang, 0 );
                 p_es->b_audio = 1;
                 strcat( p_es->psz_desc, " (ac3)" );
 
@@ -140,14 +151,14 @@ void DVDReadAudio( input_thread_t * p_input )
             case 0x02:
             case 0x03:              /* MPEG audio */
                 ADDES( 0xc0 + audio_status.i_position, 0,
-                       MPEG2_AUDIO_ES, AUDIO_ES, i_lang );
+                       MPEG2_AUDIO_ES, AUDIO_ES, i_lang, 0 );
                 p_es->b_audio = 1;
                 strcat( p_es->psz_desc, " (mpeg)" );
 
                 break;
             case 0x04:              /* LPCM */
                 ADDES( 0xbd, 0xa0 + audio_status.i_position,
-                       LPCM_AUDIO_ES, AUDIO_ES, i_lang );
+                       LPCM_AUDIO_ES, AUDIO_ES, i_lang, 0 );
                 p_es->b_audio = 1;
                 strcat( p_es->psz_desc, " (lpcm)" );
 
@@ -172,6 +183,8 @@ void DVDReadAudio( input_thread_t * p_input )
  *****************************************************************************/
 #define spu_status \
     vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_spu_status[i-1]
+#define palette \
+    vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_yuv_color
 
 void DVDReadSPU( input_thread_t * p_input )
 {
@@ -214,11 +227,22 @@ void DVDReadSPU( input_thread_t * p_input )
                 i_id = spu_status.i_position_43;
             }
 
-            ADDES( 0xbd, 0x20 + i_id, DVD_SPU_ES, SPU_ES,
-                   vts.manager_inf.p_spu_attr[i-1].i_lang_code );
+            if( vmg.title.pi_yuv_color )
+            {
+                ADDES( 0xbd, 0x20 + i_id, DVD_SPU_ES, SPU_ES,
+                       vts.manager_inf.p_spu_attr[i-1].i_lang_code,
+                       16*sizeof(u32) );
+                memcpy( p_es->p_demux_data, palette, 16*sizeof(u32) ); 
+            }
+            else
+            {
+                ADDES( 0xbd, 0x20 + i_id, DVD_SPU_ES, SPU_ES,
+                   vts.manager_inf.p_spu_attr[i-1].i_lang_code, 0 );
+            }
         }
     }
 }
+#undef palette
 #undef spu_status
 
 #undef vts
index f4355398293911c7a3c17a2b1cfca38ad97dca20..9651920a23e35f552b16d2b103863a5d9aa2c67e 100644 (file)
@@ -2,7 +2,7 @@
  * gtk_menu.c : functions to handle menu items.
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_menu.c,v 1.22 2002/03/06 01:20:56 stef Exp $
+ * $Id: gtk_menu.c,v 1.23 2002/03/14 01:35:28 stef Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -246,7 +246,6 @@ void GtkMenubarChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
     intf_thread_t * p_intf;
     input_area_t *  p_area;
     gint            i_chapter;
-    char            psz_chapter[5];
     GtkWidget *     p_popup_menu;
 
     p_intf    = GetIntf( GTK_WIDGET(menuitem), "intf_window" );
@@ -258,10 +257,6 @@ void GtkMenubarChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
         p_area->i_part = i_chapter;
         input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );
 
-        snprintf( psz_chapter, 4, "%02d", p_area->i_part );
-        psz_chapter[ 4 ] = '\0';
-        gtk_label_set_text( p_intf->p_sys->p_label_chapter, psz_chapter );
-
         p_intf->p_sys->b_chapter_update = 1;
         p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( 
                              p_intf->p_sys->p_popup ), "popup_navigation" ) );
@@ -382,10 +377,8 @@ static gint GtkRadioMenu( intf_thread_t * p_intf,
      * We have to release the lock since input_ToggleES needs it */
     if( p_item_selected != NULL )
     {
-        vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_item_selected ),
                                         TRUE );
-        vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
     }
 
     /* be sure that menu is sensitive, if there are several items */
@@ -841,10 +834,8 @@ static gint GtkTitleMenu( gpointer       p_data,
      * We have to release the lock since input_ToggleES needs it */
     if( p_item_active != NULL )
     {
-        vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_item_active ),
                                         TRUE );
-        vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
     }
 #if 0
     if( p_input_bank->pp_input[0]->stream.i_area_nb > 1 )
index 3dbf36e5e2914206125b868356e59300f0c2f4f0..d232a608189234d675a87e1d084f071ea1333e92 100644 (file)
@@ -2,7 +2,7 @@
  * vpar_headers.c : headers parsing
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: vpar_headers.c,v 1.15 2002/02/27 22:57:10 sam Exp $
+ * $Id: vpar_headers.c,v 1.16 2002/03/14 01:35:28 stef Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -421,6 +421,12 @@ static void SequenceHeader( vpar_thread_t * p_vpar )
         p_vpar->sequence.i_chroma_format = CHROMA_420;
     }
 
+    /* check whether the input gives a particular aspect ratio */
+    if( p_vpar->p_config->p_demux_data )
+    {
+        i_aspect = *(int*)(p_vpar->p_config->p_demux_data);
+    }
+
     /* Store calculated aspect ratio */
     switch( i_aspect )
     {
index 411d0f5a2c3636c7739099ff7ee74e3b88b1ce4a..b5c251180e351fc6ff79746942bd69024f4b85ea 100644 (file)
@@ -2,7 +2,7 @@
  * spu_decoder.c : spu decoder thread
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: spu_decoder.c,v 1.10 2002/02/19 00:50:19 sam Exp $
+ * $Id: spu_decoder.c,v 1.11 2002/03/14 01:35:28 stef Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -102,6 +102,8 @@ static int decoder_Probe( u8 *pi_type )
 static int decoder_Run( decoder_config_t * p_config )
 {
     spudec_thread_t *     p_spudec;
+    int                   i;
+    u32 *                 pi_yuv_color;
    
     intf_WarnMsg( 3, "spudec: thread launched. Initializing ..." );
 
@@ -128,6 +130,17 @@ static int decoder_Run( decoder_config_t * p_config )
      */
     p_spudec->p_fifo->b_error = InitThread( p_spudec );
 
+    pi_yuv_color = p_config->p_demux_data;
+    for( i=0 ; i<16 ; i++ )
+    {
+        intf_WarnMsg( 12, "spudec info: 0x%02x 0x%02x 0x%02x 0x%02x",
+                          *((u8*)(pi_yuv_color)),
+                          *((u8*)(pi_yuv_color) + 1),
+                          *((u8*)(pi_yuv_color) + 2),
+                          *((u8*)(pi_yuv_color) + 3));
+        pi_yuv_color++;
+    }
+
     /*
      * Main loop - it is not executed if an error occured during
      * initialization
index 5adfd4a46d4f7053c07cb2497e23126f9cec6db8..9a8f14f5926401ba1913d9b24244f898b8fbbc41 100644 (file)
@@ -2,7 +2,7 @@
  * input_dec.c: Functions for the management of decoders
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.30 2002/03/11 07:23:09 gbazin Exp $
+ * $Id: input_dec.c,v 1.31 2002/03/14 01:35:28 stef Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -247,6 +247,8 @@ static decoder_config_t * CreateDecoderConfig( input_thread_t * p_input,
 
     p_config->i_id = p_es->i_id;
     p_config->i_type = p_es->i_type;
+    p_config->p_demux_data = p_es->p_demux_data;
+    
     p_config->p_stream_ctrl = &p_input->stream.control;
 
     p_config->p_decoder_fifo->p_first = NULL;