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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * mkv.cpp : matroska demuxer
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 the VideoLAN team
  5.  * $Id: c01e5fff96066343d37a609bbd70b347a860905f $
  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 _MKV_H_
  25. #define _MKV_H_
  26. /*****************************************************************************
  27.  * Preamble
  28.  *****************************************************************************/
  29. /* config.h may include inttypes.h, so make sure we define that option
  30.  * early enough. */
  31. #define __STDC_FORMAT_MACROS 1
  32. #define __STDC_CONSTANT_MACROS 1
  33. #ifdef HAVE_CONFIG_H
  34. # include "config.h"
  35. #endif
  36. #include <inttypes.h>
  37. #include <vlc_common.h>
  38. #include <vlc_plugin.h>
  39. #ifdef HAVE_TIME_H
  40. #   include <time.h>                                               /* time() */
  41. #endif
  42. #include <vlc_codecs.h>               /* BITMAPINFOHEADER, WAVEFORMATEX */
  43. #include <vlc_iso_lang.h>
  44. #include "vlc_meta.h"
  45. #include <vlc_charset.h>
  46. #include <vlc_input.h>
  47. #include <vlc_demux.h>
  48. #include <iostream>
  49. #include <cassert>
  50. #include <typeinfo>
  51. #include <string>
  52. #include <vector>
  53. #include <algorithm>
  54. #ifdef HAVE_DIRENT_H
  55. #   include <dirent.h>
  56. #endif
  57. /* libebml and matroska */
  58. #include "ebml/EbmlHead.h"
  59. #include "ebml/EbmlSubHead.h"
  60. #include "ebml/EbmlStream.h"
  61. #include "ebml/EbmlContexts.h"
  62. #include "ebml/EbmlVoid.h"
  63. #include "ebml/EbmlVersion.h"
  64. #include "ebml/StdIOCallback.h"
  65. #include "matroska/KaxAttachments.h"
  66. #include "matroska/KaxAttached.h"
  67. #include "matroska/KaxBlock.h"
  68. #include "matroska/KaxBlockData.h"
  69. #include "matroska/KaxChapters.h"
  70. #include "matroska/KaxCluster.h"
  71. #include "matroska/KaxClusterData.h"
  72. #include "matroska/KaxContexts.h"
  73. #include "matroska/KaxCues.h"
  74. #include "matroska/KaxCuesData.h"
  75. #include "matroska/KaxInfo.h"
  76. #include "matroska/KaxInfoData.h"
  77. #include "matroska/KaxSeekHead.h"
  78. #include "matroska/KaxSegment.h"
  79. #include "matroska/KaxTag.h"
  80. #include "matroska/KaxTags.h"
  81. #include "matroska/KaxTagMulti.h"
  82. #include "matroska/KaxTracks.h"
  83. #include "matroska/KaxTrackAudio.h"
  84. #include "matroska/KaxTrackVideo.h"
  85. #include "matroska/KaxTrackEntryData.h"
  86. #include "matroska/KaxContentEncoding.h"
  87. #include "matroska/KaxVersion.h"
  88. #include "ebml/StdIOCallback.h"
  89. #include "vlc_keys.h"
  90. extern "C" {
  91.    #include "../mp4/libmp4.h"
  92. }
  93. #ifdef HAVE_ZLIB_H
  94. #   include <zlib.h>
  95. #endif
  96. #define MATROSKA_COMPRESSION_NONE  -1
  97. #define MATROSKA_COMPRESSION_ZLIB   0
  98. #define MATROSKA_COMPRESSION_BLIB   1
  99. #define MATROSKA_COMPRESSION_LZOX   2
  100. #define MATROSKA_COMPRESSION_HEADER 3
  101. #define MKVD_TIMECODESCALE 1000000
  102. /**
  103.  * What's between a directory and a filename?
  104.  */
  105. #if defined( WIN32 )
  106.     #define DIRECTORY_SEPARATOR '\'
  107. #else
  108.     #define DIRECTORY_SEPARATOR '/'
  109. #endif
  110. #define MKV_IS_ID( el, C ) ( EbmlId( (*el) ) == C::ClassInfos.GlobalId )
  111. using namespace LIBMATROSKA_NAMESPACE;
  112. using namespace std;
  113. class attachment_c
  114. {
  115. public:
  116.     attachment_c()
  117.         :p_data(NULL)
  118.         ,i_size(0)
  119.     {}
  120.     virtual ~attachment_c()
  121.     {
  122.         free( p_data );
  123.     }
  124.     std::string    psz_file_name;
  125.     std::string    psz_mime_type;
  126.     void          *p_data;
  127.     int            i_size;
  128. };
  129. class matroska_segment_c;
  130. class matroska_stream_c
  131. {
  132. public:
  133.     matroska_stream_c( demux_sys_t & demuxer )
  134.         :p_in(NULL)
  135.         ,p_es(NULL)
  136.         ,sys(demuxer)
  137.     {}
  138.     virtual ~matroska_stream_c()
  139.     {
  140.         delete p_in;
  141.         delete p_es;
  142.     }
  143.     IOCallback         *p_in;
  144.     EbmlStream         *p_es;
  145.     std::vector<matroska_segment_c*> segments;
  146.     demux_sys_t                      & sys;
  147. };
  148. /*****************************************************************************
  149.  * definitions of structures and functions used by this plugins
  150.  *****************************************************************************/
  151. typedef struct
  152. {
  153. //    ~mkv_track_t();
  154.     bool         b_default;
  155.     bool         b_enabled;
  156.     unsigned int i_number;
  157.     int          i_extra_data;
  158.     uint8_t      *p_extra_data;
  159.     char         *psz_codec;
  160.     bool         b_dts_only;
  161.     uint64_t     i_default_duration;
  162.     float        f_timecodescale;
  163.     mtime_t      i_last_dts;
  164.     /* video */
  165.     es_format_t fmt;
  166.     float       f_fps;
  167.     es_out_id_t *p_es;
  168.     /* audio */
  169.     unsigned int i_original_rate;
  170.     bool            b_inited;
  171.     /* data to be send first */
  172.     int             i_data_init;
  173.     uint8_t         *p_data_init;
  174.     /* hack : it's for seek */
  175.     bool            b_search_keyframe;
  176.     bool            b_silent;
  177.     /* informative */
  178.     const char   *psz_codec_name;
  179.     const char   *psz_codec_settings;
  180.     const char   *psz_codec_info_url;
  181.     const char   *psz_codec_download_url;
  182.     /* encryption/compression */
  183.     int                    i_compression_type;
  184.     KaxContentCompSettings *p_compression_data;
  185. } mkv_track_t;
  186. typedef struct
  187. {
  188.     int     i_track;
  189.     int     i_block_number;
  190.     int64_t i_position;
  191.     int64_t i_time;
  192.     bool       b_key;
  193. } mkv_index_t;
  194. #endif /* _MKV_HPP_ */