libmpeg2.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:11k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
  3.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  4.  *
  5.  * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  6.  * See http://libmpeg2.sourceforge.net/ for updates.
  7.  *
  8.  * mpeg2dec is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * mpeg2dec is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  */
  22. #pragma once
  23. typedef signed char int8_t;
  24. typedef signed short int16_t;
  25. typedef signed int int32_t;
  26. typedef unsigned char uint8_t;
  27. typedef unsigned short uint16_t;
  28. typedef unsigned int uint32_t;
  29. #define MPEG2_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c))
  30. #define MPEG2_RELEASE MPEG2_VERSION (0, 3, 2) /* 0.3.2 */
  31. #define SEQ_FLAG_MPEG2 1
  32. #define SEQ_FLAG_CONSTRAINED_PARAMETERS 2
  33. #define SEQ_FLAG_PROGRESSIVE_SEQUENCE 4
  34. #define SEQ_FLAG_LOW_DELAY 8
  35. #define SEQ_FLAG_COLOUR_DESCRIPTION 16
  36. #define SEQ_MASK_VIDEO_FORMAT 0xe0
  37. #define SEQ_VIDEO_FORMAT_COMPONENT 0
  38. #define SEQ_VIDEO_FORMAT_PAL 0x20
  39. #define SEQ_VIDEO_FORMAT_NTSC 0x40
  40. #define SEQ_VIDEO_FORMAT_SECAM 0x60
  41. #define SEQ_VIDEO_FORMAT_MAC 0x80
  42. #define SEQ_VIDEO_FORMAT_UNSPECIFIED 0xa0
  43. typedef struct {
  44.     unsigned int width, height;
  45.     unsigned int chroma_width, chroma_height;
  46.     unsigned int byte_rate;
  47.     unsigned int vbv_buffer_size;
  48.     uint32_t flags;
  49.     unsigned int picture_width, picture_height;
  50.     unsigned int display_width, display_height;
  51.     unsigned int pixel_width, pixel_height;
  52.     unsigned int frame_period;
  53.     uint8_t profile_level_id;
  54.     uint8_t colour_primaries;
  55.     uint8_t transfer_characteristics;
  56.     uint8_t matrix_coefficients;
  57. void finalize();
  58. } mpeg2_sequence_t;
  59. #define GOP_FLAG_DROP_FRAME 1
  60. #define GOP_FLAG_BROKEN_LINK 2
  61. #define GOP_FLAG_CLOSED_GOP 4
  62. typedef struct {
  63.     uint8_t hours;
  64.     uint8_t minutes;
  65.     uint8_t seconds;
  66.     uint8_t pictures;
  67.     uint32_t flags;
  68. } mpeg2_gop_t;
  69. #define PIC_MASK_CODING_TYPE 7
  70. #define PIC_FLAG_CODING_TYPE_I 1
  71. #define PIC_FLAG_CODING_TYPE_P 2
  72. #define PIC_FLAG_CODING_TYPE_B 3
  73. #define PIC_FLAG_CODING_TYPE_D 4
  74. #define PIC_FLAG_TOP_FIELD_FIRST 8
  75. #define PIC_FLAG_PROGRESSIVE_FRAME 16
  76. #define PIC_FLAG_COMPOSITE_DISPLAY 32
  77. #define PIC_FLAG_SKIP 64
  78. #define PIC_FLAG_PTS 128
  79. #define PIC_FLAG_REPEAT_FIRST_FIELD 256
  80. #define PIC_MASK_COMPOSITE_DISPLAY 0xfffff000
  81. typedef struct {
  82.     unsigned int temporal_reference;
  83.     unsigned int nb_fields;
  84.     uint32_t pts;
  85.     uint32_t flags;
  86.     struct {
  87. int x, y;
  88.     } display_offset[3];
  89. __int64 rtStart, rtStop;
  90. bool fDiscontinuity, fDelivered;
  91. } mpeg2_picture_t;
  92. typedef struct {
  93.     uint8_t* buf[3];
  94.     void* id;
  95. } mpeg2_fbuf_t;
  96. typedef enum {
  97.     STATE_BUFFER = 0,
  98.     STATE_SEQUENCE = 1,
  99.     STATE_SEQUENCE_REPEATED = 2,
  100.     STATE_GOP = 3,
  101.     STATE_PICTURE = 4,
  102.     STATE_SLICE_1ST = 5,
  103.     STATE_PICTURE_2ND = 6,
  104.     STATE_SLICE = 7,
  105.     STATE_END = 8,
  106.     STATE_INVALID = 9,
  107.     STATE_PADDING = 10
  108. } mpeg2_state_t;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////
  110. ////////////////////////////////////////////////////////////////////////////////////////////////
  111. /* macroblock modes */
  112. #define MACROBLOCK_INTRA 1
  113. #define MACROBLOCK_PATTERN 2
  114. #define MACROBLOCK_MOTION_BACKWARD 4
  115. #define MACROBLOCK_MOTION_FORWARD 8
  116. #define MACROBLOCK_QUANT 16
  117. #define DCT_TYPE_INTERLACED 32
  118. /* motion_type */
  119. #define MOTION_TYPE_MASK (3*64)
  120. #define MOTION_TYPE_BASE 64
  121. #define MC_FIELD (1*64)
  122. #define MC_FRAME (2*64)
  123. #define MC_16X8 (2*64)
  124. #define MC_DMV (3*64)
  125. /* picture structure */
  126. #define TOP_FIELD 1
  127. #define BOTTOM_FIELD 2
  128. #define FRAME_PICTURE 3
  129. /* picture coding type */
  130. #define I_TYPE 1
  131. #define P_TYPE 2
  132. #define B_TYPE 3
  133. #define D_TYPE 4
  134. ////////////////////////////////////////////////////////////////////////////////////////////////
  135. ////////////////////////////////////////////////////////////////////////////////////////////////
  136. typedef void mpeg2_mc_fct(uint8_t*, const uint8_t*, int, int);
  137. typedef struct {mpeg2_mc_fct* put[8]; mpeg2_mc_fct* avg[8];} mpeg2_mc_t;
  138. class CMpeg2Decoder
  139. {
  140. public:
  141.     /* Motion vectors */
  142.     /* The f_ and b_ correspond to the forward and backward motion */
  143.     /* predictors */
  144. struct motion_t {
  145. uint8_t* ref[2][3];
  146. uint8_t** ref2[2];
  147. int pmv[2][2];
  148. int f_code[2];
  149. } m_b_motion, m_f_motion;
  150. private:
  151. int get_macroblock_modes();
  152. int get_quantizer_scale();
  153. int get_motion_delta(const int f_code);
  154. int bound_motion_vector(const int vector, const int f_code);
  155. int get_dmv();
  156. int get_coded_block_pattern();
  157. int get_luma_dc_dct_diff();
  158. int get_chroma_dc_dct_diff();
  159. void get_intra_block_B14();
  160. void get_intra_block_B15();
  161. int get_non_intra_block();
  162. void get_mpeg1_intra_block();
  163. int get_mpeg1_non_intra_block();
  164. void slice_intra_DCT(const int cc, uint8_t* dest, int stride);
  165. void slice_non_intra_DCT(uint8_t* dest, int stride);
  166. void motion_mp1(motion_t* motion, mpeg2_mc_fct * const * const table);
  167. void motion_fr_frame(motion_t* motion, mpeg2_mc_fct * const * const table);
  168. void motion_fr_field(motion_t* motion, mpeg2_mc_fct * const * const table);
  169. void motion_fr_dmv(motion_t* motion, mpeg2_mc_fct * const * const table);
  170. void motion_reuse(motion_t* motion, mpeg2_mc_fct * const * const table);
  171. void motion_zero(motion_t* motion, mpeg2_mc_fct * const * const table);
  172. void motion_fr_conceal();
  173. void motion_fi_field(motion_t * motion, mpeg2_mc_fct * const * const table);
  174. void motion_fi_16x8(motion_t* motion, mpeg2_mc_fct * const * const table);
  175. void motion_fi_dmv(motion_t* motion, mpeg2_mc_fct * const * const table);
  176. void motion_fi_conceal();
  177. int slice_init(int code);
  178. static bool m_idct_initialized;
  179. void (*m_idct_init)();
  180. void (*m_idct_copy)(int16_t* block, uint8_t* dest, const int stride);
  181. void (*m_idct_add)(const int last, int16_t* block, uint8_t* dest, const int stride);
  182. mpeg2_mc_t* m_mc;
  183. public:
  184. CMpeg2Decoder();
  185. virtual ~CMpeg2Decoder();
  186. void mpeg2_init_fbuf(uint8_t* current_fbuf[3], uint8_t* forward_fbuf[3], uint8_t* backward_fbuf[3]);
  187. void mpeg2_slice(int code, const uint8_t* buffer);
  188. int16_t* m_DCTblock;
  189.     /* bit parsing stuff */
  190.     uint32_t m_bitstream_buf; /* current 32 bit working set */
  191.     int m_bitstream_bits; /* used bits in working set */
  192.     const uint8_t* m_bitstream_ptr; /* buffer with stream data */
  193.     uint8_t* m_dest[3];
  194.     uint8_t* m_picture_dest[3];
  195.     int m_offset, m_stride, m_uv_stride;
  196.     unsigned int m_limit_x, m_limit_y_16, m_limit_y_8, m_limit_y;
  197.     /* predictor for DC coefficients in intra blocks */
  198.     int16_t m_dc_dct_pred[3];
  199.     int m_quantizer_scale; /* remove */
  200.     int m_dmv_offset; /* remove */
  201.     unsigned int m_v_offset; /* remove */
  202.     /* now non-slice-specific information */
  203.     /* sequence header stuff */
  204.     uint8_t m_intra_quantizer_matrix[64];
  205.     uint8_t m_non_intra_quantizer_matrix[64];
  206.     /* The width and height of the picture snapped to macroblock units */
  207.     int m_width, m_height;
  208.     int m_vertical_position_extension;
  209.     /* picture header stuff */
  210.     /* what type of picture this is (I, P, B, D) */
  211.     int m_coding_type;
  212.     /* picture coding extension stuff */
  213.     /* quantization factor for intra dc coefficients */
  214.     int m_intra_dc_precision;
  215.     /* top/bottom/both fields */
  216.     int m_picture_structure;
  217.     /* bool to indicate all predictions are frame based */
  218.     int m_frame_pred_frame_dct;
  219.     /* bool to indicate whether intra blocks have motion vectors */
  220.     /* (for concealment) */
  221.     int m_concealment_motion_vectors;
  222.     /* bit to indicate which quantization table to use */
  223.     int m_q_scale_type;
  224.     /* bool to use different vlc tables */
  225.     int m_intra_vlc_format;
  226.     /* used for DMV MC */
  227.     int m_top_field_first;
  228.     /* stuff derived from bitstream */
  229.     /* pointer to the zigzag scan we're supposed to be using */
  230.     const uint8_t* m_scan;
  231.     int m_second_field;
  232.     int m_mpeg1;
  233. };
  234. class CMpeg2Info
  235. {
  236. public:
  237. CMpeg2Info();
  238. virtual ~CMpeg2Info();
  239. void Reset();
  240. mpeg2_sequence_t* m_sequence;
  241.     mpeg2_gop_t* m_gop;
  242.     mpeg2_picture_t* m_current_picture;
  243.     mpeg2_picture_t* m_current_picture_2nd;
  244.     mpeg2_fbuf_t* m_current_fbuf;
  245.     mpeg2_picture_t* m_display_picture;
  246.     mpeg2_picture_t* m_display_picture_2nd;
  247.     mpeg2_fbuf_t* m_display_fbuf;
  248.     mpeg2_fbuf_t* m_discard_fbuf;
  249.     const uint8_t* m_user_data;
  250.     int m_user_data_len;
  251. };
  252. class CMpeg2Dec
  253. {
  254. int skip_chunk(int bytes);
  255. int copy_chunk(int bytes);
  256. mpeg2_state_t seek_chunk(), seek_header(), seek_sequence();
  257. int sequence_ext();
  258. int sequence_display_ext();
  259. int quant_matrix_ext();
  260. int copyright_ext();
  261. int picture_display_ext();
  262. int picture_coding_ext();
  263. public:
  264. CMpeg2Dec();
  265. virtual ~CMpeg2Dec();
  266. void mpeg2_init();
  267. void mpeg2_close();
  268. void mpeg2_buffer(uint8_t* start, uint8_t* end);
  269. int mpeg2_getpos();
  270. mpeg2_state_t mpeg2_parse();
  271. void mpeg2_skip(int skip);
  272. void mpeg2_slice_region(int start, int end);
  273. void mpeg2_pts(uint32_t pts);
  274. /* decode.c */
  275. mpeg2_state_t mpeg2_seek_sequence();
  276. mpeg2_state_t mpeg2_parse_header();
  277. /* header.c */
  278. void mpeg2_header_state_init();
  279. int mpeg2_header_sequence();
  280. int mpeg2_header_gop();
  281. mpeg2_state_t mpeg2_header_picture_start();
  282. int mpeg2_header_picture();
  283. int mpeg2_header_extension();
  284. int mpeg2_header_user_data();
  285. void mpeg2_header_matrix_finalize();
  286. void mpeg2_header_sequence_finalize();
  287. mpeg2_state_t mpeg2_header_slice_start();
  288. mpeg2_state_t mpeg2_header_end();
  289. void mpeg2_set_fbuf(int coding_type);
  290. enum {BUFFER_SIZE = 1194 * 1024};
  291. CMpeg2Decoder m_decoder;
  292.     CMpeg2Info m_info;
  293.     uint32_t m_shift;
  294.     int m_is_display_initialized;
  295. mpeg2_state_t (CMpeg2Dec::* m_action)();
  296.     mpeg2_state_t m_state;
  297.     uint32_t m_ext_state;
  298.     /* allocated in init - gcc has problems allocating such big structures */
  299.     uint8_t* m_chunk_buffer;
  300.     /* pointer to start of the current chunk */
  301.     uint8_t* m_chunk_start;
  302.     /* pointer to current position in chunk_buffer */
  303.     uint8_t* m_chunk_ptr;
  304.     /* last start code ? */
  305.     uint8_t m_code;
  306.     /* PTS */
  307.     uint32_t m_pts_current, m_pts_previous;
  308.     int m_num_pts;
  309.     int m_bytes_since_pts;
  310.     bool m_first;
  311.     int m_alloc_index;
  312.     uint8_t m_first_decode_slice;
  313.     uint8_t m_nb_decode_slices;
  314.     mpeg2_sequence_t m_new_sequence;
  315.     mpeg2_sequence_t m_sequence;
  316.     mpeg2_gop_t m_gop;
  317.     mpeg2_picture_t m_pictures[4];
  318.     mpeg2_picture_t* m_picture;
  319.     /*const*/ mpeg2_fbuf_t* m_fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */
  320. mpeg2_fbuf_t m_fbuf_alloc[3];
  321.     uint8_t* m_buf_start;
  322.     uint8_t* m_buf_end;
  323.     int16_t m_display_offset_x, m_display_offset_y;
  324.     int m_copy_matrix;
  325.     uint8_t m_intra_quantizer_matrix[64];
  326.     uint8_t m_non_intra_quantizer_matrix[64];
  327. };