Browse Source

demux: mkv: create only one instance of matroska script interpreter

pull/165/head
Khalid Masum 2 years ago
committed by Steve Lhomme
parent
commit
ee7b4cc26e
  1. 1
      modules/demux/mkv/chapter_command.hpp
  2. 6
      modules/demux/mkv/chapter_command_script.hpp
  3. 15
      modules/demux/mkv/demux.hpp
  4. 11
      modules/demux/mkv/matroska_segment_parse.cpp

1
modules/demux/mkv/chapter_command.hpp

@ -89,7 +89,6 @@ protected:
struct vlc_logger *l;
chapter_codec_vm & vm;
};
} // namespace
#endif

6
modules/demux/mkv/chapter_command_script.hpp

@ -34,16 +34,16 @@ protected:
class matroska_script_codec_c : public chapter_codec_cmds_c
{
public:
matroska_script_codec_c( struct vlc_logger *log, chapter_codec_vm & vm_ )
matroska_script_codec_c( struct vlc_logger *log, chapter_codec_vm & vm_, matroska_script_interpretor_c & interpreter_)
:chapter_codec_cmds_c( log, vm_, MATROSKA_CHAPTER_CODEC_NATIVE )
,interpreter( log, vm_ )
,interpreter( interpreter_ )
{}
bool Enter();
bool Leave();
protected:
matroska_script_interpretor_c interpreter;
matroska_script_interpretor_c & interpreter;
};
} // namespace

15
modules/demux/mkv/demux.hpp

@ -28,6 +28,7 @@
#include "chapter_command.hpp"
#include "chapter_command_dvd.hpp"
#include "chapter_command_script.hpp"
#include "events.hpp"
#include <memory>
@ -123,6 +124,19 @@ public:
return dvd_interpretor.get();
}
matroska_script_interpretor_c * GetMatroskaScriptInterpreter()
{
if (!ms_interpreter)
{
try {
ms_interpreter = std::make_unique<matroska_script_interpretor_c> ( vlc_object_logger( &demuxer ), *this );
} catch ( const std::bad_alloc & ) {
}
}
return ms_interpreter.get();
}
uint8_t palette[4][4];
vlc_mutex_t lock_demuxer;
@ -132,6 +146,7 @@ public:
private:
virtual_segment_c *p_current_vsegment = nullptr;
std::unique_ptr<dvd_command_interpretor_c> dvd_interpretor; // protected by lock_demuxer
std::unique_ptr<matroska_script_interpretor_c> ms_interpreter;
};
} // namespace

11
modules/demux/mkv/matroska_segment_parse.cpp

@ -1442,7 +1442,16 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap
if( MKV_CHECKED_PTR_DECL_CONST( p_codec_id, KaxChapterProcessCodecID, proc ) )
{
if ( p_codec_id->GetValue() == MATROSKA_CHAPTER_CODEC_NATIVE )
p_ccodec = new matroska_script_codec_c( vlc_object_logger( &vars.obj->sys.demuxer ), vars.obj->sys );
{
auto interpreter = vars.obj->sys.GetMatroskaScriptInterpreter();
if (unlikely(interpreter == nullptr))
debug( vars, "failed to get the Matroska Script interpreter ");
else
p_ccodec = new matroska_script_codec_c(
vlc_object_logger( &vars.obj->sys.demuxer ),
vars.obj->sys, *interpreter
);
}
else if ( p_codec_id->GetValue() == MATROSKA_CHAPTER_CODEC_DVD )
{
auto interepreter = vars.obj->sys.GetDVDInterpretor();

Loading…
Cancel
Save