You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
7.2 KiB

// Copyright (C) 2003-2024 VLC authors and VideoLAN
// SPDX-License-Identifier: LGPL-2.1-or-later
//
// chapter_command_dvd.hpp : DVD codec for Matroska Chapter Codecs
// Authors: Laurent Aimar <fenrir@via.ecp.fr>
// Steve Lhomme <steve.lhomme@free.fr>
#ifndef VLC_MKV_CHAPTER_COMMAND_DVD_HPP_
#define VLC_MKV_CHAPTER_COMMAND_DVD_HPP_
#include "chapter_command.hpp"
#include "dvd_types.hpp"
namespace mkv {
class dvd_command_interpretor_c
{
public:
dvd_command_interpretor_c( struct vlc_logger *log, chapter_codec_vm & vm_ )
:l( log )
,vm( vm_ )
{
memset( p_PRMs, 0, sizeof(p_PRMs) );
p_PRMs[ 0x80 + 1 ] = 15;
p_PRMs[ 0x80 + 2 ] = 62;
p_PRMs[ 0x80 + 3 ] = 1;
p_PRMs[ 0x80 + 4 ] = 1;
p_PRMs[ 0x80 + 7 ] = 1;
p_PRMs[ 0x80 + 8 ] = 1;
p_PRMs[ 0x80 + 16 ] = 0xFFFFu;
p_PRMs[ 0x80 + 18 ] = 0xFFFFu;
}
bool Interpret( MatroskaChapterProcessTime, const binary * p_command, size_t i_size );
bool HandleKeyEvent( NavivationKey );
void HandleMousePressed( unsigned x, unsigned y );
void SetPci(const uint8_t *, unsigned size);
protected:
uint16_t GetPRM( size_t index ) const
{
if ( index < 256 )
return p_PRMs[ index ];
else return 0;
}
uint16_t GetGPRM( size_t index ) const
{
if ( index < 16 )
return p_PRMs[ index ];
else return 0;
}
uint16_t GetSPRM( size_t index ) const
{
// 21,22,23 reserved for future use
if ( index >= 0x80 && index < 0x95 )
return p_PRMs[ index ];
else return 0;
}
bool SetPRM( size_t index, uint16_t value )
{
if ( index < 16 )
{
p_PRMs[ index ] = value;
return true;
}
return false;
}
bool SetGPRM( size_t index, uint16_t value )
{
if ( index < 16 )
{
p_PRMs[ index ] = value;
return true;
}
return false;
}
bool SetSPRM( size_t index, uint16_t value )
{
if ( index > 0x80 && index <= 0x8D && index != 0x8C )
{
p_PRMs[ index ] = value;
return true;
}
return false;
}
bool ProcessNavAction( uint16_t button );
std::string GetRegTypeName( bool b_value, uint16_t value ) const
{
std::string result;
char s_value[6], s_reg_value[6];
snprintf( s_value, ARRAY_SIZE(s_value), "%.5d", value );
if ( b_value )
{
result = "value (";
result += s_value;
result += ")";
}
else if ( value < 0x80 )
{
snprintf( s_reg_value, ARRAY_SIZE(s_reg_value), "%.5d", GetPRM( value ) );
result = "GPreg[";
result += s_value;
result += "] (";
result += s_reg_value;
result += ")";
}
else
{
snprintf( s_reg_value, ARRAY_SIZE(s_reg_value), "%.5d", GetPRM( value ) );
result = "SPreg[";
result += s_value;
result += "] (";
result += s_reg_value;
result += ")";
}
return result;
}
uint16_t p_PRMs[256];
struct vlc_logger *l;
chapter_codec_vm & vm;
pci_t pci_packet = {};
// DVD command IDs
// Tests
// whether it's a comparison on the value or register
static const uint16_t CMD_DVD_TEST_VALUE = 0x80;
static const uint16_t CMD_DVD_IF_GPREG_AND = (1 << 4);
static const uint16_t CMD_DVD_IF_GPREG_EQUAL = (2 << 4);
static const uint16_t CMD_DVD_IF_GPREG_NOT_EQUAL = (3 << 4);
static const uint16_t CMD_DVD_IF_GPREG_SUP_EQUAL = (4 << 4);
static const uint16_t CMD_DVD_IF_GPREG_SUP = (5 << 4);
static const uint16_t CMD_DVD_IF_GPREG_INF_EQUAL = (6 << 4);
static const uint16_t CMD_DVD_IF_GPREG_INF = (7 << 4);
static const uint16_t CMD_DVD_NOP = 0x0000;
static const uint16_t CMD_DVD_GOTO_LINE = 0x0001;
static const uint16_t CMD_DVD_BREAK = 0x0002;
// Links
static const uint16_t CMD_DVD_NOP2 = 0x2001;
static const uint16_t CMD_DVD_LINKPGCN = 0x2004;
static const uint16_t CMD_DVD_LINKPGN = 0x2006;
static const uint16_t CMD_DVD_LINKCN = 0x2007;
static const uint16_t CMD_DVD_JUMP_TT = 0x3002;
static const uint16_t CMD_DVD_JUMPVTS_TT = 0x3003;
static const uint16_t CMD_DVD_JUMPVTS_PTT = 0x3005;
static const uint16_t CMD_DVD_JUMP_SS = 0x3006;
static const uint16_t CMD_DVD_CALLSS_VTSM1 = 0x3008;
//
static const uint16_t CMD_DVD_SET_HL_BTNN2 = 0x4600;
static const uint16_t CMD_DVD_SET_HL_BTNN_LINKPGCN1 = 0x4604;
static const uint16_t CMD_DVD_SET_STREAM = 0x5100;
static const uint16_t CMD_DVD_SET_GPRMMD = 0x5300;
static const uint16_t CMD_DVD_SET_HL_BTNN1 = 0x5600;
static const uint16_t CMD_DVD_SET_HL_BTNN_LINKPGCN2 = 0x5604;
static const uint16_t CMD_DVD_SET_HL_BTNN_LINKCN = 0x5607;
// Operations
static const uint16_t CMD_DVD_MOV_SPREG_PREG = 0x6100;
static const uint16_t CMD_DVD_GPREG_MOV_VALUE = 0x7100;
static const uint16_t CMD_DVD_SUB_GPREG = 0x7400;
static const uint16_t CMD_DVD_MULT_GPREG = 0x7500;
static const uint16_t CMD_DVD_GPREG_DIV_VALUE = 0x7600;
static const uint16_t CMD_DVD_GPREG_AND_VALUE = 0x7900;
// callbacks when browsing inside CodecPrivate
static bool MatchIsDomain ( const chapter_codec_cmds_c & );
static bool MatchIsVMG ( const chapter_codec_cmds_c & );
static bool MatchVTSNumber ( const chapter_codec_cmds_c &, uint16_t i_title );
static bool MatchVTSMNumber ( const chapter_codec_cmds_c &, uint8_t i_title );
static bool MatchTitleNumber ( const chapter_codec_cmds_c &, uint8_t i_title );
static bool MatchPgcType ( const chapter_codec_cmds_c &, uint8_t i_pgc );
static bool MatchPgcNumber ( const chapter_codec_cmds_c &, uint16_t i_pgc_n );
static bool MatchChapterNumber( const chapter_codec_cmds_c &, uint8_t i_ptt );
static bool MatchCellNumber ( const chapter_codec_cmds_c &, uint8_t i_cell_n );
};
class dvd_chapter_codec_c : public chapter_codec_cmds_c
{
public:
dvd_chapter_codec_c( struct vlc_logger *log, chapter_codec_vm & vm_, dvd_command_interpretor_c & intepretor_ )
:chapter_codec_cmds_c( log, vm_, MATROSKA_CHAPTER_CODEC_DVD )
,intepretor(intepretor_)
{}
bool Enter() override;
bool Leave() override;
std::string GetCodecName( bool f_for_title = false ) const override;
int16_t GetTitleNumber() const override;
protected:
bool EnterLeaveHelper( char const*, ChapterProcess &, MatroskaChapterProcessTime );
dvd_command_interpretor_c & intepretor;
};
} // namespace
#endif // VLC_MKV_CHAPTER_COMMAND_DVD_HPP_