[vlc-commits] demux: mkv: extract block additional data
Francois Cartegnie
git at videolan.org
Wed Jul 22 16:17:37 CEST 2020
vlc/vlc-3.0 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jul 16 09:52:12 2020 +0200| [b8f0b15e02ad6a70a5b1b3d7cc9e8523fe1da355] | committer: Francois Cartegnie
demux: mkv: extract block additional data
(cherry picked from commit 8fef0da38208be5f4056284e70f903604ae2dff2)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=b8f0b15e02ad6a70a5b1b3d7cc9e8523fe1da355
---
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 | 17 +++++++++++++----
modules/demux/mkv/mkv.hpp | 1 +
5 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index b3d897a533..4b4c73e23c 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -1175,10 +1175,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;
@@ -1190,6 +1194,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;
@@ -1197,7 +1202,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
};
@@ -1285,6 +1290,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 7c564d054f..8a7454a1cd 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -143,7 +143,8 @@ public:
bool Seek( demux_t &, mtime_t i_mk_date, mtime_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 3f28ae2997..d22c60f444 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -352,13 +352,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;
if( simpleblock ) {
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 8b78c46065..647ec0ebac 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -487,7 +487,8 @@ static int Seek( demux_t *p_demux, mtime_t i_mk_date, double f_percent, virtual_
/* Needed by matroska_segment::Seek() and Seek */
void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
- mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
+ KaxBlockAdditions *additions,
+ mtime_t i_pts, int64_t i_duration, bool b_key_picture,
bool b_discardable_picture )
{
demux_sys_t *p_sys = p_demux->p_sys;
@@ -703,11 +704,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 )
{
@@ -735,6 +738,7 @@ static int Demux( demux_t *p_demux)
{
msg_Err( p_demux, "invalid track number" );
delete block;
+ delete additions;
return 0;
}
@@ -751,7 +755,8 @@ static int Demux( demux_t *p_demux)
if ( track.i_skip_until_fpos > block_fpos )
{
delete block;
- return 1; // this block shall be ignored
+ delete additions;
+ return 1; // this block shall be ignored
}
}
}
@@ -784,6 +789,7 @@ static int Demux( demux_t *p_demux)
{
msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." );
delete block;
+ delete additions;
return 0;
}
@@ -805,12 +811,15 @@ static int Demux( demux_t *p_demux)
{
/* nothing left to read in this ordered edition */
delete block;
+ delete additions;
return 0;
}
- 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 1;
}
diff --git a/modules/demux/mkv/mkv.hpp b/modules/demux/mkv/mkv.hpp
index 5b9fa4699c..38a62aa2af 100644
--- a/modules/demux/mkv/mkv.hpp
+++ b/modules/demux/mkv/mkv.hpp
@@ -121,6 +121,7 @@ enum
using namespace LIBMATROSKA_NAMESPACE;
void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+ KaxBlockAdditions *additions,
mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
bool b_discardable_picture );
More information about the vlc-commits
mailing list