Commit a6802ee4 authored by Steve Lhomme's avatar Steve Lhomme

mkv.cpp: verify that the matroska version needed for playback matches (support...

mkv.cpp: verify that the matroska version needed for playback matches (support only matroska v1 for now)
parent 409ec0fa
...@@ -1353,7 +1353,7 @@ public: ...@@ -1353,7 +1353,7 @@ public:
void PreloadFamily( const matroska_segment_c & of_segment ); void PreloadFamily( const matroska_segment_c & of_segment );
void PreloadLinked( matroska_segment_c *p_segment ); void PreloadLinked( matroska_segment_c *p_segment );
bool PreparePlayback( virtual_segment_c *p_new_segment ); bool PreparePlayback( virtual_segment_c *p_new_segment );
matroska_stream_c *AnalyseAllSegmentsFound( EbmlStream *p_estream, bool b_initial = false ); matroska_stream_c *AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial = false );
void JumpTo( virtual_segment_c & p_segment, chapter_item_c * p_chapter ); void JumpTo( virtual_segment_c & p_segment, chapter_item_c * p_chapter );
void StartUiThread(); void StartUiThread();
...@@ -1431,7 +1431,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -1431,7 +1431,7 @@ static int Open( vlc_object_t * p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
p_stream = p_sys->AnalyseAllSegmentsFound( p_io_stream, true ); p_stream = p_sys->AnalyseAllSegmentsFound( p_demux, p_io_stream, true );
if( p_stream == NULL ) if( p_stream == NULL )
{ {
msg_Err( p_demux, "cannot find KaxSegment" ); msg_Err( p_demux, "cannot find KaxSegment" );
...@@ -1505,7 +1505,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -1505,7 +1505,7 @@ static int Open( vlc_object_t * p_this )
vlc_stream_io_callback *p_file_io = new vlc_stream_io_callback( p_file_stream, VLC_TRUE ); vlc_stream_io_callback *p_file_io = new vlc_stream_io_callback( p_file_stream, VLC_TRUE );
EbmlStream *p_estream = new EbmlStream(*p_file_io); EbmlStream *p_estream = new EbmlStream(*p_file_io);
p_stream = p_sys->AnalyseAllSegmentsFound( p_estream ); p_stream = p_sys->AnalyseAllSegmentsFound( p_demux, p_estream );
if ( p_stream == NULL ) if ( p_stream == NULL )
{ {
...@@ -1943,7 +1943,7 @@ msg_Dbg( p_demux, "block i_dts: "I64Fd" / i_pts: "I64Fd, p_block->i_dts, p_block ...@@ -1943,7 +1943,7 @@ msg_Dbg( p_demux, "block i_dts: "I64Fd" / i_pts: "I64Fd, p_block->i_dts, p_block
#undef tk #undef tk
} }
matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( EbmlStream *p_estream, bool b_initial ) matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial )
{ {
int i_upper_lvl = 0; int i_upper_lvl = 0;
size_t i; size_t i;
...@@ -1956,9 +1956,27 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( EbmlStream *p_estream, ...@@ -1956,9 +1956,27 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( EbmlStream *p_estream,
{ {
return NULL; return NULL;
} }
p_l0->SkipData(*p_estream, KaxMatroska_Context);
// verify we can read this Segment, we only support Matroska version 1 for now
p_l0->Read(*p_estream, EbmlHead::ClassInfos.Context, i_upper_lvl, p_l0, true);
EDocType doc_type = GetChild<EDocType>(*static_cast<EbmlHead*>(p_l0));
if (std::string(doc_type) != "matroska")
{
msg_Dbg( p_demux, "Not a Matroska file : %s ", std::string(doc_type).c_str());
return NULL;
}
EDocTypeReadVersion doc_read_version = GetChild<EDocTypeReadVersion>(*static_cast<EbmlHead*>(p_l0));
if (uint64(doc_read_version) != 1)
{
msg_Dbg( p_demux, "Matroska Read version not matching : "I64Fd, uint64(doc_read_version));
return NULL;
}
delete p_l0; delete p_l0;
// find all segments in this file // find all segments in this file
p_l0 = p_estream->FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFFLL); p_l0 = p_estream->FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFFLL);
if (p_l0 == NULL) if (p_l0 == NULL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment