* Preamble
*****************************************************************************/
+/* config.h may include inttypes.h, so make sure we define that option
+ * early enough. */
+#define __STDC_FORMAT_MACROS 1
+#define __STDC_CONSTANT_MACROS 1
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#define __STDC_FORMAT_MACROS 1
-#define __STDC_CONSTANT_MACROS 1
#include <inttypes.h>
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <vlc_plugin.h>
#ifdef HAVE_TIME_H
# include <zlib.h>
#endif
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+static int Open ( vlc_object_t * );
+static void Close( vlc_object_t * );
+
+vlc_module_begin();
+ set_shortname( "Matroska" );
+ set_description( N_("Matroska stream demuxer" ) );
+ set_capability( "demux", 50 );
+ set_callbacks( Open, Close );
+ set_category( CAT_INPUT );
+ set_subcategory( SUBCAT_INPUT_DEMUX );
+
+ add_bool( "mkv-use-ordered-chapters", 1, NULL,
+ N_("Ordered chapters"),
+ N_("Play ordered chapters as specified in the segment."), true );
+
+ add_bool( "mkv-use-chapter-codec", 1, NULL,
+ N_("Chapter codecs"),
+ N_("Use chapter codecs found in the segment."), true );
+
+ add_bool( "mkv-preload-local-dir", 1, NULL,
+ N_("Preload Directory"),
+ N_("Preload matroska files from the same family in the same directory (not good for broken files)."), true );
+
+ add_bool( "mkv-seek-percent", 0, NULL,
+ N_("Seek based on percent not time"),
+ N_("Seek based on percent not time."), true );
+
+ add_bool( "mkv-use-dummy", 0, NULL,
+ N_("Dummy Elements"),
+ N_("Read and discard unknown EBML elements (not good for broken files)."), true );
+
+ add_shortcut( "mka" );
+ add_shortcut( "mkv" );
+vlc_module_end();
+
+
+
#define MATROSKA_COMPRESSION_NONE -1
#define MATROSKA_COMPRESSION_ZLIB 0
#define MATROSKA_COMPRESSION_BLIB 1
using namespace LIBMATROSKA_NAMESPACE;
using namespace std;
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
-static int Open ( vlc_object_t * );
-static void Close( vlc_object_t * );
-
-vlc_module_begin();
- set_shortname( "Matroska" );
- set_description( N_("Matroska stream demuxer" ) );
- set_capability( "demux", 50 );
- set_callbacks( Open, Close );
- set_category( CAT_INPUT );
- set_subcategory( SUBCAT_INPUT_DEMUX );
-
- add_bool( "mkv-use-ordered-chapters", 1, NULL,
- N_("Ordered chapters"),
- N_("Play ordered chapters as specified in the segment."), true );
-
- add_bool( "mkv-use-chapter-codec", 1, NULL,
- N_("Chapter codecs"),
- N_("Use chapter codecs found in the segment."), true );
-
- add_bool( "mkv-preload-local-dir", 1, NULL,
- N_("Preload Directory"),
- N_("Preload matroska files from the same family in the same directory (not good for broken files)."), true );
-
- add_bool( "mkv-seek-percent", 0, NULL,
- N_("Seek based on percent not time"),
- N_("Seek based on percent not time."), true );
-
- add_bool( "mkv-use-dummy", 0, NULL,
- N_("Dummy Elements"),
- N_("Read and discard unknown EBML elements (not good for broken files)."), true );
-
- add_shortcut( "mka" );
- add_shortcut( "mkv" );
-vlc_module_end();
-
/*****************************************************************************
* Local prototypes
*****************************************************************************/
void Keep( void );
EbmlElement *UnGet( uint64 i_block_pos, uint64 i_cluster_pos );
- int GetLevel( void );
+ int GetLevel( void );
+
+ /* Is the provided element presents in our upper elements */
+ bool IsTopPresent( EbmlElement * );
private:
EbmlStream *m_es;
{
for( size_t i_track = 0; i_track < tracks.size(); i_track++ )
{
- if ( tracks[i_track]->p_compression_data )
- {
- delete tracks[i_track]->p_compression_data;
- }
+ delete tracks[i_track]->p_compression_data;
es_format_Clean( &tracks[i_track]->fmt );
free( tracks[i_track]->p_extra_data );
free( tracks[i_track]->psz_codec );
return VLC_SUCCESS;
case DEMUX_GET_TITLE_INFO:
- if( p_sys->titles.size() )
+ if( p_sys->titles.size() > 1 || ( p_sys->titles.size() == 1 && p_sys->titles[0]->i_seekpoint > 0 ) )
{
input_title_t ***ppp_title = (input_title_t***)va_arg( args, input_title_t*** );
int *pi_int = (int*)va_arg( args, int* );
{
(*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->titles[i] );
}
-
return VLC_SUCCESS;
}
return VLC_EGENERIC;
return VLC_EGENERIC;
}
+ /* Verify that we are still inside our cluster
+ * It can happens whith broken files and when seeking
+ * without index */
+ if( i_level > 1 )
+ {
+ if( cluster && !ep->IsTopPresent( cluster ) )
+ {
+ msg_Warn( &sys.demuxer, "Unexpected escape from current cluster" );
+ cluster = NULL;
+ }
+ if( !cluster )
+ continue;
+ }
+
/* do parsing */
switch ( i_level )
{
}
tracks[i_track]->fmt.audio.i_blockalign = ( tracks[i_track]->fmt.audio.i_bitspersample + 7 ) / 8 * tracks[i_track]->fmt.audio.i_channels;
}
-#if 0
/* disabled due to the potential "S_KATE" namespace issue */
else if( !strcmp( tracks[i_track]->psz_codec, "S_KATE" ) )
{
i_extra += i_size[i];
}
}
-#endif
else if( !strcmp( tracks[i_track]->psz_codec, "S_TEXT/UTF8" ) )
{
tracks[i_track]->fmt.i_codec = VLC_FOURCC( 's', 'u', 'b', 't' );
var_AddCallback( p_ev->p_libvlc, "key-action", EventKey, p_ev );
/* main loop */
- while( !p_ev->b_die )
+ while( vlc_object_alive (p_ev) )
{
if ( !p_sys->b_pci_packet_set )
{
}
/* VOUT part */
- if( p_vout && p_vout->b_die )
+ if( p_vout && !vlc_object_alive (p_vout) )
{
var_DelCallback( p_vout, "mouse-moved", EventMouse, p_ev );
var_DelCallback( p_vout, "mouse-clicked", EventMouse, p_ev );
return m_el[mi_level];
}
+bool EbmlParser::IsTopPresent( EbmlElement *el )
+{
+ for( int i = 0; i < mi_level; i++ )
+ {
+ if( m_el[i] && m_el[i] == el )
+ return true;
+ }
+ return false;
+}
/*****************************************************************************
* Tools
/*****************************************************************************
- * Divers
+ * Misc
*****************************************************************************/
void matroska_segment_c::IndexAppendCluster( KaxCluster *cluster )