MatroskaParser.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:12k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 2004-2005 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: MatroskaParser.h,v 1.15 2005/06/07 17:11:31 mike Exp $
  29.  * 
  30.  */
  31. #ifndef MATROSKA_PARSER_H
  32. #define MATROSKA_PARSER_H
  33. /* Random notes:
  34.  *
  35.  * The parser does not process frame data in any way and does not read it into
  36.  * the queue. The app should read it via mkv_ReadData if it is interested.
  37.  *
  38.  * The code here is 64-bit clean and was tested on FreeBSD/sparc 64-bit big endian
  39.  * system
  40.  */
  41. #ifdef MPDLLBUILD
  42. #define X __declspec(dllexport)
  43. #else
  44. #ifdef MPDLL
  45. #define X __declspec(dllimport)
  46. #pragma comment(lib,"MatroskaParser")
  47. #else
  48. #define X
  49. #endif
  50. #endif
  51. #define MATROSKA_COMPRESSION_SUPPORT
  52. #define MATROSKA_INTEGER_ONLY
  53. #ifdef __cplusplus
  54. extern "C" {
  55. #endif
  56. /* 64-bit integers */
  57. #ifdef _MSC_VER //Picard
  58. typedef signed __int64     longlong;
  59. typedef unsigned __int64    ulonglong;
  60. #else
  61. typedef signed long long    longlong;
  62. typedef unsigned long long  ulonglong;
  63. #endif
  64. /* MKFLOATing point */
  65. #ifdef MATROSKA_INTEGER_ONLY
  66. typedef struct {
  67.   longlong v;
  68. } MKFLOAT;
  69. #else
  70. typedef double MKFLOAT;
  71. #endif
  72. /* generic I/O */
  73. struct InputStream {
  74.   /* read bytes from stream */
  75.   int       (*read)(struct InputStream *cc,ulonglong pos,void *buffer,int count);
  76.   /* scan for a four byte signature, bytes must be nonzero */
  77.   longlong    (*scan)(struct InputStream *cc,ulonglong start,unsigned signature);
  78.   /* get cache size, this is used to cap readahead */
  79.   unsigned    (*getsize)(struct InputStream *cc);
  80.   /* fetch last error message */
  81.   const char *(*geterror)(struct InputStream *cc);
  82.   /* memory allocation */
  83.   void       *(*memalloc)(struct InputStream *cc,size_t size);
  84.   void       *(*memrealloc)(struct InputStream *cc,void *mem,size_t newsize);
  85.   void       (*memfree)(struct InputStream *cc,void *mem);
  86.   // zero return causes parser to abort open
  87.   int       (*progress)(struct InputStream *cc,ulonglong cur,ulonglong max);
  88.   //Picard
  89.   int       (*ioreadch)(struct InputStream *inf);
  90.   int       (*ioread)(struct InputStream *inf,void *buffer,int count);
  91.   void       (*ioseek)(struct InputStream *inf,longlong where,int how);
  92.   longlong    (*iotell)(struct InputStream *inf);
  93.   void*       (*makeref)(struct InputStream *inf,int count);
  94.   void       (*releaseref)(struct InputStream *inf,void* ref);
  95. };
  96. typedef struct InputStream InputStream;
  97. /* matroska file */
  98. struct MatroskaFile; /* opaque */
  99. typedef struct MatroskaFile MatroskaFile;
  100. #define COMP_ZLIB   0
  101. #define TT_VIDEO    1
  102. #define TT_AUDIO    2
  103. #define TT_SUB     17
  104. struct TrackInfo {
  105.   unsigned char   Number;
  106.   unsigned char   Type;
  107.   unsigned char   TrackOverlay;
  108.   ulonglong   UID;
  109.   ulonglong   MinCache;
  110.   ulonglong   MaxCache;
  111.   ulonglong   DefaultDuration;
  112.   MKFLOAT   TimecodeScale;
  113.   void   *CodecPrivate;
  114.   unsigned   CodecPrivateSize;
  115.   unsigned   CompMethod;
  116.   unsigned   MaxBlockAdditionID;
  117.   struct {
  118.     unsigned int  Enabled:1;
  119.     unsigned int  Default:1;
  120.     unsigned int  Lacing:1;
  121.     unsigned int  DecodeAll:1;
  122.     unsigned int  CompEnabled:1;
  123.   };
  124.   union {
  125.     struct {
  126.       unsigned char   StereoMode;
  127.       unsigned char   DisplayUnit;
  128.       unsigned char   AspectRatioType;
  129.       unsigned int    PixelWidth;
  130.       unsigned int    PixelHeight;
  131.       unsigned int    DisplayWidth;
  132.       unsigned int    DisplayHeight;
  133.       unsigned int    CropL, CropT, CropR, CropB;
  134.       unsigned int    ColourSpace;
  135.       MKFLOAT       GammaValue;
  136.       struct {
  137. unsigned int  Interlaced:1;
  138.       };
  139.     } Video;
  140.     struct {
  141.       MKFLOAT       SamplingFreq;
  142.       MKFLOAT       OutputSamplingFreq;
  143.       unsigned char   Channels;
  144.       unsigned char   BitDepth;
  145.     } Audio;
  146.   };
  147.   /* various strings */
  148.   char *Name;
  149.   char *Language;
  150.   char *CodecID;
  151. };
  152. typedef struct TrackInfo  TrackInfo;
  153. struct SegmentInfo {
  154.   char UID[16];
  155.   char PrevUID[16];
  156.   char NextUID[16];
  157.   char *Filename;
  158.   char *PrevFilename;
  159.   char *NextFilename;
  160.   char *Title;
  161.   char *MuxingApp;
  162.   char *WritingApp;
  163.   ulonglong TimecodeScale;
  164.   ulonglong Duration;
  165.   ulonglong DateUTC;
  166. };
  167. typedef struct SegmentInfo SegmentInfo;
  168. struct Attachment {
  169.   ulonglong Position;
  170.   ulonglong Length;
  171.   ulonglong UID;
  172.   char *Name;
  173.   char *Description;
  174.   char *MimeType;
  175. };
  176. typedef struct Attachment Attachment;
  177. struct ChapterDisplay {
  178.   char *String;
  179.   char *Language;
  180.   char *Country;
  181. };
  182. struct ChapterCommand {
  183.   unsigned Time;
  184.   unsigned CommandLength;
  185.   void *Command;
  186. };
  187. struct ChapterProcess {
  188.   unsigned CodecID;
  189.   unsigned CodecPrivateLength;
  190.   void *CodecPrivate;
  191.   unsigned nCommands,nCommandsSize;
  192.   struct ChapterCommand *Commands;
  193. };
  194. struct Chapter {
  195.   ulonglong UID;
  196.   ulonglong Start;
  197.   ulonglong End;
  198.   unsigned nTracks,nTracksSize;
  199.   ulonglong *Tracks;
  200.   unsigned nDisplay,nDisplaySize;
  201.   struct ChapterDisplay *Display;
  202.   unsigned nChildren,nChildrenSize;
  203.   struct Chapter *Children;
  204.   unsigned nProcess,nProcessSize;
  205.   struct ChapterProcess *Process;
  206.   char SegmentUID[16];
  207.   struct {
  208.     unsigned int Hidden:1;
  209.     unsigned int Enabled:1;
  210.     // Editions
  211.     unsigned int Default:1;
  212.     unsigned int Ordered:1;
  213.   };
  214. };
  215. typedef struct Chapter Chapter;
  216. #define TARGET_TRACK   0
  217. #define TARGET_CHAPTER   1
  218. #define TARGET_ATTACHMENT 2
  219. #define TARGET_EDITION   3
  220. struct Target {
  221.   ulonglong     UID;
  222.   unsigned     Type;
  223. };
  224. struct SimpleTag {
  225.   char     *Name;
  226.   char     *Value;
  227.   char     *Language;
  228.   unsigned     Default:1;
  229. };
  230. struct Tag {
  231.   unsigned     nTargets,nTargetsSize;
  232.   struct Target     *Targets;
  233.   unsigned     nSimpleTags,nSimpleTagsSize;
  234.   struct SimpleTag  *SimpleTags;
  235. };
  236. typedef struct Tag  Tag;
  237. /* Open a matroska file
  238.  * io pointer is recorded inside MatroskaFile
  239.  */
  240. X MatroskaFile  *mkv_Open(/* in */ InputStream *io,
  241. /* out */ char *err_msg,
  242. /* in */  unsigned msgsize);
  243. #define MKVF_AVOID_SEEKS    1 /* use sequential reading only */
  244. X MatroskaFile  *mkv_OpenEx(/* in */  InputStream *io,
  245.   /* in */  ulonglong base,
  246.   /* in */  unsigned flags,
  247.   /* out */ char *err_msg,
  248.   /* in */  unsigned msgsize);
  249. /* Close and deallocate mf
  250.  * NULL pointer is ok and is simply ignored
  251.  */
  252. X void mkv_Close(/* in */ MatroskaFile *mf);
  253. /* Fetch the error message of the last failed operation */
  254. X const char    *mkv_GetLastError(/* in */ MatroskaFile *mf);
  255. /* Get file information */
  256. X SegmentInfo   *mkv_GetFileInfo(/* in */ MatroskaFile *mf);
  257. /* Get track information */
  258. X unsigned int  mkv_GetNumTracks(/* in */ MatroskaFile *mf);
  259. X TrackInfo     *mkv_GetTrackInfo(/* in */ MatroskaFile *mf,/* in */ unsigned track);
  260. /* chapters, tags and attachments */
  261. X void       mkv_GetAttachments(/* in */   MatroskaFile *mf,
  262.  /* out */  Attachment **at,
  263.  /* out */  unsigned *count);
  264. X void       mkv_GetChapters(/* in */ MatroskaFile *mf,
  265.       /* out */ Chapter **ch,
  266.       /* out */ unsigned *count);
  267. X void       mkv_GetTags(/* in */  MatroskaFile *mf,
  268.   /* out */ Tag **tag,
  269.   /* out */ unsigned *count);
  270. X ulonglong   mkv_GetSegmentTop(MatroskaFile *mf);
  271. /* Seek to specified timecode,
  272.  * if timecode is past end of file,
  273.  * all tracks are set to return EOF
  274.  * on next read
  275.  */
  276. #define MKVF_SEEK_TO_PREV_KEYFRAME  1
  277. X void       mkv_Seek(/* in */ MatroskaFile *mf,
  278.        /* in */ ulonglong timecode /* in ns */,
  279.        /* in */ unsigned flags);
  280. X void       mkv_SkipToKeyframe(MatroskaFile *mf);
  281. X ulonglong   mkv_GetLowestQTimecode(MatroskaFile *mf);
  282. X int       mkv_TruncFloat(MKFLOAT f);
  283. /*************************************************************************
  284.  * reading data, pull model
  285.  */
  286. /* frame flags */
  287. #define FRAME_KF       0x00000001
  288. #define FRAME_UNKNOWN_START   0x00000002
  289. #define FRAME_UNKNOWN_END     0x00000004
  290. #define FRAME_GAP       0x00000008
  291. #define FRAME_STREAM_MASK     0xff000000
  292. #define FRAME_STREAM_SHIFT    24
  293. /* This sets the masking flags for the parser,
  294.  *  masked tracks [with 1s in their bit positions]
  295.  *  will be ignored when reading file data.
  296.  * This call discards all parsed and queued frames
  297.  */
  298. X void       mkv_SetTrackMask(/* in */ MatroskaFile *mf,/* in */ unsigned int mask);
  299. /* Read one frame from the queue.
  300.  * mask specifies what tracks to ignore.
  301.  * Returns -1 if there are no more frames in the specified
  302.  * set of tracks, 0 on success
  303.  */
  304. X int       mkv_ReadFrame(/* in */  MatroskaFile *mf,
  305.     /* in */  unsigned int mask,
  306.     /* out */ unsigned int *track,
  307.     /* out */ ulonglong *StartTime /* in ns */,
  308.     /* out */ ulonglong *EndTime /* in ns */,
  309.     /* out */ ulonglong *FilePos /* in bytes from start of file */,
  310.     /* out */ unsigned int *FrameSize /* in bytes */,
  311. /* out */ void** FrameRef, //Picard
  312.     /* out */ unsigned int *FrameFlags);
  313. /* Read raw frame data, invokes underlying io methods,
  314.  * but keeps track of the file pointer for internal buffering.
  315.  * Returns the -1 if error occurred, or 0 on success
  316.  */
  317. X int       mkv_ReadData(/* in */   MatroskaFile *mf,
  318.    /* in */   ulonglong FilePos,
  319.    /* out */  void *Buffer,
  320.    /* in */   unsigned int Count);
  321. #ifdef MATROSKA_COMPRESSION_SUPPORT
  322. /* Compressed streams support */
  323. struct CompressedStream;
  324. typedef struct CompressedStream CompressedStream;
  325. X CompressedStream  *cs_Create(/* in */ MatroskaFile *mf,
  326.      /* in */ unsigned tracknum,
  327.      /* out */ char *errormsg,
  328.      /* in */ unsigned msgsize);
  329. X void   cs_Destroy(/* in */ CompressedStream *cs);
  330. /* advance to the next frame in matroska stream, you need to pass values returned
  331.  * by mkv_ReadFrame */
  332. X void   cs_NextFrame(/* in */ CompressedStream *cs,
  333.        /* in */ ulonglong pos,
  334.        /* in */ unsigned size);
  335. /* read and decode more data from current frame, return number of bytes decoded,
  336.  * 0 on end of frame, or -1 on error */
  337. X int   cs_ReadData(CompressedStream *cs,char *buffer,unsigned bufsize);
  338. /* return error message for the last error */
  339. X const char   *cs_GetLastError(CompressedStream *cs);
  340. #endif
  341. #ifdef __cplusplus
  342. }
  343. #endif
  344. #undef X
  345. #endif