Commit 25bb1708 authored by Steve Lhomme's avatar Steve Lhomme Committed by Jean-Baptiste Kempf

mkv: store a unique_ptr version of the mkv_track_t in the track list

The next step is to provide a destructor so the tracks_map_t can deal with the
lifecycle of the mkv_track_t.
Signed-off-by: Jean-Baptiste Kempf's avatarJean-Baptiste Kempf <jb@videolan.org>
parent a90e2f04
......@@ -67,7 +67,7 @@ matroska_segment_c::~matroska_segment_c()
{
for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it)
{
tracks_map_t::mapped_type& track = it->second;
mkv_track_t & track = *it->second;
es_format_Clean( &track.fmt );
delete track.p_compression_data;
......@@ -819,7 +819,7 @@ bool matroska_segment_c::Seek( mtime_t i_absolute_mk_date, mtime_t i_mk_time_off
for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it )
{
mkv_track_t& track = it->second;
mkv_track_t &track = *it->second;
track.i_skip_until_fpos = -1;
if( track.i_last_dts > VLC_TS_INVALID )
......@@ -848,8 +848,8 @@ bool matroska_segment_c::Seek( mtime_t i_absolute_mk_date, mtime_t i_mk_time_off
i_mk_seek_time = it->second.pts;
}
tracks.at( it->first ).i_skip_until_fpos = it->second.fpos;
tracks.at( it->first ).i_last_dts = it->second.pts;
tracks.at( it->first )->i_skip_until_fpos = it->second.fpos;
tracks.at( it->first )->i_last_dts = it->second.pts;
msg_Dbg( &sys.demuxer, "seek: preroll{ track: %u, pts: %" PRId64 ", fpos: %" PRIu64 " } ",
it->first, it->second.pts, it->second.fpos );
......@@ -904,7 +904,7 @@ void matroska_segment_c::ComputeTrackPriority()
for( tracks_map_t::const_iterator it = tracks.begin(); it != tracks.end();
++it )
{
const tracks_map_t::mapped_type& track = it->second;
mkv_track_t &track = *it->second;
bool flag = track.b_enabled && ( track.b_default || track.b_forced );
......@@ -918,8 +918,8 @@ void matroska_segment_c::ComputeTrackPriority()
for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it )
{
tracks_map_t::key_type track_id = it->first;
tracks_map_t::mapped_type& track = it->second;
tracks_map_t::key_type track_id = it->first;
mkv_track_t & track = *it->second;
if( unlikely( track.fmt.i_cat == UNKNOWN_ES || track.codec.empty() ) )
{
......@@ -960,7 +960,7 @@ void matroska_segment_c::ComputeTrackPriority()
{
int track_score = -1;
switch( it->second.fmt.i_cat )
switch( it->second->fmt.i_cat )
{
case VIDEO_ES: ++track_score;
case AUDIO_ES: ++track_score;
......@@ -968,7 +968,7 @@ void matroska_segment_c::ComputeTrackPriority()
default:
if( score < track_score )
{
es_type = it->second.fmt.i_cat;
es_type = it->second->fmt.i_cat;
score = track_score;
}
}
......@@ -976,7 +976,7 @@ void matroska_segment_c::ComputeTrackPriority()
for( tracks_map_t::const_iterator it = this->tracks.begin(); it != this->tracks.end(); ++it )
{
if( it->second.fmt.i_cat == es_type )
if( it->second->fmt.i_cat == es_type )
priority_tracks.push_back( it->first );
}
}
......@@ -1085,8 +1085,8 @@ bool matroska_segment_c::ESCreate()
for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it )
{
tracks_map_t::key_type track_id = it->first;
tracks_map_t::mapped_type& track = it->second;
tracks_map_t::key_type track_id = it->first;
mkv_track_t & track = *it->second;
if( unlikely( track.fmt.i_cat == UNKNOWN_ES || track.codec.empty() ) )
{
......@@ -1118,7 +1118,7 @@ void matroska_segment_c::ESDestroy( )
for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it )
{
tracks_map_t::mapped_type& track = it->second;
mkv_track_t & track = *it->second;
if( track.p_es != NULL )
{
......@@ -1229,7 +1229,7 @@ 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 );
if( vars.obj->tracks.at( kblock.TrackNum() ).fmt.i_cat == SPU_ES )
if( vars.obj->tracks.at( kblock.TrackNum() )->fmt.i_cat == SPU_ES )
{
vars.obj->_seeker.add_seekpoint( kblock.TrackNum(), SegmentSeeker::Seekpoint::TRUSTED, kblock.GetElementPosition(), kblock.GlobalTimecode() / 1000 );
}
......@@ -1308,7 +1308,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( track_it->second->fmt.i_codec == VLC_CODEC_THEORA )
{
DataBuffer * p_data = &pp_block->GetBuffer(0);
const uint8_t * p_buff = p_data->Buffer();
......
......@@ -32,6 +32,7 @@
#include <map>
#include <set>
#include <memory>
class EbmlParser;
......@@ -74,7 +75,7 @@ public:
class matroska_segment_c
{
public:
typedef std::map<mkv_track_t::track_id_t, mkv_track_t> tracks_map_t;
typedef std::map<mkv_track_t::track_id_t, std::unique_ptr<mkv_track_t>> tracks_map_t;
typedef std::vector<Tag> tags_t;
matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream );
......
......@@ -230,7 +230,7 @@ void matroska_segment_c::ParseTrackEntry( const KaxTrackEntry *m )
}
/* Init the track */
mkv_track_t track( es_cat );
mkv_track_t *p_track = new mkv_track_t(es_cat);
MkvTree( sys.demuxer, 2, "Track Entry" );
......@@ -251,7 +251,7 @@ void matroska_segment_c::ParseTrackEntry( const KaxTrackEntry *m )
} track_video_info;
} metadata_payload = {
this, &track, &sys.demuxer, bSupported, 3, { }
this, p_track, &sys.demuxer, bSupported, 3, { }
};
MKV_SWITCH_CREATE( EbmlTypeDispatcher, MetaDataHandlers, MetaDataCapture )
......@@ -670,43 +670,47 @@ void matroska_segment_c::ParseTrackEntry( const KaxTrackEntry *m )
MetaDataHandlers::Dispatcher().iterate ( m->begin(), m->end(), MetaDataHandlers::Payload( metadata_payload ) );
if( track.i_number == 0 )
if( p_track->i_number == 0 )
{
msg_Warn( &sys.demuxer, "Missing KaxTrackNumber, discarding track!" );
es_format_Clean( &track.fmt );
free(track.p_extra_data);
es_format_Clean( &p_track->fmt );
free(p_track->p_extra_data);
delete p_track;
return;
}
if ( bSupported )
{
#ifdef HAVE_ZLIB_H
if( track.i_compression_type == MATROSKA_COMPRESSION_ZLIB &&
track.i_encoding_scope & MATROSKA_ENCODING_SCOPE_PRIVATE &&
track.i_extra_data && track.p_extra_data &&
zlib_decompress_extra( &sys.demuxer, track ) )
{
msg_Err(&sys.demuxer, "Couldn't handle the track %u compression", track.i_number );
es_format_Clean( &track.fmt );
free(track.p_extra_data);
if( p_track->i_compression_type == MATROSKA_COMPRESSION_ZLIB &&
p_track->i_encoding_scope & MATROSKA_ENCODING_SCOPE_PRIVATE &&
p_track->i_extra_data && p_track->p_extra_data &&
zlib_decompress_extra( &sys.demuxer, *p_track ) )
{
msg_Err(&sys.demuxer, "Couldn't handle the track %u compression", p_track->i_number );
es_format_Clean( &p_track->fmt );
free(p_track->p_extra_data);
delete p_track;
return;
}
#endif
if( !TrackInit( &track ) )
if( !TrackInit( p_track ) )
{
msg_Err(&sys.demuxer, "Couldn't init track %u", track.i_number );
es_format_Clean( &track.fmt );
free(track.p_extra_data);
msg_Err(&sys.demuxer, "Couldn't init track %u", p_track->i_number );
es_format_Clean( &p_track->fmt );
free(p_track->p_extra_data);
delete p_track;
return;
}
tracks.insert( std::make_pair( track.i_number, track ) ); // TODO: add warning if two tracks have the same key
tracks.insert( std::make_pair( p_track->i_number, std::unique_ptr<mkv_track_t>(p_track) ) ); // TODO: add warning if two tracks have the same key
}
else
{
msg_Err( &sys.demuxer, "Track Entry %u not supported", track.i_number );
es_format_Clean( &track.fmt );
free(track.p_extra_data);
msg_Err( &sys.demuxer, "Track Entry %u not supported", p_track->i_number );
es_format_Clean( &p_track->fmt );
free(p_track->p_extra_data);
delete p_track;
}
}
......
......@@ -431,7 +431,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
const matroska_segment_c *p_segment = p_sys->p_current_vsegment->CurrentSegment();
for( tracks_map_t::const_iterator it = p_segment->tracks.begin(); it != p_segment->tracks.end(); ++it )
{
tracks_map_t::mapped_type const& track = it->second;
const mkv_track_t &track = *it->second;
if( track.fmt.i_cat == VIDEO_ES && track.fmt.video.i_frame_rate_base > 0 )
{
......@@ -511,7 +511,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
return;
}
tracks_map_t::mapped_type& track = track_it->second;
mkv_track_t &track = *track_it->second;
if( track.fmt.i_cat != NAV_ES && track.p_es == NULL )
{
......@@ -726,7 +726,7 @@ static int Demux( demux_t *p_demux)
return 0;
}
matroska_segment_c::tracks_map_t::mapped_type& track = track_it->second;
mkv_track_t &track = *track_it->second;
if( track.i_skip_until_fpos != std::numeric_limits<uint64_t>::max() ) {
......@@ -754,7 +754,7 @@ static int Demux( demux_t *p_demux)
for( tracks_map_t::iterator it = p_segment->tracks.begin(); it != p_segment->tracks.end(); ++it )
{
tracks_map_t::mapped_type& track = it->second;
mkv_track_t &track = *it->second;
if( track.i_last_dts == VLC_TS_INVALID )
continue;
......
......@@ -695,7 +695,7 @@ void virtual_segment_c::KeepTrackSelection( matroska_segment_c & old, matroska_s
char *sub_lang = NULL, *aud_lang = NULL;
for( tracks_map_t::iterator it = old.tracks.begin(); it != old.tracks.end(); ++it )
{
tracks_map_t::mapped_type& track = it->second;
mkv_track_t &track = *it->second;
if( track.p_es )
{
bool state = false;
......@@ -711,8 +711,8 @@ void virtual_segment_c::KeepTrackSelection( matroska_segment_c & old, matroska_s
}
for( tracks_map_t::iterator it = next.tracks.begin(); it != next.tracks.end(); ++it )
{
tracks_map_t::mapped_type& new_track = it->second;
es_format_t & new_fmt = new_track.fmt;
mkv_track_t & new_track = *it->second;
es_format_t & new_fmt = new_track.fmt;
/* Let's only do that for audio and video for now */
if( new_fmt.i_cat == AUDIO_ES || new_fmt.i_cat == VIDEO_ES )
......@@ -720,7 +720,7 @@ void virtual_segment_c::KeepTrackSelection( matroska_segment_c & old, matroska_s
/* check for a similar elementary stream */
for( tracks_map_t::iterator old_it = old.tracks.begin(); old_it != old.tracks.end(); ++old_it )
{
tracks_map_t::mapped_type& old_track = old_it->second;
mkv_track_t& old_track = *old_it->second;
es_format_t& old_fmt = old_track.fmt;
if( !old_track.p_es )
......
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