[vlc-commits] demux: mkv: extract block additional data
Francois Cartegnie
git at videolan.org
Thu Jul 16 15:10:26 CEST 2020
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jul 16 09:52:12 2020 +0200| [8fef0da38208be5f4056284e70f903604ae2dff2] | committer: Francois Cartegnie
demux: mkv: extract block additional data
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8fef0da38208be5f4056284e70f903604ae2dff2
---
modules/demux/mkv/matroska_segment.cpp | 20 ++++++++++++++++++--
modules/demux/mkv/matroska_segment.hpp | 3 ++-
modules/demux/mkv/matroska_segment_seeker.cpp | 4 +++-
modules/demux/mkv/mkv.cpp | 13 +++++++++++--
modules/demux/mkv/mkv.hpp | 1 +
5 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index 3ec9d55e04..8fba12df9c 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -1172,10 +1172,14 @@ 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 )
+int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_simpleblock,
+ KaxBlockAdditions * & pp_additions,
+ bool *pb_key_picture, bool *pb_discardable_picture,
+ int64_t *pi_duration )
{
pp_simpleblock = NULL;
pp_block = NULL;
+ pp_additions = NULL;
*pb_key_picture = true;
*pb_discardable_picture = false;
@@ -1187,6 +1191,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
demux_t * const p_demuxer;
KaxBlock *& block;
KaxSimpleBlock *& simpleblock;
+ KaxBlockAdditions *& additions;
int64_t & i_duration;
bool & b_key_picture;
@@ -1194,7 +1199,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
bool b_cluster_timecode;
} payload = {
- this, &ep, &sys.demuxer, pp_block, pp_simpleblock,
+ this, &ep, &sys.demuxer, pp_block, pp_simpleblock, pp_additions,
*pi_duration, *pb_key_picture, *pb_discardable_picture, true
};
@@ -1282,6 +1287,17 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
vars.ep->Keep ();
}
+ E_CASE( KaxBlockAdditions, kadditions )
+ {
+ EbmlElement *el;
+ int i_upper_level = 0;
+ try
+ {
+ kadditions.Read( vars.obj->es, EBML_CONTEXT(&kadditions), i_upper_level, el, false );
+ vars.additions = &kadditions;
+ vars.ep->Keep ();
+ } catch (...) {}
+ }
E_CASE( KaxBlockDuration, kduration )
{
kduration.ReadData( vars.obj->es.I_O() );
diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp
index 2879a7622f..a844b66cf4 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -145,7 +145,8 @@ public:
bool Seek( demux_t &, vlc_tick_t i_mk_date, vlc_tick_t i_mk_time_offset, bool b_accurate );
- int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
+ int BlockGet( KaxBlock * &, KaxSimpleBlock * &, KaxBlockAdditions * &,
+ bool *, bool *, int64_t *);
mkv_track_t * FindTrackByBlock(const KaxBlock *, const KaxSimpleBlock * );
diff --git a/modules/demux/mkv/matroska_segment_seeker.cpp b/modules/demux/mkv/matroska_segment_seeker.cpp
index 8498e0163e..217f513887 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -349,13 +349,15 @@ SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area
{
KaxBlock * block;
KaxSimpleBlock * simpleblock;
+ KaxBlockAdditions *additions;
bool b_key_picture;
bool b_discardable_picture;
int64_t i_block_duration;
track_id_t track_id;
- if( ms.BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+ if( ms.BlockGet( block, simpleblock, additions,
+ &b_key_picture, &b_discardable_picture, &i_block_duration ) )
break;
KaxInternalBlock& internal_block = simpleblock
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 6f71936e22..4de13671b6 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -515,6 +515,7 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_mk_date, double f_percent, virtu
/* Needed by matroska_segment::Seek() and Seek */
void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+ KaxBlockAdditions *additions,
vlc_tick_t i_pts, int64_t i_duration, bool b_key_picture,
bool b_discardable_picture )
{
@@ -733,11 +734,13 @@ static int Demux( demux_t *p_demux)
KaxBlock *block;
KaxSimpleBlock *simpleblock;
+ KaxBlockAdditions *additions;
int64_t i_block_duration = 0;
bool b_key_picture;
bool b_discardable_picture;
- if( p_segment->BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+ if( p_segment->BlockGet( block, simpleblock, additions,
+ &b_key_picture, &b_discardable_picture, &i_block_duration ) )
{
if ( p_vsegment->CurrentEdition() && p_vsegment->CurrentEdition()->b_ordered )
{
@@ -769,6 +772,7 @@ static int Demux( demux_t *p_demux)
{
msg_Err( p_demux, "invalid track number" );
delete block;
+ delete additions;
return VLC_DEMUXER_EGENERIC;
}
@@ -782,6 +786,7 @@ static int Demux( demux_t *p_demux)
if ( track.i_skip_until_fpos > block_fpos )
{
delete block;
+ delete additions;
return VLC_DEMUXER_SUCCESS; // this block shall be ignored
}
}
@@ -815,6 +820,7 @@ static int Demux( demux_t *p_demux)
{
msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." );
delete block;
+ delete additions;
return VLC_DEMUXER_EGENERIC;
}
@@ -834,12 +840,15 @@ static int Demux( demux_t *p_demux)
{
/* nothing left to read in this ordered edition */
delete block;
+ delete additions;
return VLC_DEMUXER_EOF;
}
- BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
+ BlockDecode( p_demux, block, simpleblock, additions,
+ p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
delete block;
+ delete additions;
return VLC_DEMUXER_SUCCESS;
}
diff --git a/modules/demux/mkv/mkv.hpp b/modules/demux/mkv/mkv.hpp
index a061254228..924d460b23 100644
--- a/modules/demux/mkv/mkv.hpp
+++ b/modules/demux/mkv/mkv.hpp
@@ -120,6 +120,7 @@ enum
using namespace LIBMATROSKA_NAMESPACE;
void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+ KaxBlockAdditions *additions,
vlc_tick_t i_pts, vlc_tick_t i_duration, bool b_key_picture,
bool b_discardable_picture );
More information about the vlc-commits
mailing list