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.
* 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>
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;
/* 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>
*
#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); \
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 );
+ }
+
}
/*****************************************************************************
{
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)" );
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)" );
*****************************************************************************/
#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 )
{
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
* 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>
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" );
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" ) );
* 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 */
* 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 )
* 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>
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 )
{
* 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>
*
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 ..." );
*/
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
* 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>
*
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;