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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * mkv.cpp : matroska demuxer
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 the VideoLAN team
  5.  * $Id: e96a3a86a90daeb636096447020046ef9341be4c $
  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 _DEMUX_SYS_H
  25. #define _DEMUX_SYS_H
  26. #include "mkv.hpp"
  27. #include "chapter_command.hpp"
  28. #include "virtual_segment.hpp"
  29. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. #undef ATTRIBUTE_PACKED
  31. #undef PRAGMA_PACK_BEGIN
  32. #undef PRAGMA_PACK_END
  33. #if defined(__GNUC__)
  34. #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
  35. #define ATTRIBUTE_PACKED __attribute__ ((packed))
  36. #define PRAGMA_PACK 0
  37. #endif
  38. #endif
  39. #if !defined(ATTRIBUTE_PACKED)
  40. #define ATTRIBUTE_PACKED
  41. #define PRAGMA_PACK 1
  42. #endif
  43. #if PRAGMA_PACK
  44. #pragma pack(1)
  45. #endif
  46. /*************************************
  47. *  taken from libdvdnav / libdvdread
  48. **************************************/
  49. /**
  50.  * DVD Time Information.
  51.  */
  52. typedef struct {
  53.   uint8_t hour;
  54.   uint8_t minute;
  55.   uint8_t second;
  56.   uint8_t frame_u; /* The two high bits are the frame rate. */
  57. } ATTRIBUTE_PACKED dvd_time_t;
  58. /**
  59.  * User Operations.
  60.  */
  61. typedef struct {
  62. #ifdef WORDS_BIGENDIAN
  63.   unsigned char zero                           : 7; /* 25-31 */
  64.   unsigned char video_pres_mode_change         : 1; /* 24 */
  65.  
  66.   unsigned char karaoke_audio_pres_mode_change : 1; /* 23 */
  67.   unsigned char angle_change                   : 1;
  68.   unsigned char subpic_stream_change           : 1;
  69.   unsigned char audio_stream_change            : 1;
  70.   unsigned char pause_on                       : 1;
  71.   unsigned char still_off                      : 1;
  72.   unsigned char button_select_or_activate      : 1;
  73.   unsigned char resume                         : 1; /* 16 */
  74.  
  75.   unsigned char chapter_menu_call              : 1; /* 15 */
  76.   unsigned char angle_menu_call                : 1;
  77.   unsigned char audio_menu_call                : 1;
  78.   unsigned char subpic_menu_call               : 1;
  79.   unsigned char root_menu_call                 : 1;
  80.   unsigned char title_menu_call                : 1;
  81.   unsigned char backward_scan                  : 1;
  82.   unsigned char forward_scan                   : 1; /* 8 */
  83.  
  84.   unsigned char next_pg_search                 : 1; /* 7 */
  85.   unsigned char prev_or_top_pg_search          : 1;
  86.   unsigned char time_or_chapter_search         : 1;
  87.   unsigned char go_up                          : 1;
  88.   unsigned char stop                           : 1;
  89.   unsigned char title_play                     : 1;
  90.   unsigned char chapter_search_or_play         : 1;
  91.   unsigned char title_or_time_play             : 1; /* 0 */
  92. #else
  93.   unsigned char video_pres_mode_change         : 1; /* 24 */
  94.   unsigned char zero                           : 7; /* 25-31 */
  95.  
  96.   unsigned char resume                         : 1; /* 16 */
  97.   unsigned char button_select_or_activate      : 1;
  98.   unsigned char still_off                      : 1;
  99.   unsigned char pause_on                       : 1;
  100.   unsigned char audio_stream_change            : 1;
  101.   unsigned char subpic_stream_change           : 1;
  102.   unsigned char angle_change                   : 1;
  103.   unsigned char karaoke_audio_pres_mode_change : 1; /* 23 */
  104.  
  105.   unsigned char forward_scan                   : 1; /* 8 */
  106.   unsigned char backward_scan                  : 1;
  107.   unsigned char title_menu_call                : 1;
  108.   unsigned char root_menu_call                 : 1;
  109.   unsigned char subpic_menu_call               : 1;
  110.   unsigned char audio_menu_call                : 1;
  111.   unsigned char angle_menu_call                : 1;
  112.   unsigned char chapter_menu_call              : 1; /* 15 */
  113.  
  114.   unsigned char title_or_time_play             : 1; /* 0 */
  115.   unsigned char chapter_search_or_play         : 1;
  116.   unsigned char title_play                     : 1;
  117.   unsigned char stop                           : 1;
  118.   unsigned char go_up                          : 1;
  119.   unsigned char time_or_chapter_search         : 1;
  120.   unsigned char prev_or_top_pg_search          : 1;
  121.   unsigned char next_pg_search                 : 1; /* 7 */
  122. #endif
  123. } ATTRIBUTE_PACKED user_ops_t;
  124. /**
  125.  * Type to store per-command data.
  126.  */
  127. typedef struct {
  128.   uint8_t bytes[8];
  129. } ATTRIBUTE_PACKED vm_cmd_t;
  130. #define COMMAND_DATA_SIZE 8
  131. /**
  132.  * PCI General Information
  133.  */
  134. typedef struct {
  135.   uint32_t nv_pck_lbn;      /**< sector address of this nav pack */
  136.   uint16_t vobu_cat;        /**< 'category' of vobu */
  137.   uint16_t zero1;           /**< reserved */
  138.   user_ops_t vobu_uop_ctl;  /**< UOP of vobu */
  139.   uint32_t vobu_s_ptm;      /**< start presentation time of vobu */
  140.   uint32_t vobu_e_ptm;      /**< end presentation time of vobu */
  141.   uint32_t vobu_se_e_ptm;   /**< end ptm of sequence end in vobu */
  142.   dvd_time_t e_eltm;        /**< Cell elapsed time */
  143.   char vobu_isrc[32];
  144. } ATTRIBUTE_PACKED pci_gi_t;
  145. /**
  146.  * Non Seamless Angle Information
  147.  */
  148. typedef struct {
  149.   uint32_t nsml_agl_dsta[9];  /**< address of destination vobu in AGL_C#n */
  150. } ATTRIBUTE_PACKED nsml_agli_t;
  151. /**
  152.  * Highlight General Information
  153.  *
  154.  * For btngrX_dsp_ty the bits have the following meaning:
  155.  * 000b: normal 4/3 only buttons
  156.  * XX1b: wide (16/9) buttons
  157.  * X1Xb: letterbox buttons
  158.  * 1XXb: pan&scan buttons
  159.  */
  160. typedef struct {
  161.   uint16_t hli_ss; /**< status, only low 2 bits 0: no buttons, 1: different 2: equal 3: eual except for button cmds */
  162.   uint32_t hli_s_ptm;              /**< start ptm of hli */
  163.   uint32_t hli_e_ptm;              /**< end ptm of hli */
  164.   uint32_t btn_se_e_ptm;           /**< end ptm of button select */
  165. #ifdef WORDS_BIGENDIAN
  166.   unsigned char zero1 : 2;          /**< reserved */
  167.   unsigned char btngr_ns : 2;       /**< number of button groups 1, 2 or 3 with 36/18/12 buttons */
  168.   unsigned char zero2 : 1;          /**< reserved */
  169.   unsigned char btngr1_dsp_ty : 3;  /**< display type of subpic stream for button group 1 */
  170.   unsigned char zero3 : 1;          /**< reserved */
  171.   unsigned char btngr2_dsp_ty : 3;  /**< display type of subpic stream for button group 2 */
  172.   unsigned char zero4 : 1;          /**< reserved */
  173.   unsigned char btngr3_dsp_ty : 3;  /**< display type of subpic stream for button group 3 */
  174. #else
  175.   unsigned char btngr1_dsp_ty : 3;
  176.   unsigned char zero2 : 1;
  177.   unsigned char btngr_ns : 2;
  178.   unsigned char zero1 : 2;
  179.   unsigned char btngr3_dsp_ty : 3;
  180.   unsigned char zero4 : 1;
  181.   unsigned char btngr2_dsp_ty : 3;
  182.   unsigned char zero3 : 1;
  183. #endif
  184.   uint8_t btn_ofn;     /**< button offset number range 0-255 */
  185.   uint8_t btn_ns;      /**< number of valid buttons  <= 36/18/12 (low 6 bits) */
  186.   uint8_t nsl_btn_ns;  /**< number of buttons selectable by U_BTNNi (low 6 bits)   nsl_btn_ns <= btn_ns */
  187.   uint8_t zero5;       /**< reserved */
  188.   uint8_t fosl_btnn;   /**< forcedly selected button  (low 6 bits) */
  189.   uint8_t foac_btnn;   /**< forcedly activated button (low 6 bits) */
  190. } ATTRIBUTE_PACKED hl_gi_t;
  191. /**
  192.  * Button Color Information Table
  193.  * Each entry beeing a 32bit word that contains the color indexs and alpha
  194.  * values to use.  They are all represented by 4 bit number and stored
  195.  * like this [Ci3, Ci2, Ci1, Ci0, A3, A2, A1, A0].   The actual palette
  196.  * that the indexes reference is in the PGC.
  197.  * todo split the uint32_t into a struct
  198.  */
  199. typedef struct {
  200.   uint32_t btn_coli[3][2];  /**< [button color number-1][select:0/action:1] */
  201. } ATTRIBUTE_PACKED btn_colit_t;
  202. /**
  203.  * Button Information
  204.  *
  205.  * NOTE: I've had to change the structure from the disk layout to get
  206.  * the packing to work with Sun's Forte C compiler.
  207.  * The 4 and 7 bytes are 'rotated' was: ABC DEF GHIJ  is: ABCG DEFH IJ
  208.  */
  209. typedef struct {
  210. #ifdef WORDS_BIGENDIAN
  211.   uint32        btn_coln         : 2;  /**< button color number */
  212.   uint32        x_start          : 10; /**< x start offset within the overlay */
  213.   uint32        zero1            : 2;  /**< reserved */
  214.   uint32        x_end            : 10; /**< x end offset within the overlay */
  215.   uint32        zero3            : 2;  /**< reserved */
  216.   uint32        up               : 6;  /**< button index when pressing up */
  217.   uint32        auto_action_mode : 2;  /**< 0: no, 1: activated if selected */
  218.   uint32        y_start          : 10; /**< y start offset within the overlay */
  219.   uint32        zero2            : 2;  /**< reserved */
  220.   uint32        y_end            : 10; /**< y end offset within the overlay */
  221.   uint32        zero4            : 2;  /**< reserved */
  222.   uint32        down             : 6;  /**< button index when pressing down */
  223.   unsigned char zero5            : 2;  /**< reserved */
  224.   unsigned char left             : 6;  /**< button index when pressing left */
  225.   unsigned char zero6            : 2;  /**< reserved */
  226.   unsigned char right            : 6;  /**< button index when pressing right */
  227. #else
  228.   uint32        x_end            : 10;
  229.   uint32        zero1            : 2;
  230.   uint32        x_start          : 10;
  231.   uint32        btn_coln         : 2;
  232.   uint32        up               : 6;
  233.   uint32        zero3            : 2;
  234.   uint32        y_end            : 10;
  235.   uint32        zero2            : 2;
  236.   uint32        y_start          : 10;
  237.   uint32        auto_action_mode : 2;
  238.   uint32        down             : 6;
  239.   uint32        zero4            : 2;
  240.   unsigned char left             : 6;
  241.   unsigned char zero5            : 2;
  242.   unsigned char right            : 6;
  243.   unsigned char zero6            : 2;
  244. #endif
  245.   vm_cmd_t cmd;
  246. } ATTRIBUTE_PACKED btni_t;
  247. /**
  248.  * Highlight Information
  249.  */
  250. typedef struct {
  251.   hl_gi_t     hl_gi;
  252.   btn_colit_t btn_colit;
  253.   btni_t      btnit[36];
  254. } ATTRIBUTE_PACKED hli_t;
  255. /**
  256.  * PCI packet
  257.  */
  258. typedef struct {
  259.   pci_gi_t    pci_gi;
  260.   nsml_agli_t nsml_agli;
  261.   hli_t       hli;
  262.   uint8_t     zero1[189];
  263. } ATTRIBUTE_PACKED pci_t;
  264. #if PRAGMA_PACK
  265. #pragma pack()
  266. #endif
  267. ////////////////////////////////////////
  268. class virtual_segment_c;
  269. class chapter_item_c;
  270. typedef struct
  271. {
  272.     VLC_COMMON_MEMBERS
  273.     demux_t        *p_demux;
  274.     vlc_mutex_t     lock;
  275.     bool            b_moved;
  276.     bool            b_clicked;
  277.     int             i_key_action;
  278. } event_thread_t;
  279. class demux_sys_t
  280. {
  281. public:
  282.     demux_sys_t( demux_t & demux )
  283.         :demuxer(demux)
  284.         ,i_pts(0)
  285.         ,i_start_pts(0)
  286.         ,i_chapter_time(0)
  287.         ,meta(NULL)
  288.         ,i_current_title(0)
  289.         ,p_current_segment(NULL)
  290.         ,dvd_interpretor( *this )
  291.         ,f_duration(-1.0)
  292.         ,b_ui_hooked(false)
  293.         ,p_input(NULL)
  294.         ,b_pci_packet_set(false)
  295.         ,p_ev(NULL)
  296.     {
  297.         vlc_mutex_init( &lock_demuxer );
  298.     }
  299.     virtual ~demux_sys_t();
  300.     /* current data */
  301.     demux_t                 & demuxer;
  302.     mtime_t                 i_pts;
  303.     mtime_t                 i_start_pts;
  304.     mtime_t                 i_chapter_time;
  305.     vlc_meta_t              *meta;
  306.     std::vector<input_title_t*>      titles; // matroska editions
  307.     size_t                           i_current_title;
  308.     std::vector<matroska_stream_c*>  streams;
  309.     std::vector<attachment_c*>       stored_attachments;
  310.     std::vector<matroska_segment_c*> opened_segments;
  311.     std::vector<virtual_segment_c*>  used_segments;
  312.     virtual_segment_c                *p_current_segment;
  313.     dvd_command_interpretor_c        dvd_interpretor;
  314.     /* duration of the stream */
  315.     float                   f_duration;
  316.     matroska_segment_c *FindSegment( const EbmlBinary & uid ) const;
  317.     chapter_item_c *BrowseCodecPrivate( unsigned int codec_id,
  318.                                         bool (*match)(const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size ),
  319.                                         const void *p_cookie,
  320.                                         size_t i_cookie_size,
  321.                                         virtual_segment_c * & p_segment_found );
  322.     chapter_item_c *FindChapter( int64_t i_find_uid, virtual_segment_c * & p_segment_found );
  323.     void PreloadFamily( const matroska_segment_c & of_segment );
  324.     void PreloadLinked( matroska_segment_c *p_segment );
  325.     bool PreparePlayback( virtual_segment_c *p_new_segment );
  326.     matroska_stream_c *AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial = false );
  327.     void JumpTo( virtual_segment_c & p_segment, chapter_item_c * p_chapter );
  328.     void StartUiThread();
  329.     void StopUiThread();
  330.     bool b_ui_hooked;
  331.     void SwapButtons();
  332.     /* for spu variables */
  333.     input_thread_t *p_input;
  334.     pci_t          pci_packet;
  335.     bool           b_pci_packet_set;
  336.     uint8_t        palette[4][4];
  337.     vlc_mutex_t    lock_demuxer;
  338.     /* event */
  339.     event_thread_t *p_ev;
  340.     static void * EventThread( vlc_object_t *p_this );
  341.     static int EventMouse( vlc_object_t *p_this, char const *psz_var,
  342.                        vlc_value_t oldval, vlc_value_t newval, void *p_data );
  343.     static int EventKey( vlc_object_t *p_this, char const *psz_var,
  344.                      vlc_value_t oldval, vlc_value_t newval, void *p_data );
  345. protected:
  346.     virtual_segment_c *VirtualFromSegments( matroska_segment_c *p_segment ) const;
  347.     bool IsUsedSegment( matroska_segment_c &p_segment ) const;
  348. };
  349. #endif