X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmkv.cpp;h=00502b11e1ceff6729fbf7f8234b93116657568c;hb=caf6188518644f20b84536fca5af932de98ecd02;hp=cb81202bb657770e738109d6a18fd68ce326248d;hpb=97897eeeb22b1238e56632b16cda1a0375ae7708;p=vlc diff --git a/modules/demux/mkv.cpp b/modules/demux/mkv.cpp index cb81202bb6..00502b11e1 100644 --- a/modules/demux/mkv.cpp +++ b/modules/demux/mkv.cpp @@ -26,15 +26,19 @@ * 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 -#include +#include +#include #ifdef HAVE_TIME_H # include /* time() */ @@ -42,7 +46,7 @@ #include /* BITMAPINFOHEADER, WAVEFORMATEX */ -#include "iso_lang.h" +#include #include "vlc_meta.h" #include #include @@ -401,7 +405,7 @@ static void Close( vlc_object_t * ); 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 ); @@ -502,7 +506,7 @@ static void MkvTree( demux_t & demuxer, int i_level, const char *psz_format, ... 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 ); } @@ -1326,7 +1330,7 @@ public: ,b_pci_packet_set(false) ,p_ev(NULL) { - vlc_mutex_init( &demuxer, &lock_demuxer ); + vlc_mutex_init( &lock_demuxer ); } virtual ~demux_sys_t() @@ -2550,6 +2554,56 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) } 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' ); @@ -2667,7 +2721,7 @@ void demux_sys_t::StartUiThread() 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 ); } @@ -2742,7 +2796,7 @@ int demux_sys_t::EventThread( vlc_object_t *p_this ) 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 ) { @@ -3000,7 +3054,7 @@ int demux_sys_t::EventThread( vlc_object_t *p_this ) } /* 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 ); @@ -4868,14 +4922,14 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap 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 ); } @@ -5080,7 +5134,7 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters ) 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; }