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

midi

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2002-2003 the xine project
  3.  *
  4.  * This file is part of xine, a free video player.
  5.  *
  6.  * xine is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * xine is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
  19.  *
  20.  * $Id: e4fd2d2e719067eb3e499af05fd6cbb84bbaf4e4 $
  21.  *
  22.  * some functions for real media file headers
  23.  * adopted from joschkas real tools
  24.  */
  25. #ifndef HAVE_RMFF_H
  26. #define HAVE_RMFF_H
  27. #define RMFF_HEADER_SIZE 0x12
  28. #define RMFF_FILEHEADER_SIZE 18
  29. #define RMFF_PROPHEADER_SIZE 50
  30. #define RMFF_MDPRHEADER_SIZE 46
  31. #define RMFF_CONTHEADER_SIZE 18
  32. #define RMFF_DATAHEADER_SIZE 18
  33. #define FOURCC_TAG( ch0, ch1, ch2, ch3 ) 
  34.         (((long)(unsigned char)(ch3)       ) | 
  35.         ( (long)(unsigned char)(ch2) << 8  ) | 
  36.         ( (long)(unsigned char)(ch1) << 16 ) | 
  37.         ( (long)(unsigned char)(ch0) << 24 ) )
  38. #define RMF_TAG   FOURCC_TAG('.', 'R', 'M', 'F')
  39. #define PROP_TAG  FOURCC_TAG('P', 'R', 'O', 'P')
  40. #define MDPR_TAG  FOURCC_TAG('M', 'D', 'P', 'R')
  41. #define CONT_TAG  FOURCC_TAG('C', 'O', 'N', 'T')
  42. #define DATA_TAG  FOURCC_TAG('D', 'A', 'T', 'A')
  43. #define INDX_TAG  FOURCC_TAG('I', 'N', 'D', 'X')
  44. #define PNA_TAG   FOURCC_TAG('P', 'N', 'A',  0 )
  45. #define MLTI_TAG  FOURCC_TAG('M', 'L', 'T', 'I')
  46. /* prop flags */
  47. #define PN_SAVE_ENABLED         0x01
  48. #define PN_PERFECT_PLAY_ENABLED 0x02
  49. #define PN_LIVE_BROADCAST       0x04
  50. /*
  51.  * rm header data structs
  52.  */
  53. typedef struct {
  54.   uint32_t object_id;
  55.   uint32_t size;
  56.   uint16_t object_version;
  57.   uint32_t file_version;
  58.   uint32_t num_headers;
  59. } rmff_fileheader_t;
  60. typedef struct {
  61.   uint32_t object_id;
  62.   uint32_t size;
  63.   uint16_t object_version;
  64.   uint32_t max_bit_rate;
  65.   uint32_t avg_bit_rate;
  66.   uint32_t max_packet_size;
  67.   uint32_t avg_packet_size;
  68.   uint32_t num_packets;
  69.   uint32_t duration;
  70.   uint32_t preroll;
  71.   uint32_t index_offset;
  72.   uint32_t data_offset;
  73.   uint16_t num_streams;
  74.   uint16_t flags;
  75. } rmff_prop_t;
  76. typedef struct {
  77.   uint32_t  object_id;
  78.   uint32_t  size;
  79.   uint16_t  object_version;
  80.   uint16_t  stream_number;
  81.   uint32_t  max_bit_rate;
  82.   uint32_t  avg_bit_rate;
  83.   uint32_t  max_packet_size;
  84.   uint32_t  avg_packet_size;
  85.   uint32_t  start_time;
  86.   uint32_t  preroll;
  87.   uint32_t  duration;
  88.   uint8_t   stream_name_size;
  89.   char      *stream_name;
  90.   uint8_t   mime_type_size;
  91.   char      *mime_type;
  92.   uint32_t  type_specific_len;
  93.   char      *type_specific_data;
  94.   int       mlti_data_size;
  95.   char      *mlti_data;
  96. } rmff_mdpr_t;
  97. typedef struct {
  98.   uint32_t  object_id;
  99.   uint32_t  size;
  100.   uint16_t  object_version;
  101.   uint16_t  title_len;
  102.   char      *title;
  103.   uint16_t  author_len;
  104.   char      *author;
  105.   uint16_t  copyright_len;
  106.   char      *copyright;
  107.   uint16_t  comment_len;
  108.   char      *comment;
  109. } rmff_cont_t;
  110. typedef struct {
  111.   uint32_t object_id;
  112.   uint32_t size;
  113.   uint16_t object_version;
  114.   uint32_t num_packets;
  115.   uint32_t next_data_header; /* rarely used */
  116. } rmff_data_t;
  117. typedef struct {
  118.   rmff_fileheader_t *fileheader;
  119.   rmff_prop_t *prop;
  120.   rmff_mdpr_t **streams;
  121.   rmff_cont_t *cont;
  122.   rmff_data_t *data;
  123. } rmff_header_t;
  124. typedef struct {
  125.   uint16_t object_version;
  126.   uint16_t length;
  127.   uint16_t stream_number;
  128.   uint32_t timestamp;
  129.   uint8_t reserved;
  130.   uint8_t flags;
  131. } rmff_pheader_t;
  132. /*
  133.  * constructors for header structs
  134.  */
  135. rmff_fileheader_t *rmff_new_fileheader(uint32_t num_headers);
  136. rmff_prop_t *rmff_new_prop (
  137.     uint32_t max_bit_rate,
  138.     uint32_t avg_bit_rate,
  139.     uint32_t max_packet_size,
  140.     uint32_t avg_packet_size,
  141.     uint32_t num_packets,
  142.     uint32_t duration,
  143.     uint32_t preroll,
  144.     uint32_t index_offset,
  145.     uint32_t data_offset,
  146.     uint16_t num_streams,
  147.     uint16_t flags );
  148. rmff_mdpr_t *rmff_new_mdpr(
  149.     uint16_t   stream_number,
  150.     uint32_t   max_bit_rate,
  151.     uint32_t   avg_bit_rate,
  152.     uint32_t   max_packet_size,
  153.     uint32_t   avg_packet_size,
  154.     uint32_t   start_time,
  155.     uint32_t   preroll,
  156.     uint32_t   duration,
  157.     const char *stream_name,
  158.     const char *mime_type,
  159.     uint32_t   type_specific_len,
  160.     const char *type_specific_data );
  161. rmff_cont_t *rmff_new_cont(
  162.     const char *title,
  163.     const char *author,
  164.     const char *copyright,
  165.     const char *comment);
  166. rmff_data_t *rmff_new_dataheader(
  167.     uint32_t num_packets, uint32_t next_data_header);
  168. /*
  169.  * reads header infos from data and returns a newly allocated header struct
  170.  */
  171. rmff_header_t *rmff_scan_header(const char *data);
  172. /*
  173.  * scans a data packet header. Notice, that this function does not allocate
  174.  * the header struct itself.
  175.  */
  176. void rmff_scan_pheader(rmff_pheader_t *h, char *data);
  177. /*
  178.  * reads header infos from stream and returns a newly allocated header struct
  179.  */
  180. rmff_header_t *rmff_scan_header_stream(int fd);
  181. /*
  182.  * prints header information in human readible form to stdout
  183.  */
  184. void rmff_print_header(rmff_header_t *h);
  185. /*
  186.  * does some checks and fixes header if possible
  187.  */
  188. void rmff_fix_header(rmff_header_t *h);
  189. /*
  190.  * returns the size of the header (incl. first data-header)
  191.  */
  192. int rmff_get_header_size(rmff_header_t *h);
  193.  
  194. /*
  195.  * dumps the header <h> to <buffer>. <max> is the size of <buffer>
  196.  */
  197. int rmff_dump_header(rmff_header_t *h, void *buffer, int max);
  198. /*
  199.  * dumps a packet header
  200.  */
  201. void rmff_dump_pheader(rmff_pheader_t *h, char *data);
  202. /*
  203.  * frees a header struct
  204.  */
  205. void rmff_free_header(rmff_header_t *h);
  206. #endif