[vlc-devel] [PATCH 2/2] demux:mkv: get the track directly from FindTrackByBlock
Steve Lhomme
robux4 at videolabs.io
Wed Aug 2 17:07:26 CEST 2017
And use const is places where the track is not modified.
---
modules/demux/mkv/matroska_segment.cpp | 37 ++++++++++++---------------
modules/demux/mkv/matroska_segment.hpp | 2 +-
modules/demux/mkv/matroska_segment_seeker.cpp | 3 +--
modules/demux/mkv/mkv.cpp | 15 +++++------
4 files changed, 24 insertions(+), 33 deletions(-)
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index 664a868037..69522f36a3 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -870,24 +870,22 @@ bool matroska_segment_c::Seek( mtime_t i_absolute_mk_date, mtime_t i_mk_time_off
}
-int matroska_segment_c::FindTrackByBlock(tracks_map_t::iterator* p_track_it,
+mkv_track_t * matroska_segment_c::FindTrackByBlock(
const KaxBlock *p_block, const KaxSimpleBlock *p_simpleblock )
{
- *p_track_it = tracks.end();
-
- if( p_block == NULL && p_simpleblock == NULL )
- return VLC_EGENERIC;
+ tracks_map_t::iterator track_it;
if (p_block != NULL)
- {
- *p_track_it = tracks.find( p_block->TrackNum() );
- }
+ track_it = tracks.find( p_block->TrackNum() );
else if( p_simpleblock != NULL)
- {
- *p_track_it = tracks.find( p_simpleblock->TrackNum() );
- }
+ track_it = tracks.find( p_simpleblock->TrackNum() );
+ else
+ track_it = tracks.end();
+
+ if (track_it == tracks.end())
+ return NULL;
- return *p_track_it != tracks.end() ? VLC_SUCCESS : VLC_EGENERIC;
+ return track_it->second.get();
}
void matroska_segment_c::ComputeTrackPriority()
@@ -1124,8 +1122,6 @@ void matroska_segment_c::ESDestroy( )
int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_simpleblock, bool *pb_key_picture, bool *pb_discardable_picture, int64_t *pi_duration )
{
- tracks_map_t::iterator track_it;
-
pp_simpleblock = NULL;
pp_block = NULL;
@@ -1208,8 +1204,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
if( ksblock.IsKeyframe() )
{
- tracks_map_t::iterator track_it;
- bool const b_valid_track = !vars.obj->FindTrackByBlock( &track_it, NULL, &ksblock );
+ bool const b_valid_track = vars.obj->FindTrackByBlock( NULL, &ksblock ) != NULL;
if (b_valid_track)
vars.obj->_seeker.add_seekpoint( ksblock.TrackNum(), SegmentSeeker::Seekpoint::TRUSTED, ksblock.GetElementPosition(), ksblock.GlobalTimecode() / 1000 );
}
@@ -1226,9 +1221,8 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
vars.block->ReadData( vars.obj->es.I_O() );
vars.block->SetParent( *vars.obj->cluster );
- tracks_map_t::iterator track_it;
- bool const b_valid_track = !vars.obj->FindTrackByBlock( &track_it, &kblock, NULL );
- if( b_valid_track && track_it->second->fmt.i_cat == SPU_ES )
+ const mkv_track_t *p_track = vars.obj->FindTrackByBlock( &kblock, NULL );
+ if( p_track != NULL && p_track->fmt.i_cat == SPU_ES )
{
vars.obj->_seeker.add_seekpoint( kblock.TrackNum(), SegmentSeeker::Seekpoint::TRUSTED, kblock.GetElementPosition(), kblock.GlobalTimecode() / 1000 );
}
@@ -1292,7 +1286,8 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
if( pp_simpleblock != NULL || ((el = ep->Get()) == NULL && pp_block != NULL) )
{
/* Check blocks validity to protect againts broken files */
- if( FindTrackByBlock( &track_it, pp_block , pp_simpleblock ) )
+ const mkv_track_t *p_track = FindTrackByBlock( pp_block , pp_simpleblock );
+ if( p_track == NULL )
{
ep->Unkeep();
pp_simpleblock = NULL;
@@ -1307,7 +1302,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
/* We have block group let's check if the picture is a keyframe */
else if( *pb_key_picture )
{
- if( track_it->second->fmt.i_codec == VLC_CODEC_THEORA )
+ if( p_track->fmt.i_codec == VLC_CODEC_THEORA )
{
DataBuffer * p_data = &pp_block->GetBuffer(0);
const uint8_t * p_buff = p_data->Buffer();
diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp
index cd36f1c89a..65b86816f4 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -144,7 +144,7 @@ public:
int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
- int FindTrackByBlock(tracks_map_t::iterator* track_it, const KaxBlock *, const KaxSimpleBlock * );
+ mkv_track_t * FindTrackByBlock(const KaxBlock *, const KaxSimpleBlock * );
bool ESCreate( );
void ESDestroy( );
diff --git a/modules/demux/mkv/matroska_segment_seeker.cpp b/modules/demux/mkv/matroska_segment_seeker.cpp
index a3ea921fd8..928c33a819 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -312,7 +312,6 @@ SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area
bool b_discardable_picture;
int64_t i_block_duration;
track_id_t track_id;
- matroska_segment_c::tracks_map_t::iterator i_track = ms.tracks.end();
if( ms.BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
break;
@@ -328,7 +327,7 @@ SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area
track_id = block->TrackNum();
}
- bool const b_valid_track = !ms.FindTrackByBlock( &i_track, block, simpleblock );
+ bool const b_valid_track = ms.FindTrackByBlock( block, simpleblock ) != NULL;
delete block;
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 6cdef125d8..544f42568f 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -496,22 +496,19 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
bool b_discardable_picture )
{
- typedef matroska_segment_c::tracks_map_t tracks_map_t;
-
demux_sys_t *p_sys = p_demux->p_sys;
matroska_segment_c *p_segment = p_sys->p_current_vsegment->CurrentSegment();
if( !p_segment ) return;
- tracks_map_t::iterator track_it;
-
- if( p_segment->FindTrackByBlock( &track_it, block, simpleblock ) )
+ mkv_track_t *p_track = p_segment->FindTrackByBlock( block, simpleblock );
+ if( p_track == NULL )
{
msg_Err( p_demux, "invalid track number" );
return;
}
- mkv_track_t &track = *track_it->second;
+ mkv_track_t &track = *p_track;
if( track.fmt.i_cat != NAV_ES && track.p_es == NULL )
{
@@ -717,16 +714,16 @@ static int Demux( demux_t *p_demux)
}
{
- matroska_segment_c::tracks_map_t::iterator track_it;
+ mkv_track_t *p_track = p_segment->FindTrackByBlock( block, simpleblock );
- if( p_segment->FindTrackByBlock( &track_it, block, simpleblock ) )
+ if( p_track == NULL )
{
msg_Err( p_demux, "invalid track number" );
delete block;
return 0;
}
- mkv_track_t &track = *track_it->second;
+ mkv_track_t &track = *p_track;
if( track.i_skip_until_fpos != std::numeric_limits<uint64_t>::max() ) {
--
2.13.0
More information about the vlc-devel
mailing list