chapter_command.hpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:10k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * mkv.cpp : matroska demuxer
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 the VideoLAN team
  5.  * $Id: 98316a2ab00955464c50e03a384e8bba572eafd4 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Steve Lhomme <steve.lhomme@free.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifndef _CHAPTER_COMMAND_H_
  25. #define _CHAPTER_COMMAND_H_
  26. #include "mkv.hpp"
  27. const binary MATROSKA_DVD_LEVEL_SS   = 0x30;
  28. const binary MATROSKA_DVD_LEVEL_LU   = 0x2A;
  29. const binary MATROSKA_DVD_LEVEL_TT   = 0x28;
  30. const binary MATROSKA_DVD_LEVEL_PGC  = 0x20;
  31. const binary MATROSKA_DVD_LEVEL_PG   = 0x18;
  32. const binary MATROSKA_DVD_LEVEL_PTT  = 0x10;
  33. const binary MATROSKA_DVD_LEVEL_CN   = 0x08;
  34. class demux_sys_t;
  35. class chapter_codec_cmds_c
  36. {
  37. public:
  38.     chapter_codec_cmds_c( demux_sys_t & demuxer, int codec_id = -1)
  39.     :p_private_data(NULL)
  40.     ,i_codec_id( codec_id )
  41.     ,sys( demuxer )
  42.     {}
  43.  
  44.     virtual ~chapter_codec_cmds_c()
  45.     {
  46.         delete p_private_data;
  47.         std::vector<KaxChapterProcessData*>::iterator indexe = enter_cmds.begin();
  48.         while ( indexe != enter_cmds.end() )
  49.         {
  50.             delete (*indexe);
  51.             indexe++;
  52.         }
  53.         std::vector<KaxChapterProcessData*>::iterator indexl = leave_cmds.begin();
  54.         while ( indexl != leave_cmds.end() )
  55.         {
  56.             delete (*indexl);
  57.             indexl++;
  58.         }
  59.         std::vector<KaxChapterProcessData*>::iterator indexd = during_cmds.begin();
  60.         while ( indexd != during_cmds.end() )
  61.         {
  62.             delete (*indexd);
  63.             indexd++;
  64.         }
  65.     }
  66.     void SetPrivate( const KaxChapterProcessPrivate & private_data )
  67.     {
  68.         p_private_data = new KaxChapterProcessPrivate( private_data );
  69.     }
  70.     void AddCommand( const KaxChapterProcessCommand & command );
  71.  
  72.     /// return wether the codec has seeked in the files or not
  73.     virtual bool Enter() { return false; }
  74.     virtual bool Leave() { return false; }
  75.     virtual std::string GetCodecName( bool f_for_title = false ) const { return ""; }
  76.     virtual int16 GetTitleNumber() { return -1; }
  77.     KaxChapterProcessPrivate *p_private_data;
  78. protected:
  79.     std::vector<KaxChapterProcessData*> enter_cmds;
  80.     std::vector<KaxChapterProcessData*> during_cmds;
  81.     std::vector<KaxChapterProcessData*> leave_cmds;
  82.     int i_codec_id;
  83.     demux_sys_t & sys;
  84. };
  85. class dvd_command_interpretor_c
  86. {
  87. public:
  88.     dvd_command_interpretor_c( demux_sys_t & demuxer )
  89.     :sys( demuxer )
  90.     {
  91.         memset( p_PRMs, 0, sizeof(p_PRMs) );
  92.         p_PRMs[ 0x80 + 1 ] = 15;
  93.         p_PRMs[ 0x80 + 2 ] = 62;
  94.         p_PRMs[ 0x80 + 3 ] = 1;
  95.         p_PRMs[ 0x80 + 4 ] = 1;
  96.         p_PRMs[ 0x80 + 7 ] = 1;
  97.         p_PRMs[ 0x80 + 8 ] = 1;
  98.         p_PRMs[ 0x80 + 16 ] = 0xFFFFu;
  99.         p_PRMs[ 0x80 + 18 ] = 0xFFFFu;
  100.     }
  101.  
  102.     bool Interpret( const binary * p_command, size_t i_size = 8 );
  103.  
  104.     uint16 GetPRM( size_t index ) const
  105.     {
  106.         if ( index < 256 )
  107.             return p_PRMs[ index ];
  108.         else return 0;
  109.     }
  110.     uint16 GetGPRM( size_t index ) const
  111.     {
  112.         if ( index < 16 )
  113.             return p_PRMs[ index ];
  114.         else return 0;
  115.     }
  116.     uint16 GetSPRM( size_t index ) const
  117.     {
  118.         // 21,22,23 reserved for future use
  119.         if ( index >= 0x80 && index < 0x95 )
  120.             return p_PRMs[ index ];
  121.         else return 0;
  122.     }
  123.     bool SetPRM( size_t index, uint16 value )
  124.     {
  125.         if ( index < 16 )
  126.         {
  127.             p_PRMs[ index ] = value;
  128.             return true;
  129.         }
  130.         return false;
  131.     }
  132.  
  133.     bool SetGPRM( size_t index, uint16 value )
  134.     {
  135.         if ( index < 16 )
  136.         {
  137.             p_PRMs[ index ] = value;
  138.             return true;
  139.         }
  140.         return false;
  141.     }
  142.     bool SetSPRM( size_t index, uint16 value )
  143.     {
  144.         if ( index > 0x80 && index <= 0x8D && index != 0x8C )
  145.         {
  146.             p_PRMs[ index ] = value;
  147.             return true;
  148.         }
  149.         return false;
  150.     }
  151. protected:
  152.     std::string GetRegTypeName( bool b_value, uint16 value ) const
  153.     {
  154.         std::string result;
  155.         char s_value[6], s_reg_value[6];
  156.         sprintf( s_value, "%.5d", value );
  157.         if ( b_value )
  158.         {
  159.             result = "value (";
  160.             result += s_value;
  161.             result += ")";
  162.         }
  163.         else if ( value < 0x80 )
  164.         {
  165.             sprintf( s_reg_value, "%.5d", GetPRM( value ) );
  166.             result = "GPreg[";
  167.             result += s_value;
  168.             result += "] (";
  169.             result += s_reg_value;
  170.             result += ")";
  171.         }
  172.         else
  173.         {
  174.             sprintf( s_reg_value, "%.5d", GetPRM( value ) );
  175.             result = "SPreg[";
  176.             result += s_value;
  177.             result += "] (";
  178.             result += s_reg_value;
  179.             result += ")";
  180.         }
  181.         return result;
  182.     }
  183.     uint16       p_PRMs[256];
  184.     demux_sys_t  & sys;
  185.  
  186.     // DVD command IDs
  187.     // Tests
  188.     // wether it's a comparison on the value or register
  189.     static const uint16 CMD_DVD_TEST_VALUE          = 0x80;
  190.     static const uint16 CMD_DVD_IF_GPREG_AND        = (1 << 4);
  191.     static const uint16 CMD_DVD_IF_GPREG_EQUAL      = (2 << 4);
  192.     static const uint16 CMD_DVD_IF_GPREG_NOT_EQUAL  = (3 << 4);
  193.     static const uint16 CMD_DVD_IF_GPREG_SUP_EQUAL  = (4 << 4);
  194.     static const uint16 CMD_DVD_IF_GPREG_SUP        = (5 << 4);
  195.     static const uint16 CMD_DVD_IF_GPREG_INF_EQUAL  = (6 << 4);
  196.     static const uint16 CMD_DVD_IF_GPREG_INF        = (7 << 4);
  197.  
  198.     static const uint16 CMD_DVD_NOP                    = 0x0000;
  199.     static const uint16 CMD_DVD_GOTO_LINE              = 0x0001;
  200.     static const uint16 CMD_DVD_BREAK                  = 0x0002;
  201.     // Links
  202.     static const uint16 CMD_DVD_NOP2                   = 0x2001;
  203.     static const uint16 CMD_DVD_LINKPGCN               = 0x2004;
  204.     static const uint16 CMD_DVD_LINKPGN                = 0x2006;
  205.     static const uint16 CMD_DVD_LINKCN                 = 0x2007;
  206.     static const uint16 CMD_DVD_JUMP_TT                = 0x3002;
  207.     static const uint16 CMD_DVD_JUMPVTS_TT             = 0x3003;
  208.     static const uint16 CMD_DVD_JUMPVTS_PTT            = 0x3005;
  209.     static const uint16 CMD_DVD_JUMP_SS                = 0x3006;
  210.     static const uint16 CMD_DVD_CALLSS_VTSM1           = 0x3008;
  211.     //
  212.     static const uint16 CMD_DVD_SET_HL_BTNN2           = 0x4600;
  213.     static const uint16 CMD_DVD_SET_HL_BTNN_LINKPGCN1  = 0x4604;
  214.     static const uint16 CMD_DVD_SET_STREAM             = 0x5100;
  215.     static const uint16 CMD_DVD_SET_GPRMMD             = 0x5300;
  216.     static const uint16 CMD_DVD_SET_HL_BTNN1           = 0x5600;
  217.     static const uint16 CMD_DVD_SET_HL_BTNN_LINKPGCN2  = 0x5604;
  218.     static const uint16 CMD_DVD_SET_HL_BTNN_LINKCN     = 0x5607;
  219.     // Operations
  220.     static const uint16 CMD_DVD_MOV_SPREG_PREG         = 0x6100;
  221.     static const uint16 CMD_DVD_GPREG_MOV_VALUE        = 0x7100;
  222.     static const uint16 CMD_DVD_SUB_GPREG              = 0x7400;
  223.     static const uint16 CMD_DVD_MULT_GPREG             = 0x7500;
  224.     static const uint16 CMD_DVD_GPREG_DIV_VALUE        = 0x7600;
  225.     static const uint16 CMD_DVD_GPREG_AND_VALUE        = 0x7900;
  226.  
  227.     // callbacks when browsing inside CodecPrivate
  228.     static bool MatchIsDomain     ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  229.     static bool MatchIsVMG        ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  230.     static bool MatchVTSNumber    ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  231.     static bool MatchVTSMNumber   ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  232.     static bool MatchTitleNumber  ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  233.     static bool MatchPgcType      ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  234.     static bool MatchPgcNumber    ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  235.     static bool MatchChapterNumber( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  236.     static bool MatchCellNumber   ( const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size );
  237. };
  238. #include "demux.hpp"
  239. class dvd_chapter_codec_c : public chapter_codec_cmds_c
  240. {
  241. public:
  242.     dvd_chapter_codec_c( demux_sys_t & sys )
  243.     :chapter_codec_cmds_c( sys, 1 )
  244.     {}
  245.     bool Enter();
  246.     bool Leave();
  247.     std::string GetCodecName( bool f_for_title = false ) const;
  248.     int16 GetTitleNumber();
  249. };
  250. class matroska_script_interpretor_c
  251. {
  252. public:
  253.     matroska_script_interpretor_c( demux_sys_t & demuxer )
  254.     :sys( demuxer )
  255.     {}
  256.     bool Interpret( const binary * p_command, size_t i_size );
  257.  
  258.     // DVD command IDs
  259.     static const std::string CMD_MS_GOTO_AND_PLAY;
  260.  
  261. protected:
  262.     demux_sys_t  & sys;
  263. };
  264. class matroska_script_codec_c : public chapter_codec_cmds_c
  265. {
  266. public:
  267.     matroska_script_codec_c( demux_sys_t & sys )
  268.     :chapter_codec_cmds_c( sys, 0 )
  269.     ,interpretor( sys )
  270.     {}
  271.     bool Enter();
  272.     bool Leave();
  273. protected:
  274.     matroska_script_interpretor_c interpretor;
  275. };
  276. #endif