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

midi

开发平台:

Unix_Linux

  1. /* $Id: 2191df3811785017612b0197ce36823dd801f500 $
  2.  * mpeg2_internal.h
  3.  * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
  4.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  5.  *
  6.  * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  7.  * See http://libmpeg2.sourceforge.net/ for updates.
  8.  *
  9.  * mpeg2dec is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * mpeg2dec is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  */
  23. #ifndef LIBMPEG2_MPEG2_INTERNAL_H
  24. #define LIBMPEG2_MPEG2_INTERNAL_H
  25. #define STATE_INTERNAL_NORETURN ((mpeg2_state_t)-1)
  26. /* macroblock modes */
  27. #define MACROBLOCK_INTRA 1
  28. #define MACROBLOCK_PATTERN 2
  29. #define MACROBLOCK_MOTION_BACKWARD 4
  30. #define MACROBLOCK_MOTION_FORWARD 8
  31. #define MACROBLOCK_QUANT 16
  32. #define DCT_TYPE_INTERLACED 32
  33. /* motion_type */
  34. #define MOTION_TYPE_SHIFT 6
  35. #define MC_FIELD 1
  36. #define MC_FRAME 2
  37. #define MC_16X8 2
  38. #define MC_DMV 3
  39. /* picture structure */
  40. #define TOP_FIELD 1
  41. #define BOTTOM_FIELD 2
  42. #define FRAME_PICTURE 3
  43. /* picture coding type */
  44. #define I_TYPE 1
  45. #define P_TYPE 2
  46. #define B_TYPE 3
  47. #define D_TYPE 4
  48. typedef void mpeg2_mc_fct (uint8_t *, const uint8_t *, int, int);
  49. typedef struct {
  50.     uint8_t * ref[2][3];
  51.     uint8_t ** ref2[2];
  52.     int pmv[2][2];
  53.     int f_code[2];
  54. } motion_t;
  55. typedef void motion_parser_t (mpeg2_decoder_t * decoder,
  56.       motion_t * motion,
  57.       mpeg2_mc_fct * const * table);
  58. struct mpeg2_decoder_s {
  59.     /* first, state that carries information from one macroblock to the */
  60.     /* next inside a slice, and is never used outside of mpeg2_slice() */
  61.     /* bit parsing stuff */
  62.     uint32_t bitstream_buf; /* current 32 bit working set */
  63.     int bitstream_bits; /* used bits in working set */
  64.     const uint8_t * bitstream_ptr; /* buffer with stream data */
  65.     uint8_t * dest[3];
  66.     int offset;
  67.     int stride;
  68.     int uv_stride;
  69.     int slice_stride;
  70.     int slice_uv_stride;
  71.     int stride_frame;
  72.     unsigned int limit_x;
  73.     unsigned int limit_y_16;
  74.     unsigned int limit_y_8;
  75.     unsigned int limit_y;
  76.     /* Motion vectors */
  77.     /* The f_ and b_ correspond to the forward and backward motion */
  78.     /* predictors */
  79.     motion_t b_motion;
  80.     motion_t f_motion;
  81.     motion_parser_t * motion_parser[5];
  82.     /* predictor for DC coefficients in intra blocks */
  83.     int16_t dc_dct_pred[3];
  84.     /* DCT coefficients */
  85.     int16_t DCTblock[64] ATTR_ALIGN(64);
  86.     uint8_t * picture_dest[3];
  87.     void (* convert) (void * convert_id, uint8_t * const * src,
  88.       unsigned int v_offset);
  89.     void * convert_id;
  90.     int dmv_offset;
  91.     unsigned int v_offset;
  92.     /* now non-slice-specific information */
  93.     /* sequence header stuff */
  94.     uint16_t * quantizer_matrix[4];
  95.     uint16_t (* chroma_quantizer[2])[64];
  96.     uint16_t quantizer_prescale[4][32][64];
  97.     /* The width and height of the picture snapped to macroblock units */
  98.     int width;
  99.     int height;
  100.     int vertical_position_extension;
  101.     int chroma_format;
  102.     /* picture header stuff */
  103.     /* what type of picture this is (I, P, B, D) */
  104.     int coding_type;
  105.     /* picture coding extension stuff */
  106.     /* quantization factor for intra dc coefficients */
  107.     int intra_dc_precision;
  108.     /* top/bottom/both fields */
  109.     int picture_structure;
  110.     /* bool to indicate all predictions are frame based */
  111.     int frame_pred_frame_dct;
  112.     /* bool to indicate whether intra blocks have motion vectors */
  113.     /* (for concealment) */
  114.     int concealment_motion_vectors;
  115.     /* bool to use different vlc tables */
  116.     int intra_vlc_format;
  117.     /* used for DMV MC */
  118.     int top_field_first;
  119.     /* stuff derived from bitstream */
  120.     /* pointer to the zigzag scan we're supposed to be using */
  121.     const uint8_t * scan;
  122.     int second_field;
  123.     int mpeg1;
  124.     /* XXX: stuff due to xine shit */
  125.     int8_t q_scale_type;
  126. };
  127. typedef struct {
  128.     mpeg2_fbuf_t fbuf;
  129. } fbuf_alloc_t;
  130. struct mpeg2dec_s {
  131.     mpeg2_decoder_t decoder;
  132.     mpeg2_info_t info;
  133.     uint32_t shift;
  134.     int is_display_initialized;
  135.     mpeg2_state_t (* action) (struct mpeg2dec_s * mpeg2dec);
  136.     mpeg2_state_t state;
  137.     uint32_t ext_state;
  138.     /* allocated in init - gcc has problems allocating such big structures */
  139.     uint8_t * chunk_buffer;
  140.     /* pointer to start of the current chunk */
  141.     uint8_t * chunk_start;
  142.     /* pointer to current position in chunk_buffer */
  143.     uint8_t * chunk_ptr;
  144.     /* last start code ? */
  145.     uint8_t code;
  146.     /* picture tags */
  147.     uint32_t tag_current, tag2_current, tag_previous, tag2_previous;
  148.     int num_tags;
  149.     int bytes_since_tag;
  150.     int first;
  151.     int alloc_index_user;
  152.     int alloc_index;
  153.     uint8_t first_decode_slice;
  154.     uint8_t nb_decode_slices;
  155.     unsigned int user_data_len;
  156.     mpeg2_sequence_t new_sequence;
  157.     mpeg2_sequence_t sequence;
  158.     mpeg2_gop_t new_gop;
  159.     mpeg2_gop_t gop;
  160.     mpeg2_picture_t new_picture;
  161.     mpeg2_picture_t pictures[4];
  162.     mpeg2_picture_t * picture;
  163.     /*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */
  164.     fbuf_alloc_t fbuf_alloc[3];
  165.     int custom_fbuf;
  166.     uint8_t * yuv_buf[3][3];
  167.     int yuv_index;
  168.     mpeg2_convert_t * convert;
  169.     void * convert_arg;
  170.     unsigned int convert_id_size;
  171.     int convert_stride;
  172.     void (* convert_start) (void * id, const mpeg2_fbuf_t * fbuf,
  173.     const mpeg2_picture_t * picture,
  174.     const mpeg2_gop_t * gop);
  175.     uint8_t * buf_start;
  176.     uint8_t * buf_end;
  177.     int16_t display_offset_x, display_offset_y;
  178.     int copy_matrix;
  179.     int8_t scaled[4]; /* XXX: MOVED */
  180.     //int8_t q_scale_type, scaled[4];
  181.     uint8_t quantizer_matrix[4][64];
  182.     uint8_t new_quantizer_matrix[4][64];
  183. };
  184. typedef struct {
  185. #ifdef ARCH_PPC
  186.     uint8_t regv[12*16];
  187. #endif
  188.     int dummy;
  189. } cpu_state_t;
  190. /* cpu_accel.c */
  191. uint32_t mpeg2_detect_accel (uint32_t accel);
  192. /* cpu_state.c */
  193. void mpeg2_cpu_state_init (uint32_t accel);
  194. /* decode.c */
  195. mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec);
  196. mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec);
  197. /* header.c */
  198. void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec);
  199. void mpeg2_reset_info (mpeg2_info_t * info);
  200. int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec);
  201. int mpeg2_header_gop (mpeg2dec_t * mpeg2dec);
  202. mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec);
  203. int mpeg2_header_picture (mpeg2dec_t * mpeg2dec);
  204. int mpeg2_header_extension (mpeg2dec_t * mpeg2dec);
  205. int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec);
  206. void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec);
  207. void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec);
  208. void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels);
  209. mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec);
  210. mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec);
  211. void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type);
  212. /* idct.c */
  213. extern void mpeg2_idct_init (uint32_t accel);
  214. extern uint8_t mpeg2_scan_norm[64];
  215. extern uint8_t mpeg2_scan_alt[64];
  216. /* idct_mmx.c */
  217. void mpeg2_idct_copy_sse2 (int16_t * block, uint8_t * dest, int stride);
  218. void mpeg2_idct_add_sse2 (int last, int16_t * block,
  219.   uint8_t * dest, int stride);
  220. void mpeg2_idct_copy_mmxext (int16_t * block, uint8_t * dest, int stride);
  221. void mpeg2_idct_add_mmxext (int last, int16_t * block,
  222.     uint8_t * dest, int stride);
  223. void mpeg2_idct_copy_mmx (int16_t * block, uint8_t * dest, int stride);
  224. void mpeg2_idct_add_mmx (int last, int16_t * block,
  225.  uint8_t * dest, int stride);
  226. void mpeg2_idct_mmx_init (void);
  227. /* idct_altivec.c */
  228. void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride);
  229. void mpeg2_idct_add_altivec (int last, int16_t * block,
  230.      uint8_t * dest, int stride);
  231. void mpeg2_idct_altivec_init (void);
  232. /* idct_alpha.c */
  233. void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, int stride);
  234. void mpeg2_idct_add_mvi (int last, int16_t * block,
  235.  uint8_t * dest, int stride);
  236. void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, int stride);
  237. void mpeg2_idct_add_alpha (int last, int16_t * block,
  238.    uint8_t * dest, int stride);
  239. void mpeg2_idct_alpha_init (void);
  240. /* motion_comp.c */
  241. void mpeg2_mc_init (uint32_t accel);
  242. typedef struct {
  243.     mpeg2_mc_fct * put [8];
  244.     mpeg2_mc_fct * avg [8];
  245. } mpeg2_mc_t;
  246. #define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = {   
  247.     {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, 
  248.      MC_put_o_8_##x,  MC_put_x_8_##x,  MC_put_y_8_##x,  MC_put_xy_8_##x}, 
  249.     {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, 
  250.      MC_avg_o_8_##x,  MC_avg_x_8_##x,  MC_avg_y_8_##x,  MC_avg_xy_8_##x}  
  251. };
  252. extern mpeg2_mc_t mpeg2_mc_c;
  253. extern mpeg2_mc_t mpeg2_mc_mmx;
  254. extern mpeg2_mc_t mpeg2_mc_mmxext;
  255. extern mpeg2_mc_t mpeg2_mc_3dnow;
  256. extern mpeg2_mc_t mpeg2_mc_altivec;
  257. extern mpeg2_mc_t mpeg2_mc_alpha;
  258. extern mpeg2_mc_t mpeg2_mc_vis;
  259. extern mpeg2_mc_t mpeg2_mc_arm;
  260. #endif /* LIBMPEG2_MPEG2_INTERNAL_H */