* control the pace of reading.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: input_ext-intf.h,v 1.36 2001/05/01 12:22:18 sam Exp $
+ * $Id: input_ext-intf.h,v 1.37 2001/05/19 00:39:29 stef Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/* if (b_seekable) : */
int i_area_nb;
- input_area_t ** pp_areas; /* list of areas in stream == offset
- * interval with own properties */
+ input_area_t ** pp_areas; /* list of areas in stream == offset
+ * interval with own properties */
input_area_t * p_selected_area;
+ input_area_t * p_new_area; /* Newly selected area from
+ * the interface */
+
u32 i_mux_rate; /* the rate we read the stream (in
* units of 50 bytes/s) ; 0 if undef */
es_descriptor_t ** pp_es; /* carried elementary streams */
int i_selected_es_number;
es_descriptor_t ** pp_selected_es; /* ES with a decoder */
+ es_descriptor_t * p_newly_selected_es; /* ES selected from
+ * the interface */
+ es_descriptor_t * p_removed_es; /* ES removed from the interface */
+
/* Stream control */
stream_ctrl_t control;
int input_ToggleES ( struct input_thread_s *,
struct es_descriptor_s *,
boolean_t );
+int input_ChangeArea( input_thread_t *, input_area_t * );
+
# Objects
#
-PLUGIN_C = dvd.o input_dvd.o dvd_netlist.o dvd_ioctl.o dvd_ifo.o dvd_udf.o dvd_css.o
+PLUGIN_C = dvd.o input_dvd.o dvd_netlist.o dvd_ioctl.o dvd_ifo.o dvd_udf.o dvd_css.o dvd_summary.o
BUILTIN_C = $(PLUGIN_C:%.o=BUILTIN_%.o)
ALL_OBJ = $(PLUGIN_C) $(BUILTIN_C)
* dvd_css.c: Functions for DVD authentification and unscrambling
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_css.c,v 1.28 2001/05/07 03:14:09 stef Exp $
+ * $Id: dvd_css.c,v 1.29 2001/05/19 00:39:29 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
#include "dvd_csstables.h"
#endif /* HAVE_CSS */
#include "dvd_ioctl.h"
-#include "dvd_ifo.h"
#include "input_dvd.h"
* dvd_css.h: Structures for DVD authentification and unscrambling
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_css.h,v 1.7 2001/04/11 04:31:59 sam Exp $
+ * $Id: dvd_css.h,v 1.8 2001/05/19 00:39:29 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
dvd_key_t pi_title_key;
} css_t;
+/*****************************************************************************
+ * Prototypes in dvd_css.c
+ *****************************************************************************/
+struct css_s;
+
+int CSSTest ( int );
+int CSSInit ( int, struct css_s * );
+int CSSGetKey ( int, struct css_s * );
+int CSSDescrambleSector ( u8 * , u8 * );
* dvd_ifo.c: Functions for ifo parsing
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_ifo.c,v 1.26 2001/05/07 04:42:42 sam Exp $
+ * $Id: dvd_ifo.c,v 1.27 2001/05/19 00:39:29 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
#include "intf_msg.h"
#include "dvd_ifo.h"
#include "dvd_udf.h"
-#include "dvd_css.h"
#include "input_dvd.h"
/*
off_t i_off;
off_t i_start;
u64 i_temp;
+ u16 i_short;
int i, j;
if( p_ifo->vts.b_initialized )
/* FIXME : take care of endianness */
}
DumpBits( p_ifo, pi_buffer, &p_current, 2 );
-// GETS( &manager_inf.video_atrt );
-DumpBits( p_ifo, pi_buffer, &p_current, 2 );
+
+ i_short = ReadWord( p_ifo, pi_buffer, &p_current );
+ i_short >>= 2;
+ manager_inf.video_attr.i_mode = i_short & 0x1;
+ i_short >>= 1;
+ manager_inf.video_attr.i_letterboxed = i_short & 0x1;
+ i_short >>= 1;
+ manager_inf.video_attr.i_source_res = i_short & 0x3;
+ i_short >>= 2;
+ manager_inf.video_attr.i_line21_2 = i_short & 0x1;
+ i_short >>= 1;
+ manager_inf.video_attr.i_line21_1 = i_short & 0x1;
+ i_short >>= 1;
+ manager_inf.video_attr.i_perm_displ = i_short & 0x3;
+ i_short >>= 2;
+ manager_inf.video_attr.i_ratio = i_short & 0x3;
+ i_short >>= 2;
+ manager_inf.video_attr.i_system = i_short & 0x3;
+ i_short >>= 2;
+ manager_inf.video_attr.i_compression = i_short & 0x3;
+
DumpBits( p_ifo, pi_buffer, &p_current, 1 );
manager_inf.i_audio_nb = ReadByte( p_ifo, pi_buffer, &p_current );
//fprintf( stderr, "vtsi audio nb : %d\n", manager_inf.i_audio_nb );
i_temp = hton64( i_temp ) >> 16;
//fprintf( stderr, "Subpic %d: %llx\n", i, i_temp );
manager_inf.p_spu_attr[i].i_caption = i_temp & 0xff;
- i_temp >>= 16;
+ i_temp >>= 8;
+ manager_inf.p_spu_attr[i].i_foo = i_temp & 0xff;
+ i_temp >>= 8;
manager_inf.p_spu_attr[i].i_lang_code = i_temp & 0xffff;
i_temp >>= 16;
manager_inf.p_spu_attr[i].i_prefix = i_temp & 0xffff;
u8 pi_buffer[DVD_LB_SIZE];
u8 * p_current;
off_t i_start;
+ u16 i_audio;
+ u32 i_spu;
int i;
p_current = FillBuffer( p_ifo, pi_buffer, i_pos );
p_title->i_prohibited_user_op = ReadDouble( p_ifo, pi_buffer, &p_current );
for( i = 0 ; i < 8 ; i++ )
{
- p_title->pi_audio_status[i] = ReadWord( p_ifo, pi_buffer, &p_current );
+ i_audio = ReadWord( p_ifo, pi_buffer, &p_current );
+ p_title->pi_audio_status[i].i_foo = i_audio & 0xff;
+ i_audio >>= 8;
+ p_title->pi_audio_status[i].i_position = i_audio & 0x07;
+ i_audio >>= 7;
+ p_title->pi_audio_status[i].i_available = i_audio;
}
for( i = 0 ; i < 32 ; i++ )
{
- p_title->pi_subpic_status[i] = ReadDouble( p_ifo, pi_buffer, &p_current );
+ i_spu = ReadDouble( p_ifo, pi_buffer, &p_current );
+ p_title->pi_spu_status[i].i_position_pan = i_spu & 0x1f;
+ i_spu >>= 8;
+ p_title->pi_spu_status[i].i_position_letter = i_spu & 0x1f;
+ i_spu >>= 8;
+ p_title->pi_spu_status[i].i_position_wide = i_spu & 0x1f;
+ i_spu >>= 8;
+ p_title->pi_spu_status[i].i_position_43 = i_spu & 0x1f;
+ i_spu >>= 7;
+ p_title->pi_spu_status[i].i_available = i_spu;
}
p_title->i_next_title_num = ReadWord( p_ifo, pi_buffer, &p_current );
p_title->i_prev_title_num = ReadWord( p_ifo, pi_buffer, &p_current );
* dvd_ifo.h: Structures for ifo parsing
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: dvd_ifo.h,v 1.14 2001/04/22 00:08:25 stef Exp $
+ * $Id: dvd_ifo.h,v 1.15 2001/05/19 00:39:30 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
u8 i_bar ;// 8; // 0x00000000 ?
} ifo_audio_t;
+/* Audio Status */
+typedef struct audio_status_s
+{
+ u8 i_available; // 1
+ u8 i_position; // 7
+ u8 i_foo; // 8
+} audio_status_t;
+
typedef struct ifo_spu_t
{
u16 i_prefix ;// 16; // 0x0100 ?
u8 i_caption ;// 8; // 0x00 ?
} ifo_spu_t;
+/* Subpicture status */
+typedef struct spu_status_s
+{
+ u8 i_available; //1
+ u8 i_position_43; //7
+ u8 i_position_wide; //8
+ u8 i_position_letter; //8
+ u8 i_position_pan; //8
+} spu_status_t;
/* Ifo vitual machine Commands */
u8 i_cell_nb; // 1 byte
u32 i_play_time; // 4 bytes
u32 i_prohibited_user_op; // 4 bytes
- u16 pi_audio_status[8]; // 8*2 bytes
- u32 pi_subpic_status[32]; // 32*4 bytes
+ audio_status_t pi_audio_status[8]; // 8*2 bytes
+ spu_status_t pi_spu_status[32]; // 32*4 bytes
u16 i_next_title_num; // 2 bytes
u16 i_prev_title_num; // 2 bytes
u16 i_go_up_title_num; // 2 bytes
vts_t vts; /* Vts ifo for current title set */
} ifo_t;
+
+/*****************************************************************************
+ * Prototypes in dvd_ifo.c
+ *****************************************************************************/
+struct thread_dvd_data_s;
+
+int IfoCreate ( struct thread_dvd_data_s * );
+int IfoInit ( struct ifo_s * );
+int IfoTitleSet ( struct ifo_s * );
+void IfoDestroy ( struct ifo_s * );
--- /dev/null
+/*****************************************************************************
+ * dvd_summary.c: set of functions to print options of selected title
+ * found in .ifo.
+ *****************************************************************************
+ * Copyright (C) 1998-2001 VideoLAN
+ * $Id: dvd_summary.c,v 1.1 2001/05/19 00:39:30 stef Exp $
+ *
+ * Author: Stéphane Borel <stef@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include "defs.h"
+
+#ifdef HAVE_CSS
+#define MODULE_NAME dvd
+#else /* HAVE_CSS */
+#define MODULE_NAME dvdnocss
+#endif /* HAVE_CSS */
+#include "modules_inner.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <netinet/in.h>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <string.h>
+#ifdef STRNCASECMP_IN_STRINGS_H
+# include <strings.h>
+#endif
+#include <errno.h>
+
+#include "config.h"
+#include "common.h"
+#include "threads.h"
+#include "mtime.h"
+#include "tests.h"
+
+#include "intf_msg.h"
+
+#include "main.h"
+
+#include "dvd_ifo.h"
+#include "input_dvd.h"
+
+#include "debug.h"
+
+#include "modules.h"
+
+/*****************************************************************************
+ * Local tables
+ *****************************************************************************/
+static struct
+{
+ char p_code[3];
+ char p_lang_long[20];
+}
+
+lang_tbl[] =
+{
+ /* The ISO 639 language codes.
+ * Language names with * prefix are not spelled in their own language
+ */
+ { " ", "Not Specified" },
+ { "aa", "*Afar" },
+ { "ab", "*Abkhazian" },
+ { "af", "*Afrikaans" },
+ { "am", "*Amharic" },
+ { "ar", "*Arabic" },
+ { "as", "*Assamese" },
+ { "ay", "*Aymara" },
+ { "az", "*Azerbaijani" },
+ { "ba", "*Bashkir" },
+ { "be", "*Byelorussian" },
+ { "bg", "*Bulgarian" },
+ { "bh", "*Bihari" },
+ { "bi", "*Bislama" },
+ { "bn", "*Bengali; Bangla" },
+ { "bo", "*Tibetan" },
+ { "br", "*Breton" },
+ { "ca", "*Catalan" },
+ { "co", "*Corsican" },
+ { "cs", "*Czech(Ceske)" },
+ { "cy", "*Welsh" },
+ { "da", "Dansk" },
+ { "de", "Deutsch" },
+ { "dz", "*Bhutani" },
+ { "el", "*Greek" },
+ { "en", "English" },
+ { "eo", "*Esperanto" },
+ { "es", "Espanol" },
+ { "et", "*Estonian" },
+ { "eu", "*Basque" },
+ { "fa", "*Persian" },
+ { "fi", "Suomi" },
+ { "fj", "*Fiji" },
+ { "fo", "*Faroese" },
+ { "fr", "Francais" },
+ { "fy", "*Frisian" },
+ { "ga", "*Irish" },
+ { "gd", "*Scots Gaelic" },
+ { "gl", "*Galician" },
+ { "gn", "*Guarani" },
+ { "gu", "*Gujarati" },
+ { "ha", "*Hausa" },
+ { "he", "*Hebrew" }, /* formerly iw */
+ { "hi", "*Hindi" },
+ { "hr", "Hrvatski" }, /* Croatian */
+ { "hu", "Magyar" },
+ { "hy", "*Armenian" },
+ { "ia", "*Interlingua" },
+ { "id", "*Indonesian" }, /* formerly in */
+ { "ie", "*Interlingue" },
+ { "ik", "*Inupiak" },
+ { "in", "*Indonesian" }, /* replaced by id */
+ { "is", "Islenska" },
+ { "it", "Italiano" },
+ { "iu", "*Inuktitut" },
+ { "iw", "*Hebrew" }, /* replaced by he */
+ { "ja", "*Japanese" },
+ { "ji", "*Yiddish" }, /* replaced by yi */
+ { "jw", "*Javanese" },
+ { "ka", "*Georgian" },
+ { "kk", "*Kazakh" },
+ { "kl", "*Greenlandic" },
+ { "km", "*Cambodian" },
+ { "kn", "*Kannada" },
+ { "ko", "*Korean" },
+ { "ks", "*Kashmiri" },
+ { "ku", "*Kurdish" },
+ { "ky", "*Kirghiz" },
+ { "la", "*Latin" },
+ { "ln", "*Lingala" },
+ { "lo", "*Laothian" },
+ { "lt", "*Lithuanian" },
+ { "lv", "*Latvian, Lettish" },
+ { "mg", "*Malagasy" },
+ { "mi", "*Maori" },
+ { "mk", "*Macedonian" },
+ { "ml", "*Malayalam" },
+ { "mn", "*Mongolian" },
+ { "mo", "*Moldavian" },
+ { "mr", "*Marathi" },
+ { "ms", "*Malay" },
+ { "mt", "*Maltese" },
+ { "my", "*Burmese" },
+ { "na", "*Nauru" },
+ { "ne", "*Nepali" },
+ { "nl", "Nederlands" },
+ { "no", "Norsk" },
+ { "oc", "*Occitan" },
+ { "om", "*(Afan) Oromo" },
+ { "or", "*Oriya" },
+ { "pa", "*Punjabi" },
+ { "pl", "*Polish" },
+ { "ps", "*Pashto, Pushto" },
+ { "pt", "Portugues" },
+ { "qu", "*Quechua" },
+ { "rm", "*Rhaeto-Romance" },
+ { "rn", "*Kirundi" },
+ { "ro", "*Romanian" },
+ { "ru", "*Russian" },
+ { "rw", "*Kinyarwanda" },
+ { "sa", "*Sanskrit" },
+ { "sd", "*Sindhi" },
+ { "sg", "*Sangho" },
+ { "sh", "*Serbo-Croatian" },
+ { "si", "*Sinhalese" },
+ { "sk", "*Slovak" },
+ { "sl", "*Slovenian" },
+ { "sm", "*Samoan" },
+ { "sn", "*Shona" },
+ { "so", "*Somali" },
+ { "sq", "*Albanian" },
+ { "sr", "*Serbian" },
+ { "ss", "*Siswati" },
+ { "st", "*Sesotho" },
+ { "su", "*Sundanese" },
+ { "sv", "Svenska" },
+ { "sw", "*Swahili" },
+ { "ta", "*Tamil" },
+ { "te", "*Telugu" },
+ { "tg", "*Tajik" },
+ { "th", "*Thai" },
+ { "ti", "*Tigrinya" },
+ { "tk", "*Turkmen" },
+ { "tl", "*Tagalog" },
+ { "tn", "*Setswana" },
+ { "to", "*Tonga" },
+ { "tr", "*Turkish" },
+ { "ts", "*Tsonga" },
+ { "tt", "*Tatar" },
+ { "tw", "*Twi" },
+ { "ug", "*Uighur" },
+ { "uk", "*Ukrainian" },
+ { "ur", "*Urdu" },
+ { "uz", "*Uzbek" },
+ { "vi", "*Vietnamese" },
+ { "vo", "*Volapuk" },
+ { "wo", "*Wolof" },
+ { "xh", "*Xhosa" },
+ { "yi", "*Yiddish" }, /* formerly ji */
+ { "yo", "*Yoruba" },
+ { "za", "*Zhuang" },
+ { "zh", "*Chinese" },
+ { "zu", "*Zulu" },
+ { "\0", "" }
+};
+
+/*
+ * Local tools to decode some data in ifo
+ */
+
+/*****************************************************************************
+ * IfoLanguage: gives the long language name from the two-letters
+ * ISO-639 code
+ *****************************************************************************/
+char * IfoLanguage( u16 i_code )
+{
+ int i = 0;
+
+ while( memcmp( lang_tbl[i].p_code, &i_code, 2 ) &&
+ lang_tbl[i].p_lang_long[0] )
+ {
+ i++;
+ }
+
+ return lang_tbl[i].p_lang_long;
+}
+
+
+/****************************************************************************
+ * IfoPrintTitle
+ ****************************************************************************/
+void IfoPrintTitle( thread_dvd_data_t * p_dvd )
+{
+ intf_WarnMsg( 5, "***************************************************" );
+ intf_WarnMsg( 5, "dvd info: title: %d", p_dvd->i_title );
+ intf_WarnMsg( 5, " vobstart at: %lld", p_dvd->i_start );
+ intf_WarnMsg( 5, " stream size: %lld", p_dvd->i_size );
+ intf_WarnMsg( 5, " number of chapters: %d", p_dvd->i_chapter_nb );
+ intf_WarnMsg( 5, " number of angles: %d", p_dvd->i_angle_nb );
+ intf_WarnMsg( 5, "***************************************************\n" );
+}
+
+/****************************************************************************
+ * IfoPrintVideo
+ ****************************************************************************/
+#define video p_dvd->p_ifo->vts.manager_inf.video_attr
+void IfoPrintVideo( thread_dvd_data_t * p_dvd )
+{
+ char psz_ratio[12];
+ char psz_perm_displ[4][23] =
+ {
+ "pan-scan & letterboxed",
+ "pan-scan",
+ "letterboxed",
+ "not specified"
+ };
+ char psz_source_res[4][28] =
+ {
+ "720x480 ntsc or 720x576 pal",
+ "704x480 ntsc or 704x576 pal",
+ "352x480 ntsc or 352x576 pal",
+ "352x240 ntsc or 352x288 pal"
+ };
+
+
+ switch( video.i_ratio )
+ {
+ case 0:
+ sprintf( psz_ratio, "4:3" );
+ break;
+ case 3:
+ sprintf( psz_ratio, "16:9" );
+ break;
+ default:
+ sprintf( psz_ratio, "undef" );
+ break;
+ }
+
+ intf_WarnMsg( 5, "***********************************************" );
+ intf_WarnMsg( 5, "dvd info: video" );
+ intf_WarnMsg( 5, " compression: mpeg-%d", video.i_compression+1 );
+ intf_WarnMsg( 5, " tv system: %s Hz",
+ video.i_system ? "pal 625/50" : "ntsc 525/60" );
+ intf_WarnMsg( 5, " aspect ratio: %s", psz_ratio );
+ intf_WarnMsg( 5, " display mode: %s",
+ psz_perm_displ[video.i_perm_displ] );
+ intf_WarnMsg( 5, " line21-1: %s",
+ video.i_line21_1 ? "data present in GOP" : "" );
+ intf_WarnMsg( 5, " line21-2: %s",
+ video.i_line21_2 ? "data present in GOP" : "" );
+ intf_WarnMsg( 5, " source res: %s",
+ psz_source_res[video.i_source_res] );
+ intf_WarnMsg( 5, " letterboxed: %s",
+ video.i_letterboxed ? "yes" : "no" );
+ intf_WarnMsg( 5, " mode: %s",
+ video.i_mode ? "film (625/50 only)" : "camera");
+ intf_WarnMsg( 5, "***********************************************\n" );
+}
+#undef video
+
+/****************************************************************************
+ * IfoPrintAudio
+ ****************************************************************************/
+#define audio p_dvd->p_ifo->vts.manager_inf.p_audio_attr[i-1]
+#define audio_status \
+ p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_audio_status[i-1]
+void IfoPrintAudio( thread_dvd_data_t * p_dvd, int i )
+{
+
+ if( audio_status.i_available )
+ {
+ char ppsz_mode[7][9] =
+ { "ac3", "unknown", "mpeg-1", "mpeg-2", "lpcm", "sdds", "dts" };
+ char ppsz_appl_mode[3][15] =
+ { "not specified", "karaoke", "surround sound" };
+ char psz_caption[25];
+ char ppsz_quant[4][10] =
+ { "16 bits", "20 bits", "24 bits", "drc" };
+
+ intf_WarnMsg( 5, "***********************************************" );
+ intf_WarnMsg( 5, "dvd info: audio %d" , i );
+ intf_WarnMsg( 5, " language: %s",
+ IfoLanguage( hton16( audio.i_lang_code ) ) );
+ intf_WarnMsg( 5, " mode: %s", ppsz_mode[audio.i_coding_mode & 0x7] );
+ intf_WarnMsg( 5, " channel(s): %d %s",
+ audio.i_num_channels + 1,
+ audio.i_multichannel_extension ? "ext." : "" );
+ intf_WarnMsg( 5, " sampling: %d Hz",
+ audio.i_sample_freq ? 96000 : 48000 );
+ intf_WarnMsg( 5, " appl_mode: %s",
+ ppsz_appl_mode[audio.i_appl_mode & 0x2] );
+ switch( audio.i_caption )
+ {
+ case 1:
+ sprintf( psz_caption, "normal caption" );
+ break;
+ case 3:
+ sprintf( psz_caption, "directors comments" );
+ break;
+ default:
+ sprintf( psz_caption, " " );
+ break;
+ }
+ intf_WarnMsg( 5, " caption: %s", psz_caption );
+ intf_WarnMsg( 5, " quantization: %s",
+ ppsz_quant[audio.i_quantization & 0x3] );
+
+ intf_WarnMsg( 5, " status: %x", audio_status.i_position );
+ intf_WarnMsg( 5, "***********************************************\n" );
+ }
+
+
+}
+#undef audio_status
+#undef audio
+
+/****************************************************************************
+ * IfoPrintSpu
+ ****************************************************************************/
+#define spu p_dvd->p_ifo->vts.manager_inf.p_spu_attr[i-1]
+#define spu_status \
+ p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_spu_status[i-1]
+
+void IfoPrintSpu( thread_dvd_data_t * p_dvd, int i )
+{
+ if( spu_status.i_available )
+ {
+ intf_WarnMsg( 5, "***********************************************" );
+ intf_WarnMsg( 5, "dvd info: spu %d", i );
+ intf_WarnMsg( 5, " caption: %d", spu.i_caption );
+ intf_WarnMsg( 5, " language: %s",
+ IfoLanguage( hton16( spu.i_lang_code ) ) );
+ intf_WarnMsg( 5, " prefix: %x", spu.i_prefix );
+
+ intf_WarnMsg( 5, " status: 4:3 %x wide %x letter %x pan %x",
+ spu_status.i_position_43,
+ spu_status.i_position_wide,
+ spu_status.i_position_letter,
+ spu_status.i_position_pan );
+ intf_WarnMsg( 5, "***********************************************\n" );
+ }
+
+}
+#undef spu_status
+#undef spu
--- /dev/null
+/*****************************************************************************
+ * dvd_summary.h: prototype of functions that print out current options.
+ *****************************************************************************
+ * Copyright (C) 1999-2001 VideoLAN
+ * $Id: dvd_summary.h,v 1.1 2001/05/19 00:39:30 stef Exp $
+ *
+ * Author: Stéphane Borel <stef@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+struct thread_dvd_data_s;
+
+char * IfoLanguage( u16 );
+void IfoPrintTitle( struct thread_dvd_data_s * );
+void IfoPrintVideo( struct thread_dvd_data_s * );
+void IfoPrintAudio( struct thread_dvd_data_s *, int );
+void IfoPrintSpu ( struct thread_dvd_data_s *, int );
+
+
* -dvd_udf to find files
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.59 2001/05/15 14:49:47 stef Exp $
+ * $Id: input_dvd.c,v 1.60 2001/05/19 00:39:30 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
#include "dvd_netlist.h"
#include "dvd_ifo.h"
#include "dvd_css.h"
+#include "dvd_summary.h"
#include "input_dvd.h"
#include "mpeg_system.h"
#include "modules.h"
-/*****************************************************************************
- * Local tables
- *****************************************************************************/
-static struct
-{
- char p_code[3];
- char p_lang_long[20];
-}
-
-lang_tbl[] =
-{
- /* The ISO 639 language codes.
- * Language names with * prefix are not spelled in their own language
- */
- { " ", "Not Specified" },
- { "aa", "*Afar" },
- { "ab", "*Abkhazian" },
- { "af", "*Afrikaans" },
- { "am", "*Amharic" },
- { "ar", "*Arabic" },
- { "as", "*Assamese" },
- { "ay", "*Aymara" },
- { "az", "*Azerbaijani" },
- { "ba", "*Bashkir" },
- { "be", "*Byelorussian" },
- { "bg", "*Bulgarian" },
- { "bh", "*Bihari" },
- { "bi", "*Bislama" },
- { "bn", "*Bengali; Bangla" },
- { "bo", "*Tibetan" },
- { "br", "*Breton" },
- { "ca", "*Catalan" },
- { "co", "*Corsican" },
- { "cs", "*Czech(Ceske)" },
- { "cy", "*Welsh" },
- { "da", "Dansk" },
- { "de", "Deutsch" },
- { "dz", "*Bhutani" },
- { "el", "*Greek" },
- { "en", "English" },
- { "eo", "*Esperanto" },
- { "es", "Espanol" },
- { "et", "*Estonian" },
- { "eu", "*Basque" },
- { "fa", "*Persian" },
- { "fi", "Suomi" },
- { "fj", "*Fiji" },
- { "fo", "*Faroese" },
- { "fr", "Francais" },
- { "fy", "*Frisian" },
- { "ga", "*Irish" },
- { "gd", "*Scots Gaelic" },
- { "gl", "*Galician" },
- { "gn", "*Guarani" },
- { "gu", "*Gujarati" },
- { "ha", "*Hausa" },
- { "he", "*Hebrew" }, /* formerly iw */
- { "hi", "*Hindi" },
- { "hr", "Hrvatski" }, /* Croatian */
- { "hu", "Magyar" },
- { "hy", "*Armenian" },
- { "ia", "*Interlingua" },
- { "id", "*Indonesian" }, /* formerly in */
- { "ie", "*Interlingue" },
- { "ik", "*Inupiak" },
- { "in", "*Indonesian" }, /* replaced by id */
- { "is", "Islenska" },
- { "it", "Italiano" },
- { "iu", "*Inuktitut" },
- { "iw", "*Hebrew" }, /* replaced by he */
- { "ja", "*Japanese" },
- { "ji", "*Yiddish" }, /* replaced by yi */
- { "jw", "*Javanese" },
- { "ka", "*Georgian" },
- { "kk", "*Kazakh" },
- { "kl", "*Greenlandic" },
- { "km", "*Cambodian" },
- { "kn", "*Kannada" },
- { "ko", "*Korean" },
- { "ks", "*Kashmiri" },
- { "ku", "*Kurdish" },
- { "ky", "*Kirghiz" },
- { "la", "*Latin" },
- { "ln", "*Lingala" },
- { "lo", "*Laothian" },
- { "lt", "*Lithuanian" },
- { "lv", "*Latvian, Lettish" },
- { "mg", "*Malagasy" },
- { "mi", "*Maori" },
- { "mk", "*Macedonian" },
- { "ml", "*Malayalam" },
- { "mn", "*Mongolian" },
- { "mo", "*Moldavian" },
- { "mr", "*Marathi" },
- { "ms", "*Malay" },
- { "mt", "*Maltese" },
- { "my", "*Burmese" },
- { "na", "*Nauru" },
- { "ne", "*Nepali" },
- { "nl", "Nederlands" },
- { "no", "Norsk" },
- { "oc", "*Occitan" },
- { "om", "*(Afan) Oromo" },
- { "or", "*Oriya" },
- { "pa", "*Punjabi" },
- { "pl", "*Polish" },
- { "ps", "*Pashto, Pushto" },
- { "pt", "Portugues" },
- { "qu", "*Quechua" },
- { "rm", "*Rhaeto-Romance" },
- { "rn", "*Kirundi" },
- { "ro", "*Romanian" },
- { "ru", "*Russian" },
- { "rw", "*Kinyarwanda" },
- { "sa", "*Sanskrit" },
- { "sd", "*Sindhi" },
- { "sg", "*Sangho" },
- { "sh", "*Serbo-Croatian" },
- { "si", "*Sinhalese" },
- { "sk", "*Slovak" },
- { "sl", "*Slovenian" },
- { "sm", "*Samoan" },
- { "sn", "*Shona" },
- { "so", "*Somali" },
- { "sq", "*Albanian" },
- { "sr", "*Serbian" },
- { "ss", "*Siswati" },
- { "st", "*Sesotho" },
- { "su", "*Sundanese" },
- { "sv", "Svenska" },
- { "sw", "*Swahili" },
- { "ta", "*Tamil" },
- { "te", "*Telugu" },
- { "tg", "*Tajik" },
- { "th", "*Thai" },
- { "ti", "*Tigrinya" },
- { "tk", "*Turkmen" },
- { "tl", "*Tagalog" },
- { "tn", "*Setswana" },
- { "to", "*Tonga" },
- { "tr", "*Turkish" },
- { "ts", "*Tsonga" },
- { "tt", "*Tatar" },
- { "tw", "*Twi" },
- { "ug", "*Uighur" },
- { "uk", "*Ukrainian" },
- { "ur", "*Urdu" },
- { "uz", "*Uzbek" },
- { "vi", "*Vietnamese" },
- { "vo", "*Volapuk" },
- { "wo", "*Wolof" },
- { "xh", "*Xhosa" },
- { "yi", "*Yiddish" }, /* formerly ji */
- { "yo", "*Yoruba" },
- { "za", "*Zhuang" },
- { "zh", "*Chinese" },
- { "zu", "*Zulu" },
- { "\0", "" }
-};
-
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int DVDRewind ( struct input_thread_s * );
/* called only inside */
-static char * Language( u16 );
static int DVDChooseAngle( thread_dvd_data_t * );
static int DVDFindCell( thread_dvd_data_t * );
static int DVDFindSector( thread_dvd_data_t * );
#undef input
}
-/*
- * Local tools to decode some data in ifo
- */
-
-/*****************************************************************************
- * Language: gives the long language name from the two-letters ISO-639 code
- *****************************************************************************/
-static char * Language( u16 i_code )
-{
- int i = 0;
-
- while( memcmp( lang_tbl[i].p_code, &i_code, 2 ) &&
- lang_tbl[i].p_lang_long[0] )
- {
- i++;
- }
-
- return lang_tbl[i].p_lang_long;
-}
-
/*
* Data reading functions
*/
int i_chapter;
int i;
- /* I don't want DVDs to start playing immediately */
-// p_input->stream.i_new_status = PAUSE_S;
-
p_dvd = malloc( sizeof(thread_dvd_data_t) );
if( p_dvd == NULL )
{
/* reading several block once seems to cause lock-up
* when using input_ToggleES
* who wrote thez damn buggy piece of shit ??? --stef */
- p_dvd->i_block_once = 1;//32;
- p_input->i_read_once = 8;//128;
+ p_dvd->i_block_once = 32;
+ p_input->i_read_once = 128;
i = CSSTest( p_input->i_handle );
if( i < 0 )
{
+ intf_ErrMsg( "dvd error: error in css" );
free( p_dvd );
p_input->b_error = 1;
return;
p_area = p_input->stream.pp_areas[i_title];
- vlc_mutex_unlock( &p_input->stream.stream_lock );
-
/* set title, chapter, audio and subpic */
DVDSetArea( p_input, p_area );
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+
return;
}
/*****************************************************************************
* DVDSetArea: initialize input data for title x, chapter y.
- * It should be called for each user navigation request, and to change
- * audio or sub-picture streams.
- * ---
+ * It should be called for each user navigation request.
+ *****************************************************************************
* Take care that i_title starts from 0 (vmg) and i_chapter start from 1.
- * i_audio, i_spu start from 1 ; 0 means off.
- * A negative value for an argument means it does not change
+ * Note that you have to take the lock before entering here.
*****************************************************************************/
static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
{
thread_dvd_data_t * p_dvd;
es_descriptor_t * p_es;
+ u16 i_id;
+ int i_vts_title;
int i_audio;
int i_spu;
- u16 i_id;
- u8 i_ac3;
- u8 i_mpeg;
- u8 i_lpcm;
- u8 i_sub_pic;
- u8 i;
+ int i;
int j;
- boolean_t b_last;
p_dvd = (thread_dvd_data_t*)p_input->p_plugin_data;
- vlc_mutex_lock( &p_input->stream.stream_lock );
-
/* we can't use the interface slider until initilization is complete */
p_input->stream.b_seekable = 0;
p_input->stream.p_selected_area =
p_input->stream.pp_areas[p_area->i_id];
+ /* release the lock to to let the interface go */
// vlc_mutex_unlock( &p_input->stream.stream_lock );
/* title number: it is not vts nb!,
p_dvd->i_title = p_area->i_id;
p_dvd->p_ifo->i_title = p_dvd->i_title;
- /* uodate title environnement variable so that we don't
- * loop on the same title forever */
-// main_PutIntVariable( INPUT_TITLE_VAR, p_dvd->i_title + 1 );
+ /* set number of chapters of current title */
+ p_dvd->i_chapter_nb = p_area->i_part_nb;
/* ifo vts */
if( IfoTitleSet( p_dvd->p_ifo ) < 0 )
#define vmg p_dvd->p_ifo->vmg
#define vts p_dvd->p_ifo->vts
/* title position inside the selected vts */
- p_dvd->i_vts_title =
- vmg.title_inf.p_attr[p_dvd->i_title-1].i_title_num;
+ i_vts_title = vmg.title_inf.p_attr[p_dvd->i_title-1].i_title_num;
p_dvd->i_title_id =
- vts.title_inf.p_title_start[p_dvd->i_vts_title-1].i_title_id;
+ vts.title_inf.p_title_start[i_vts_title-1].i_title_id;
intf_WarnMsg( 3, "dvd: title %d vts_title %d pgc %d",
p_dvd->i_title,
- p_dvd->i_vts_title,
+ i_vts_title,
p_dvd->i_title_id );
/* css title key for current vts */
p_dvd->i_size -= (off_t)( p_dvd->i_sector + 1 ) *DVD_LB_SIZE;
- intf_WarnMsg( 2, "dvd info: title: %d", p_dvd->i_title );
- intf_WarnMsg( 2, "dvd info: vobstart at: %lld", p_dvd->i_start );
- intf_WarnMsg( 2, "dvd info: stream size: %lld", p_dvd->i_size );
- intf_WarnMsg( 2, "dvd info: number of chapters: %d",
- vmg.title_inf.p_attr[p_dvd->i_title-1].i_chapter_nb );
- intf_WarnMsg( 2, "dvd info: number of angles: %d", p_dvd->i_angle_nb );
+ IfoPrintTitle( p_dvd );
// vlc_mutex_lock( &p_input->stream.stream_lock );
p_es = NULL;
/* ES 0 -> video MPEG2 */
+ IfoPrintVideo( p_dvd );
+
p_es = input_AddES( p_input, p_input->stream.pp_programs[0], 0xe0, 0 );
p_es->i_stream_id = 0xe0;
p_es->i_type = MPEG2_VIDEO_ES;
{
input_SelectES( p_input, p_es );
}
+ intf_WarnMsg( 4, "dvd info: video selected" );
+#define audio_status \
+ vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_audio_status[i-1]
/* Audio ES, in the order they appear in .ifo */
-
- i_ac3 = 0x7f;
- i_mpeg = 0xc0;
- i_lpcm = 0x9f;
-
for( i = 1 ; i <= vts.manager_inf.i_audio_nb ; i++ )
{
+ IfoPrintAudio( p_dvd, i );
- intf_WarnMsg( 5, "dvd info: audio %d: %x %x %x %x %x %x %x %x %x %x %x %x", i,
- vts.manager_inf.p_audio_attr[i-1].i_num_channels,
- vts.manager_inf.p_audio_attr[i-1].i_coding_mode,
- vts.manager_inf.p_audio_attr[i-1].i_multichannel_extension,
- vts.manager_inf.p_audio_attr[i-1].i_type,
- vts.manager_inf.p_audio_attr[i-1].i_appl_mode,
- vts.manager_inf.p_audio_attr[i-1].i_foo,
- vts.manager_inf.p_audio_attr[i-1].i_test,
- vts.manager_inf.p_audio_attr[i-1].i_bar,
- vts.manager_inf.p_audio_attr[i-1].i_quantization,
- vts.manager_inf.p_audio_attr[i-1].i_sample_freq,
- vts.manager_inf.p_audio_attr[i-1].i_lang_code,
- vts.manager_inf.p_audio_attr[i-1].i_caption );
-
- switch( vts.manager_inf.p_audio_attr[i-1].i_coding_mode )
+ /* audio channel is active if first byte is 0x80 */
+ if( audio_status.i_available )
{
- case 0x00: /* AC3 */
- i_id = ( ( i_ac3 + i ) << 8 ) | 0xbd;
- p_es = input_AddES( p_input,
- p_input->stream.pp_programs[0], i_id, 0 );
- p_es->i_stream_id = 0xbd;
- p_es->i_type = AC3_AUDIO_ES;
- p_es->b_audio = 1;
- p_es->i_cat = AUDIO_ES;
- strcpy( p_es->psz_desc, Language( hton16(
- vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
- strcat( p_es->psz_desc, " (ac3)" );
-
- intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
- i, p_es->psz_desc, i_id );
-
- break;
- case 0x02:
- case 0x03: /* MPEG audio */
- i_id = 0xbf + i;
- p_es = input_AddES( p_input,
+ switch( vts.manager_inf.p_audio_attr[i-1].i_coding_mode )
+ {
+ case 0x00: /* AC3 */
+ i_id = ( ( 0x80 + audio_status.i_position ) << 8 ) | 0xbd;
+ p_es = input_AddES( p_input,
+ p_input->stream.pp_programs[0], i_id, 0 );
+ p_es->i_stream_id = 0xbd;
+ p_es->i_type = AC3_AUDIO_ES;
+ p_es->b_audio = 1;
+ p_es->i_cat = AUDIO_ES;
+ strcpy( p_es->psz_desc, IfoLanguage( hton16(
+ vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
+ strcat( p_es->psz_desc, " (ac3)" );
+
+ intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
+ i, p_es->psz_desc, i_id );
+
+ break;
+ case 0x02:
+ case 0x03: /* MPEG audio */
+ i_id = 0xc0 + audio_status.i_position;
+ p_es = input_AddES( p_input,
p_input->stream.pp_programs[0], i_id, 0 );
- p_es->i_stream_id = i_id;
- p_es->i_type = MPEG2_AUDIO_ES;
- p_es->b_audio = 1;
- p_es->i_cat = AUDIO_ES;
- strcpy( p_es->psz_desc, Language( hton16(
- vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
- strcat( p_es->psz_desc, " (mpeg)" );
-
- intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
- i, p_es->psz_desc, i_id );
-
- break;
- case 0x04: /* LPCM */
-#if 0
- i_id = ( ( i_lpcm + i ) << 8 ) | 0xbd;
- p_es = input_AddES( p_input,
+ p_es->i_stream_id = i_id;
+ p_es->i_type = MPEG2_AUDIO_ES;
+ p_es->b_audio = 1;
+ p_es->i_cat = AUDIO_ES;
+ strcpy( p_es->psz_desc, IfoLanguage( hton16(
+ vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
+ strcat( p_es->psz_desc, " (mpeg)" );
+
+ intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
+ i, p_es->psz_desc, i_id );
+
+ break;
+ case 0x04: /* LPCM */
+
+ i_id = ( ( 0xa0 + audio_status.i_position ) << 8 ) | 0xbd;
+ p_es = input_AddES( p_input,
p_input->stream.pp_programs[0], i_id, 0 );
- p_es->i_stream_id = i_id;
- p_es->i_type = LPCM_AUDIO_ES;
- p_es->b_audio = 1;
- p_es->i_cat = AUDIO_ES;
- strcpy( p_es->psz_desc, Language( hton16(
- vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
- strcat( p_es->psz_desc, " (lpcm)" );
-
- intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
- i, p_es->psz_desc, i_id );
-#else
- i_id = 0;
- intf_ErrMsg( "dvd warning: LPCM audio not handled yet" );
-#endif
- break;
- case 0x06: /* DTS */
- i_id = 0;
- i_ac3--;
- intf_ErrMsg( "dvd warning: DTS audio not handled yet" );
- break;
- default:
- i_id = 0;
- intf_ErrMsg( "dvd warning: unknown audio type %.2x",
- vts.manager_inf.p_audio_attr[i-1].i_coding_mode );
+ p_es->i_stream_id = i_id;
+ p_es->i_type = LPCM_AUDIO_ES;
+ p_es->b_audio = 1;
+ p_es->i_cat = AUDIO_ES;
+ strcpy( p_es->psz_desc, IfoLanguage( hton16(
+ vts.manager_inf.p_audio_attr[i-1].i_lang_code ) ) );
+ strcat( p_es->psz_desc, " (lpcm)" );
+
+ intf_WarnMsg( 3, "dvd info: audio stream %d %s\t(0x%x)",
+ i, p_es->psz_desc, i_id );
+ break;
+ case 0x06: /* DTS */
+ i_id = ( ( 0x88 + audio_status.i_position ) << 8 ) | 0xbd;
+ intf_ErrMsg( "dvd warning: DTS audio not handled yet"
+ "(0x%x)", i_id );
+ break;
+ default:
+ i_id = 0;
+ intf_ErrMsg( "dvd warning: unknown audio type %.2x",
+ vts.manager_inf.p_audio_attr[i-1].i_coding_mode );
+ }
}
-
}
-
+#undef audio_status
+#define spu_status \
+ vts.title_unit.p_title[p_dvd->i_title_id-1].title.pi_spu_status[i-1]
+
/* Sub Picture ES */
- b_last = 0;
- i_sub_pic = 0x20;
for( i = 1 ; i <= vts.manager_inf.i_spu_nb; i++ )
{
- if( !b_last )
+ IfoPrintSpu( p_dvd, i );
+
+ if( spu_status.i_available )
{
- i_id = ( i_sub_pic++ << 8 ) | 0xbd;
+ /* there are several streams for one spu */
+ if( vts.manager_inf.video_attr.i_ratio )
+ {
+ /* 16:9 */
+ switch( vts.manager_inf.video_attr.i_perm_displ )
+ {
+ case 1:
+ i_id = ( ( 0x20 + spu_status.i_position_pan ) << 8 )
+ | 0xbd;
+ break;
+ case 2:
+ i_id = ( ( 0x20 + spu_status.i_position_letter ) << 8 )
+ | 0xbd;
+ break;
+ default:
+ i_id = ( ( 0x20 + spu_status.i_position_wide ) << 8 )
+ | 0xbd;
+ break;
+ }
+ }
+ else
+ {
+ /* 4:3 */
+ i_id = ( ( 0x20 + spu_status.i_position_43 ) << 8 )
+ | 0xbd;
+ }
p_es = input_AddES( p_input,
p_input->stream.pp_programs[0], i_id, 0 );
p_es->i_stream_id = 0xbd;
p_es->i_type = DVD_SPU_ES;
p_es->i_cat = SPU_ES;
- strcpy( p_es->psz_desc, Language( hton16(
+ strcpy( p_es->psz_desc, IfoLanguage( hton16(
vts.manager_inf.p_spu_attr[i-1].i_lang_code ) ) );
intf_WarnMsg( 3, "dvd info: spu stream %d %s\t(0x%x)",
i, p_es->psz_desc, i_id );
-
- /* The before the last spu has a 0x0 prefix */
- b_last =
- ( vts.manager_inf.p_spu_attr[i].i_prefix == 0 );
}
}
-
+#undef spu_status
if( p_main->b_audio )
{
/* For audio: first one if none or a not existing one specified */
p_dvd->i_chapter = 1;
}
}
+
#define title \
p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_title_id-1].title
-
if( p_area->i_angle != p_dvd->i_angle )
{
if( title.p_cell_play[p_dvd->i_prg_cell].i_category & 0xf000 )
/* warn interface that something has changed */
p_input->stream.b_seekable = 1;
p_input->stream.b_changed = 1;
-intf_WarnMsg( 3, "Pos: %lld Size: %lld", p_input->stream.p_selected_area->i_tell,p_input->stream.p_selected_area->i_size );
- vlc_mutex_unlock( &p_input->stream.stream_lock );
+ p_input->stream.pp_programs[0]->i_synchro_state = SYNCHRO_REINIT;
return 0;
}
{
thread_dvd_data_t * p_dvd;
dvd_netlist_t * p_netlist;
- input_area_t * p_area;
struct iovec * p_vec;
struct data_packet_s * pp_data[p_input->i_read_once];
u8 * pi_cur;
p_input->stream.p_selected_area->i_tell = i_off -
p_input->stream.p_selected_area->i_start;
p_input->stream.p_selected_area->i_part = p_dvd->i_chapter;
-intf_WarnMsg( 2, "chapter %d", p_dvd->i_chapter);
+
/* the synchro has to be reinitialized when we change cell */
p_input->stream.pp_programs[0]->i_synchro_state = SYNCHRO_REINIT;
p_input->stream.p_selected_area->i_tell += i_read_bytes;
b_eot = !( p_input->stream.p_selected_area->i_tell < p_dvd->i_size );
b_eof = b_eot && ( ( p_dvd->i_title + 1 ) >= p_input->stream.i_area_nb );
- p_area = p_input->stream.pp_areas[p_dvd->i_title + 1];
vlc_mutex_unlock( &p_input->stream.stream_lock );
if( b_eot )
{
- intf_WarnMsg( 3, "dvd info: new title" );
+ intf_WarnMsg( 4, "dvd info: new title" );
p_dvd->i_title++;
- DVDSetArea( p_input, p_area );
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+ DVDSetArea( p_input, p_input->stream.pp_areas[p_dvd->i_title] );
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
return 0;
}
}
/*****************************************************************************
- * DVDSeek : Goes to a given position on the stream ; this one is used by the
- * input and translate chronological position from input to logical postion
- * on the device
- * ---
+ * DVDSeek : Goes to a given position on the stream.
+ *****************************************************************************
+ * This one is used by the input and translate chronological position from
+ * input to logical position on the device.
* The lock should be taken before calling this function.
*****************************************************************************/
static void DVDSeek( input_thread_t * p_input, off_t i_off )
case 0x5:
p_dvd->i_prg_cell += p_dvd->i_angle - 1;
p_dvd->i_angle_cell = 0;
-// intf_WarnMsg( 3, "dvd info: choosing angle %d", p_dvd->i_angle );
break;
/* we exit a multi-angle section */
case 0x9:
* input_dvd.h: thread structure of the DVD plugin
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dvd.h,v 1.21 2001/04/22 00:08:26 stef Exp $
+ * $Id: input_dvd.h,v 1.22 2001/05/19 00:39:30 stef Exp $
*
* Author: Stéphane Borel <stef@via.ecp.fr>
*
/* Navigation information */
int i_title;
- int i_vts_title;
int i_title_id;
int i_chapter_nb;
struct ifo_s * p_ifo;
} thread_dvd_data_t;
-
-/*****************************************************************************
- * Prototypes in dvd_css.c
- *****************************************************************************/
-int CSSTest ( int );
-int CSSInit ( int, struct css_s * );
-int CSSGetKey ( int, struct css_s * );
-int CSSDescrambleSector ( u8 * , u8 * );
-
-/*****************************************************************************
- * Prototypes in dvd_ifo.c
- *****************************************************************************/
-int IfoCreate ( struct thread_dvd_data_s * );
-int IfoInit ( struct ifo_s * );
-int IfoTitleSet ( struct ifo_s * );
-void IfoDestroy ( struct ifo_s * );
* gtk_callbacks.c : Callbacks for the Gtk+ plugin.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_callbacks.c,v 1.18 2001/05/15 14:49:48 stef Exp $
+ * $Id: gtk_callbacks.c,v 1.19 2001/05/19 00:39:30 stef Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
if( i_id > 0 )
{
p_area = p_intf->p_input->stream.pp_areas[i_id];
- p_intf->p_input->pf_set_area( p_intf->p_input, (input_area_t*)p_area );
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
p_intf->p_sys->b_title_update = 1;
+ GtkSetupMenus( p_intf );
}
}
if( i_id < p_intf->p_input->stream.i_area_nb )
{
p_area = p_intf->p_input->stream.pp_areas[i_id];
- p_intf->p_input->pf_set_area( p_intf->p_input, (input_area_t*)p_area );
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
p_intf->p_sys->b_title_update = 1;
+ GtkSetupMenus( p_intf );
}
}
if( p_area->i_part > 0 )
{
p_area->i_part--;
- p_intf->p_input->pf_set_area( p_intf->p_input, (input_area_t*)p_area );
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
p_intf->p_sys->b_chapter_update = 1;
+ GtkSetupMenus( p_intf );
}
}
if( p_area->i_part < p_area->i_part_nb )
{
p_area->i_part++;
- p_intf->p_input->pf_set_area( p_intf->p_input, (input_area_t*)p_area );
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
p_intf->p_sys->b_chapter_update = 1;
+ GtkSetupMenus( p_intf );
}
}
* About box
****************************************************************************/
-gboolean
-GtkAboutShow (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data)
+gboolean GtkAboutShow( GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
{
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
* Jump box
****************************************************************************/
-gboolean
-GtkJumpShow (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data)
+gboolean GtkJumpShow( GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
{
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
}
-void
-GtkJumpOk (GtkButton *button,
- gpointer user_data)
+void GtkJumpOk( GtkButton *button,
+ gpointer user_data)
{
intf_thread_t * p_intf;
off_t i_seek;
}
-void
-GtkJumpCancel (GtkButton *button,
- gpointer user_data)
+void GtkJumpCancel( GtkButton *button,
+ gpointer user_data)
{
gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
}
{
GtkJumpShow( GTK_WIDGET( menuitem ), NULL, user_data );
}
-
-void
-GtkPlaylistDestroy (GtkObject *object,
- gpointer user_data)
-{
-
-}
-
void GtkFullscreenActivate ( GtkMenuItem *, gpointer );
void GtkAboutActivate ( GtkMenuItem *, gpointer );
void GtkJumpActivate ( GtkMenuItem *, gpointer );
-
-void
-GtkPlaylistDestroy (GtkObject *object,
- gpointer user_data);
* gtk_menu.c : functions to handle menu items.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_menu.c,v 1.2 2001/05/15 14:49:48 stef Exp $
+ * $Id: gtk_menu.c,v 1.3 2001/05/19 00:39:30 stef Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
#include "main.h"
+/*
+ * Local Prototypes
+ */
+static gint GtkLanguageMenus( gpointer , GtkWidget *, es_descriptor_t *, gint,
+ void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) );
+
+void GtkMenubarAudioToggle ( GtkCheckMenuItem *, gpointer );
+void GtkPopupAudioToggle ( GtkCheckMenuItem *, gpointer );
+void GtkMenubarSubtitleToggle( GtkCheckMenuItem *, gpointer );
+void GtkPopupSubtitleToggle ( GtkCheckMenuItem *, gpointer );
+static gint GtkTitleMenu( gpointer, GtkWidget *,
+ void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) );
+static gint GtkRadioMenu( intf_thread_t *, GtkWidget *, GSList *,
+ char *, int, int,
+ void( *pf_toggle )( GtkCheckMenuItem *, gpointer ) );
+void GtkMenubarAngleToggle( GtkCheckMenuItem *, gpointer );
+void GtkPopupAngleToggle( GtkCheckMenuItem *, gpointer );
+
+gint GtkSetupMenus( intf_thread_t * p_intf );
+
/****************************************************************************
* Gtk*Toggle: callbacks to toggle the value of a checkmenuitem
****************************************************************************
* We need separate functions for menubar and popup here since we can't use
- * user_data to transmit intf_*
+ * user_data to transmit intf_* and we need to refresh the other menu.
****************************************************************************/
-#define GtkLangToggle( b_update ) \
- es_descriptor_t * p_es; \
- \
- if( !b_update ) \
- { \
- p_es = (es_descriptor_t*)user_data; \
- \
- input_ToggleES( p_intf->p_input, p_es, menuitem->active ); \
- \
- b_update = menuitem->active; \
- } \
+#define GtkLangToggle( intf, menu, type, callback, b_update ) \
+ intf_thread_t * p_intf; \
+ GtkWidget * p_menu; \
+ es_descriptor_t * p_es; \
+ \
+ p_intf = GetIntf( GTK_WIDGET(menuitem), (intf) ); \
+ \
+ if( !p_intf->p_sys->b_update ) \
+ { \
+ p_menu = GTK_WIDGET( gtk_object_get_data( \
+ GTK_OBJECT( p_intf->p_sys->p_popup ), (menu) ) ); \
+ p_es = (es_descriptor_t*)user_data; \
+ \
+ input_ToggleES( p_intf->p_input, p_es, menuitem->active ); \
+ \
+ p_intf->p_sys->b_update = menuitem->active; \
+ \
+ if( p_intf->p_sys->b_update ) \
+ { \
+ GtkLanguageMenus( p_intf, p_menu, p_es, type, callback ); \
+ } \
+ \
+ p_intf->p_sys->b_update = 0; \
+ }
/*
* Audio
void GtkMenubarAudioToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_window" );
-
- GtkLangToggle( p_intf->p_sys->b_audio_update );
+ GtkLangToggle( "intf_window", "popup_audio", AUDIO_ES,
+ GtkPopupAudioToggle, b_audio_update );
}
void GtkPopupAudioToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_popup" );
-
- GtkLangToggle( p_intf->p_sys->b_audio_update );
+ GtkLangToggle( "intf_popup", "menubar_audio", AUDIO_ES,
+ GtkMenubarAudioToggle, b_audio_update );
}
/*
* Subtitles
*/
-
void GtkMenubarSubtitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_window" );
-
- GtkLangToggle( p_intf->p_sys->b_spu_update );
+ GtkLangToggle( "intf_window", "popup_subpictures", SPU_ES,
+ GtkPopupSubtitleToggle, b_spu_update );
}
+
void GtkPopupSubtitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_popup" );
-
- GtkLangToggle( p_intf->p_sys->b_spu_update );
+ GtkLangToggle( "intf_popup", "menubar_subpictures", SPU_ES,
+ GtkMenubarSubtitleToggle, b_spu_update );
}
+#undef GtkLangToggle
+
/*
* Navigation
*/
+
void GtkPopupNavigationToggle( GtkCheckMenuItem * menuitem,
gpointer user_data )
{
!p_intf->p_sys->b_title_update &&
!p_intf->p_sys->b_chapter_update )
{
- input_area_t *p_area = p_intf->p_input->stream.p_selected_area;
+ input_area_t *p_area;
gint i_title = DATA2TITLE( user_data );
gint i_chapter = DATA2CHAPTER( user_data );
+ p_area = p_intf->p_input->stream.p_selected_area;
+
if( p_area != p_intf->p_input->stream.pp_areas[i_title] )
{
p_area = p_intf->p_input->stream.pp_areas[i_title];
}
p_area->i_part = i_chapter;
- p_intf->p_sys->b_chapter_update = 1;
- p_intf->p_input->pf_set_area( p_intf->p_input, (input_area_t*)p_area );
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
+
+ p_intf->p_sys->b_chapter_update = 1;
+ GtkSetupMenus( p_intf );
input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
}
* Title
*/
-#define GtkTitleToggle( intf ) \
- intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), (intf) ); \
- \
- if( menuitem->active && !p_intf->p_sys->b_title_update ) \
- { \
- gint i_title = (gint)user_data; \
- p_intf->p_input->pf_set_area( p_intf->p_input, \
- p_intf->p_input->stream.pp_areas[i_title] ); \
- \
- input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); \
- \
- p_intf->p_sys->b_title_update = 1; \
- }
-
void GtkMenubarTitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- GtkTitleToggle( "intf_window" );
-}
+ intf_thread_t * p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_window" );
-void GtkPopupTitleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
-{
- GtkTitleToggle( "intf_popup" );
+ if( menuitem->active && !p_intf->p_sys->b_title_update )
+ {
+ gint i_title = (gint)user_data;
+ input_ChangeArea( p_intf->p_input,
+ p_intf->p_input->stream.pp_areas[i_title] );
+
+ p_intf->p_sys->b_title_update = 1;
+ GtkSetupMenus( p_intf );
+ p_intf->p_sys->b_title_update = 0;
+
+ input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
+
+ }
}
/*
* Chapter
*/
-#define GtkChapterToggle( intf ) \
- intf_thread_t * p_intf; \
- input_area_t * p_area; \
- gint i_chapter; \
- char psz_chapter[5]; \
- \
- p_intf = GetIntf( GTK_WIDGET(menuitem), (intf) ); \
- p_area = p_intf->p_input->stream.p_selected_area; \
- i_chapter = (gint)user_data; \
- \
- if( menuitem->active && !p_intf->p_sys->b_chapter_update ) \
- { \
- p_area->i_part = i_chapter; \
- p_intf->p_input->pf_set_area( p_intf->p_input, \
- (input_area_t*)p_area ); \
- \
- snprintf( psz_chapter, 3, "%02d", p_area->i_part ); \
- gtk_label_set_text( p_intf->p_sys->p_label_chapter, psz_chapter ); \
- \
- input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); \
- \
- p_intf->p_sys->b_chapter_update = 1; \
- }
-
-
void GtkMenubarChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- GtkChapterToggle( "intf_window" );
-}
+ intf_thread_t * p_intf;
+ input_area_t * p_area;
+ gint i_chapter;
+ char psz_chapter[5];
+ GtkWidget * p_popup_menu;
-void GtkPopupChapterToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
-{
- GtkChapterToggle( "intf_popup" );
+ p_intf = GetIntf( GTK_WIDGET(menuitem), "intf_window" );
+ p_area = p_intf->p_input->stream.p_selected_area;
+ i_chapter = (gint)user_data;
+
+ if( menuitem->active && !p_intf->p_sys->b_chapter_update )
+ {
+ p_area->i_part = i_chapter;
+ input_ChangeArea( p_intf->p_input, (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" ) );
+
+ vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
+ GtkTitleMenu( p_intf, p_popup_menu, GtkPopupNavigationToggle );
+ vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
+
+ p_intf->p_sys->b_chapter_update = 0;
+
+ input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
+ }
}
+
/*
* Angle
*/
-#define GtkAngleToggle( intf ) \
+#define GtkAngleToggle( intf, window, menu, callback ) \
intf_thread_t * p_intf; \
+ GtkWidget * p_menu; \
input_area_t * p_area; \
- gint i_angle; \
\
p_intf = GetIntf( GTK_WIDGET(menuitem), (intf) ); \
- p_area = p_intf->p_input->stream.p_selected_area; \
- i_angle = (gint)user_data; \
\
if( menuitem->active && !p_intf->p_sys->b_angle_update ) \
{ \
- p_area->i_angle = i_angle; \
- p_intf->p_input->pf_set_area( p_intf->p_input, \
- (input_area_t*)p_area ); \
+ p_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( \
+ p_intf->p_sys->window ), (menu) ) ); \
+ p_area = p_intf->p_input->stream.p_selected_area; \
+ p_area->i_angle = (gint)user_data; \
+ \
+ input_ChangeArea( p_intf->p_input, (input_area_t*)p_area ); \
\
p_intf->p_sys->b_angle_update = 1; \
+ vlc_mutex_lock( &p_intf->p_input->stream.stream_lock ); \
+ GtkRadioMenu( p_intf, p_menu, NULL, "Angle", \
+ p_area->i_angle_nb, p_area->i_angle, (callback) ); \
+ vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock ); \
+ p_intf->p_sys->b_angle_update = 0; \
}
void GtkMenubarAngleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- GtkAngleToggle( "intf_window" )
+ GtkAngleToggle( "intf_window", p_popup, "popup_angle",
+ GtkPopupAngleToggle );
}
void GtkPopupAngleToggle( GtkCheckMenuItem * menuitem, gpointer user_data )
{
- GtkAngleToggle( "intf_popup" )
+ GtkAngleToggle( "intf_popup", p_window, "menubar_angle",
+ GtkMenubarAngleToggle );
}
+#undef GtkAngleToggle
+
/****************************************************************************
* Functions to generate menus
****************************************************************************/
p_item_active = NULL;
i_item = 0;
+ vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
+
/* create a set of language buttons and append them to the container */
for( i = 0 ; i < p_intf->p_input->stream.i_es_number ; i++ )
{
}
}
+ vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
/* link the new menu to the menubar item */
gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_root ), p_menu );
* We have to release the lock since input_ToggleES needs it */
if( p_item_active != NULL )
{
- vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_item_active ),
TRUE );
- vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
}
/* be sure that menu is sensitive if non empty */
return TRUE;
}
-#if 1
/*****************************************************************************
* GtkTitleMenu: sets menus for titles and chapters selection
*****************************************************************************
return TRUE;
}
-#endif
/*****************************************************************************
- * GtkSetupMenu: function that generates title/chapter/audio/subpic
+ * GtkSetupMenus: function that generates title/chapter/audio/subpic
* menus with help from preceding functions
*****************************************************************************/
-gint GtkSetupMenu( intf_thread_t * p_intf )
+gint GtkSetupMenus( intf_thread_t * p_intf )
{
es_descriptor_t * p_audio_es;
es_descriptor_t * p_spu_es;
GtkWidget * p_popup_menu;
gint i;
- p_intf->p_sys->b_chapter_update |= p_intf->p_sys->b_title_update |
- ( p_intf->p_sys->i_part !=
- p_intf->p_input->stream.p_selected_area->i_part );
+ p_intf->p_sys->b_chapter_update |= p_intf->p_sys->b_title_update;
p_intf->p_sys->b_angle_update |= p_intf->p_sys->b_title_update;
p_intf->p_sys->b_audio_update |= p_intf->p_sys->b_title_update;
p_intf->p_sys->b_spu_update |= p_intf->p_sys->b_title_update;
+ vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
+
if( p_intf->p_sys->b_title_update )
{
char psz_title[5];
p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
p_intf->p_sys->p_window ), "menubar_title" ) );
GtkRadioMenu( p_intf, p_menubar_menu, NULL, "Title",
- p_intf->p_input->stream.i_area_nb - 1,
- p_intf->p_input->stream.p_selected_area->i_id,
- GtkMenubarTitleToggle );
+ p_intf->p_input->stream.i_area_nb - 1,
+ p_intf->p_input->stream.p_selected_area->i_id,
+ GtkMenubarTitleToggle );
snprintf( psz_title, 4, "%d",
p_intf->p_input->stream.p_selected_area->i_id );
}
}
+ vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
+
/* audio menus */
if( p_intf->p_sys->b_audio_update )
{
p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
p_intf->p_sys->p_popup ), "popup_audio" ) );
+ p_intf->p_sys->b_audio_update = 1;
GtkLanguageMenus( p_intf, p_menubar_menu, p_audio_es, AUDIO_ES,
GtkMenubarAudioToggle );
+ p_intf->p_sys->b_audio_update = 1;
GtkLanguageMenus( p_intf, p_popup_menu, p_audio_es, AUDIO_ES,
GtkPopupAudioToggle );
-
+
p_intf->p_sys->b_audio_update = 0;
}
p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
p_intf->p_sys->p_popup ), "popup_subpictures" ) );
+ p_intf->p_sys->b_spu_update = 1;
GtkLanguageMenus( p_intf, p_menubar_menu, p_spu_es, SPU_ES,
GtkMenubarSubtitleToggle );
+ p_intf->p_sys->b_spu_update = 1;
GtkLanguageMenus( p_intf, p_popup_menu, p_spu_es, SPU_ES,
GtkPopupSubtitleToggle );
-
+
p_intf->p_sys->b_spu_update = 0;
}
* gtk_menu.h: prototypes for menu functions
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: gtk_menu.h,v 1.2 2001/05/15 14:49:48 stef Exp $
+ * $Id: gtk_menu.h,v 1.3 2001/05/19 00:39:30 stef Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
+
+struct intf_thread_s;
+
+gint GtkSetupMenus( struct intf_thread_s * );
+
* gtk_playlist.h : Playlist functions for the Gtk plugin.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_playlist.h,v 1.3 2001/05/15 14:49:48 stef Exp $
+ * $Id: gtk_playlist.h,v 1.4 2001/05/19 00:39:30 stef Exp $
*
* Authors: Pierre Baillet <oct@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
void GtkNextActivate ( GtkMenuItem *, gpointer );
void GtkPrevActivate ( GtkMenuItem *, gpointer );
+
+struct intf_thread_s;
+struct playlist_s;
+
+void GtkDropDataReceived ( struct intf_thread_s *, GtkSelectionData *,
+ guint, int );
+int GtkAppendList ( struct playlist_s *, int, GList * );
+void GtkRebuildCList ( GtkCList *, struct playlist_s * );
+void GtkPlayListManage ( struct intf_thread_s * );
+
* intf_gtk.c: Gtk+ interface
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_gtk.c,v 1.19 2001/05/15 14:49:48 stef Exp $
+ * $Id: intf_gtk.c,v 1.20 2001/05/19 00:39:30 stef Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
}
/* update the playlist */
- GtkPlayListManage( p_data );
+// GtkPlayListManage( p_data );
if( p_intf->p_input != NULL && !p_intf->b_die )
{
}
#undef p_area
}
- GtkSetupMenu( p_intf );
-
vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
+
+ if( p_intf->p_sys->i_part !=
+ p_intf->p_input->stream.p_selected_area->i_part )
+ {
+ p_intf->p_sys->b_chapter_update = 1;
+ GtkSetupMenus( p_intf );
+ }
+
}
else if( !p_intf->b_die )
{
* intf_gtk.h: private Gtk+ interface description
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: intf_gtk.h,v 1.4 2001/05/15 01:01:44 stef Exp $
+ * $Id: intf_gtk.h,v 1.5 2001/05/19 00:39:30 stef Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
} intf_sys_t;
-/****************************************************************************
- * Prototypes
- ****************************************************************************/
-
-/*
- * from gtk_menu.c
- */
-gint GtkSetupMenu( intf_thread_t * );
-
-/*
- * from gtk_playlist.c
- */
-void GtkDropDataReceived ( intf_thread_t *, GtkSelectionData *,
- guint, int );
-int GtkAppendList ( playlist_t *, int, GList * );
-void GtkRebuildCList ( GtkCList *, playlist_t * );
-void GtkPlayListManage ( intf_thread_t * );
* aout_spdif: ac3 passthrough output
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: aout_spdif.c,v 1.5 2001/05/15 01:01:44 stef Exp $
+ * $Id: aout_spdif.c,v 1.6 2001/05/19 00:39:30 stef Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Stéphane Borel <stef@via.ecp.fr>
/* TODO: write the muliplexer :) */
if( p_aout->fifo[i_fifo].i_type == AOUT_ADEC_SPDIF_FIFO )
{
-// vlc_mutex_lock( &p_aout->fifo[i_fifo].data_lock );
+ vlc_mutex_lock( &p_aout->fifo[i_fifo].data_lock );
if( p_aout->fifo[i_fifo].b_die )
{
-// vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
+ vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
aout_FreeFifo( &p_aout->fifo[i_fifo] );
}
else if( !AOUT_FIFO_ISEMPTY( p_aout->fifo[i_fifo] ) )
p_aout->fifo[i_fifo].l_start_frame =
(p_aout->fifo[i_fifo].l_start_frame + 1 )
& AOUT_FIFO_SIZE;
-// vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
+ vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
i_frame++;
i_blank = 0;
}
+ else
+ {
+ vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
+ }
}
}
if( !i_frame )
* decoders.
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: input.c,v 1.107 2001/05/07 03:14:09 stef Exp $
+ * $Id: input.c,v 1.108 2001/05/19 00:39:30 stef Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
p_input->stream.i_area_nb = 0;
p_input->stream.pp_areas = NULL;
p_input->stream.p_selected_area = NULL;
+ p_input->stream.p_new_area = NULL;
/* By default there is one areas in a stream */
input_AddArea( p_input );
p_input->stream.p_selected_area = p_input->stream.pp_areas[0];
vlc_mutex_lock( &p_input->stream.stream_lock );
+ if( p_input->stream.p_new_area )
+ {
+ p_input->pf_set_area( p_input, p_input->stream.p_new_area );
+ p_input->stream.p_new_area = NULL;
+ }
+
if( p_input->stream.p_selected_area->i_seek != NO_SEEK )
{
if( p_input->stream.b_seekable && p_input->pf_seek != NULL )
p_input->stream.p_selected_area->i_seek = NO_SEEK;
}
+ if( p_input->stream.p_removed_es )
+ {
+ input_UnselectES( p_input, p_input->stream.p_removed_es );
+ p_input->stream.p_removed_es = NULL;
+ }
+
+ if( p_input->stream.p_newly_selected_es )
+ {
+ input_SelectES( p_input, p_input->stream.p_newly_selected_es );
+ p_input->stream.p_newly_selected_es = NULL;
+ }
+
vlc_mutex_unlock( &p_input->stream.stream_lock );
i_error = p_input->pf_read( p_input, pp_packets );
* input_ext-intf.c: services to the interface
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: input_ext-intf.c,v 1.23 2001/05/07 03:14:09 stef Exp $
+ * $Id: input_ext-intf.c,v 1.24 2001/05/19 00:39:30 stef Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/*****************************************************************************
* input_ChangeES: answers to a user request with calls to (Un)SelectES
- * ---
+ *****************************************************************************
* Useful since the interface plugins know p_es
+ * This functon is deprecated, use input_ToggleEs instead.
*****************************************************************************/
int input_ChangeES( input_thread_t * p_input, es_descriptor_t * p_es,
u8 i_cat )
{
if( b_select )
{
- input_SelectES( p_input, p_es );
+ p_input->stream.p_newly_selected_es = p_es;
}
else
{
- input_UnselectES( p_input, p_es );
+ p_input->stream.p_removed_es = p_es;
}
}
return 0;
}
+
+/****************************************************************************
+ * input_ChangeArea: interface request an area change
+ ****************************************************************************/
+int input_ChangeArea( input_thread_t * p_input, input_area_t * p_area )
+{
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+
+ p_input->stream.p_new_area = p_area;
+
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+
+ return 0;
+}
* input_programs.c: es_descriptor_t, pgrm_descriptor_t management
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: input_programs.c,v 1.55 2001/05/01 12:22:18 sam Exp $
+ * $Id: input_programs.c,v 1.56 2001/05/19 00:39:30 stef Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
p_input->stream.b_changed = 0;
p_input->stream.pp_es = NULL;
p_input->stream.pp_selected_es = NULL;
+ p_input->stream.p_removed_es = NULL;
+ p_input->stream.p_newly_selected_es = NULL;
p_input->stream.pp_programs = NULL;
if( i_data_len )
vlc_mutex_lock( &p_input->stream.stream_lock );
}
break;
-#if 0
case LPCM_AUDIO_ES:
if( p_main->b_audio )
{
- if( p_main->b_spdif )
- {
- decoder.pf_create_thread = spdif_CreateThread;
- }
- else
- {
- intf_ErrMsg( "input error: LPCM audio not handled yet" );
- break;
- }
+ intf_ErrMsg( "input error: LPCM audio not handled yet" );
+ break;
p_config = (void *)GetAdecConfig( p_input, p_es );
vlc_mutex_lock( &p_input->stream.stream_lock );
}
break;
-#endif
case DVD_SPU_ES:
if( p_main->b_video )
{