[vlc-devel] commit: Fix mkv track checking in blockget (TrackNum() != our track index). (Laurent Aimar )
git version control
git at videolan.org
Wed Aug 20 02:17:01 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Aug 20 02:16:56 2008 +0200| [a5eae754324145821cc89c5a9eb2d7cf91e2f4bf] | committer: Laurent Aimar
Fix mkv track checking in blockget (TrackNum() != our track index).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a5eae754324145821cc89c5a9eb2d7cf91e2f4bf
---
modules/demux/mkv.cpp | 72 +++++++++++++++++++++++++++++++++++-------------
1 files changed, 52 insertions(+), 20 deletions(-)
diff --git a/modules/demux/mkv.cpp b/modules/demux/mkv.cpp
index 436174b..112eb74 100644
--- a/modules/demux/mkv.cpp
+++ b/modules/demux/mkv.cpp
@@ -1178,6 +1178,15 @@ public:
#else
int BlockGet( KaxBlock * &, int64_t *, int64_t *, int64_t *);
#endif
+
+ int BlockFindTrackIndex( size_t *pi_track,
+ const KaxBlock *p_block
+#if LIBMATROSKA_VERSION >= 0x000800
+ , const KaxSimpleBlock *p_simpleblock
+#endif
+ );
+
+
bool Select( mtime_t i_start_time );
void UnSelect( );
@@ -1770,13 +1779,11 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, int64_t *pi_ref1, int64
#endif
{
/* Check blocks validity to protect againts broken files */
- if(
+ if( BlockFindTrackIndex( NULL, pp_block
#if LIBMATROSKA_VERSION >= 0x000800
- pp_simpleblock && pp_simpleblock->TrackNum() >= tracks.size() ||
-#else
- false ||
+ , pp_simpleblock
#endif
- pp_block && pp_block->TrackNum() >= tracks.size() )
+ ) )
{
delete pp_block;
#if LIBMATROSKA_VERSION >= 0x000800
@@ -1967,25 +1974,18 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
unsigned int i;
bool b;
-#define tk p_segment->tracks[i_track]
- for( i_track = 0; i_track < p_segment->tracks.size(); i_track++ )
- {
+ if( p_segment->BlockFindTrackIndex( &i_track, block
#if LIBMATROSKA_VERSION >= 0x000800
- if( (block != NULL && tk->i_number == block->TrackNum()) ||
- (simpleblock != NULL && tk->i_number == simpleblock->TrackNum()))
-#else
- if( tk->i_number == block->TrackNum() )
+ , simpleblock
#endif
- {
- break;
- }
- }
-
- if( i_track >= p_segment->tracks.size() )
+ ) )
{
msg_Err( p_demux, "invalid track number" );
return;
}
+
+ mkv_track_t *tk = p_segment->tracks[i_track];
+
if( tk->fmt.i_cat != NAV_ES && tk->p_es == NULL )
{
msg_Err( p_demux, "unknown track number" );
@@ -2115,8 +2115,6 @@ msg_Dbg( p_demux, "block i_dts: %"PRId64" / i_pts: %"PRId64, p_block->i_dts, p_b
/* use time stamp only for first block */
i_pts = 0;
}
-
-#undef tk
}
matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial )
@@ -6058,6 +6056,40 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_
}
}
+int matroska_segment_c::BlockFindTrackIndex( size_t *pi_track,
+ const KaxBlock *p_block
+#if LIBMATROSKA_VERSION >= 0x000800
+ , const KaxSimpleBlock *p_simpleblock
+#endif
+ )
+{
+ size_t i_track;
+ unsigned int i;
+ bool b;
+
+ for( i_track = 0; i_track < tracks.size(); i_track++ )
+ {
+ const mkv_track_t *tk = tracks[i_track];
+
+#if LIBMATROSKA_VERSION >= 0x000800
+ if( ( p_block != NULL && tk->i_number == p_block->TrackNum() ) ||
+ ( p_simpleblock != NULL && tk->i_number == p_simpleblock->TrackNum() ) )
+#else
+ if( tk->i_number == p_block->TrackNum() )
+#endif
+ {
+ break;
+ }
+ }
+
+ if( i_track >= tracks.size() )
+ return VLC_EGENERIC;
+
+ if( pi_track )
+ *pi_track = i_track;
+ return VLC_SUCCESS;
+}
+
void virtual_segment_c::Seek( demux_t & demuxer, mtime_t i_date, mtime_t i_time_offset, chapter_item_c *psz_chapter, int64_t i_global_position )
{
demux_sys_t *p_sys = demuxer.p_sys;
More information about the vlc-devel
mailing list