vlc | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Tue Jan 30 09:02:14 2018 +0100| [488e6712143de4ea71acf828c82df9c9f000088f] | committer: Steve Lhomme
demux:mkv: add support for V_PRORES The decoder wants the atom header that has been stripped so we add it on every frame we read. Fixes #19568 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=488e6712143de4ea71acf828c82df9c9f000088f --- modules/demux/mkv/matroska_segment_parse.cpp | 4 ++++ modules/demux/mkv/mkv.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp index 44c82b50a9..81b674b62d 100644 --- a/modules/demux/mkv/matroska_segment_parse.cpp +++ b/modules/demux/mkv/matroska_segment_parse.cpp @@ -1630,6 +1630,10 @@ bool matroska_segment_c::TrackInit( mkv_track_t * p_tk ) vars.p_fmt->i_codec = VLC_CODEC_FFV1; fill_extra_data( vars.p_tk, 0 ); } + S_CASE("V_PRORES") { + vars.p_fmt->i_codec = VLC_CODEC_PRORES; + fill_extra_data( vars.p_tk, 0 ); + } S_CASE("A_MS/ACM") { mkv_track_t * p_tk = vars.p_tk; es_format_t * p_fmt = &vars.p_tk->fmt; diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp index edc594bf5e..86b4a3ad26 100644 --- a/modules/demux/mkv/mkv.cpp +++ b/modules/demux/mkv/mkv.cpp @@ -570,15 +570,16 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock msg_Warn( p_demux, "Cannot read frame (too long or no frame)" ); break; } + size_t extra_data = track.fmt.i_codec == VLC_CODEC_PRORES ? 8 : 0; if( track.i_compression_type == MATROSKA_COMPRESSION_HEADER && track.p_compression_data != NULL && track.i_encoding_scope & MATROSKA_ENCODING_SCOPE_ALL_FRAMES ) - p_block = MemToBlock( data->Buffer(), data->Size(), track.p_compression_data->GetSize() ); + p_block = MemToBlock( data->Buffer(), data->Size(), track.p_compression_data->GetSize() + extra_data ); else if( unlikely( track.fmt.i_codec == VLC_CODEC_WAVPACK ) ) p_block = packetize_wavpack( track, data->Buffer(), data->Size() ); else - p_block = MemToBlock( data->Buffer(), data->Size(), 0 ); + p_block = MemToBlock( data->Buffer(), data->Size(), extra_data ); if( p_block == NULL ) { @@ -600,6 +601,8 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock { memcpy( p_block->p_buffer, track.p_compression_data->GetBuffer(), track.p_compression_data->GetSize() ); } + if ( track.fmt.i_codec == VLC_CODEC_PRORES ) + memcpy( p_block->p_buffer + 4, "icpf", 4 ); if ( b_key_picture ) p_block->i_flags |= BLOCK_FLAG_TYPE_I; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits