* 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 <time.h> /* time() */
#include <vlc_codecs.h> /* BITMAPINFOHEADER, WAVEFORMATEX */
-#include "iso_lang.h"
+#include <vlc_iso_lang.h>
#include "vlc_meta.h"
#include <vlc_charset.h>
#include <vlc_input.h>
vlc_module_begin();
set_shortname( "Matroska" );
- set_description( _("Matroska stream demuxer" ) );
+ set_description( N_("Matroska stream demuxer" ) );
set_capability( "demux", 50 );
set_callbacks( Open, Close );
set_category( CAT_INPUT );
psz_foo2[ 4 * i_level ] = '+';
psz_foo2[ 4 * i_level + 1 ] = ' ';
strcpy( &psz_foo2[ 4 * i_level + 2 ], psz_format );
- __msg_GenericVa( VLC_OBJECT(&demuxer), MSG_QUEUE_NORMAL, VLC_MSG_DBG, "mkv", psz_foo2, args );
+ __msg_GenericVa( VLC_OBJECT(&demuxer),VLC_MSG_DBG, "mkv", psz_foo2, args );
free( psz_foo2 );
va_end( args );
}
{
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 );
,b_pci_packet_set(false)
,p_ev(NULL)
{
- vlc_mutex_init( &demuxer, &lock_demuxer );
+ vlc_mutex_init( &lock_demuxer );
}
virtual ~demux_sys_t()
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;
}
tracks[i_track]->fmt.audio.i_blockalign = ( tracks[i_track]->fmt.audio.i_bitspersample + 7 ) / 8 * tracks[i_track]->fmt.audio.i_channels;
}
+ /* disabled due to the potential "S_KATE" namespace issue */
+ else if( !strcmp( tracks[i_track]->psz_codec, "S_KATE" ) )
+ {
+ int i, i_offset = 1, *i_size, i_extra, num_headers, size_so_far;
+ uint8_t *p_extra;
+
+ tracks[i_track]->fmt.i_codec = VLC_FOURCC( 'k', 'a', 't', 'e' );
+ tracks[i_track]->fmt.subs.psz_encoding = strdup( "UTF-8" );
+
+ /* Recover the number of headers to expect */
+ num_headers = tracks[i_track]->p_extra_data[0]+1;
+ msg_Dbg( &sys.demuxer, "kate in mkv detected: %d headers in %u bytes",
+ num_headers, tracks[i_track]->i_extra_data);
+
+ /* this won't overflow the stack as is can allocate only 1020 bytes max */
+ i_size = (int*)alloca(num_headers*sizeof(int));
+
+ /* Split the headers */
+ size_so_far = 0;
+ for( i = 0; i < num_headers-1; i++ )
+ {
+ i_size[i] = 0;
+ while( i_offset < tracks[i_track]->i_extra_data )
+ {
+ i_size[i] += tracks[i_track]->p_extra_data[i_offset];
+ if( tracks[i_track]->p_extra_data[i_offset++] != 0xff ) break;
+ }
+ msg_Dbg( &sys.demuxer, "kate header %d is %d bytes", i, i_size[i]);
+ size_so_far += i_size[i];
+ }
+ i_size[num_headers-1] = tracks[i_track]->i_extra_data - (size_so_far+i_offset);
+ msg_Dbg( &sys.demuxer, "kate last header (%d) is %d bytes", num_headers-1, i_size[num_headers-1]);
+
+ tracks[i_track]->fmt.i_extra = 1 + num_headers * 2 + size_so_far + i_size[num_headers-1];
+ tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra );
+
+ p_extra = (uint8_t *)tracks[i_track]->fmt.p_extra;
+ i_extra = 0;
+ *(p_extra++) = num_headers;
+ ++i_extra;
+ for( i = 0; i < num_headers; i++ )
+ {
+ *(p_extra++) = i_size[i] >> 8;
+ *(p_extra++) = i_size[i] & 0xFF;
+ memcpy( p_extra, tracks[i_track]->p_extra_data + i_offset + i_extra-1,
+ i_size[i] );
+ p_extra += i_size[i];
+ i_extra += i_size[i];
+ }
+ }
else if( !strcmp( tracks[i_track]->psz_codec, "S_TEXT/UTF8" ) )
{
tracks[i_track]->fmt.i_codec = VLC_FOURCC( 's', 'u', 'b', 't' );
p_ev = (event_thread_t *) vlc_object_create( &demuxer, sizeof( event_thread_t ) );
p_ev->p_demux = &demuxer;
p_ev->b_die = false;
- vlc_mutex_init( p_ev, &p_ev->lock );
+ vlc_mutex_init( &p_ev->lock );
vlc_thread_create( p_ev, "mkv event thread handler", EventThread,
VLC_THREAD_PRIORITY_LOW, false );
}
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 );
else if( MKV_IS_ID( l, KaxChapterTimeStart ) )
{
KaxChapterTimeStart &start =*(KaxChapterTimeStart*)l;
- chapters.i_start_time = uint64( start ) / I64C(1000);
+ chapters.i_start_time = uint64( start ) / INT64_C(1000);
msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeStart: %lld", chapters.i_start_time );
}
else if( MKV_IS_ID( l, KaxChapterTimeEnd ) )
{
KaxChapterTimeEnd &end =*(KaxChapterTimeEnd*)l;
- chapters.i_end_time = uint64( end ) / I64C(1000);
+ chapters.i_end_time = uint64( end ) / INT64_C(1000);
msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeEnd: %lld", chapters.i_end_time );
}
if ( stored_editions.size() != 0 && stored_editions[i_default_edition]->b_ordered )
{
/* update the duration of the segment according to the sum of all sub chapters */
- i_dur = stored_editions[i_default_edition]->Duration() / I64C(1000);
+ i_dur = stored_editions[i_default_edition]->Duration() / INT64_C(1000);
if (i_dur > 0)
i_duration = i_dur;
}
/*****************************************************************************
- * Divers
+ * Misc
*****************************************************************************/
void matroska_segment_c::IndexAppendCluster( KaxCluster *cluster )