3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
6 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
7 * See http://libmpeg2.sourceforge.net/ for updates.
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.
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.
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
24 #ifndef LIBMPEG2_MPEG2_INTERNAL_H
25 #define LIBMPEG2_MPEG2_INTERNAL_H
27 #define STATE_INTERNAL_NORETURN ((mpeg2_state_t)-1)
29 /* macroblock modes */
30 #define MACROBLOCK_INTRA 1
31 #define MACROBLOCK_PATTERN 2
32 #define MACROBLOCK_MOTION_BACKWARD 4
33 #define MACROBLOCK_MOTION_FORWARD 8
34 #define MACROBLOCK_QUANT 16
35 #define DCT_TYPE_INTERLACED 32
37 #define MOTION_TYPE_SHIFT 6
43 /* picture structure */
45 #define BOTTOM_FIELD 2
46 #define FRAME_PICTURE 3
48 /* picture coding type */
54 typedef void mpeg2_mc_fct (uint8_t *, const uint8_t *, int, int);
63 typedef void motion_parser_t (mpeg2_decoder_t * decoder,
65 mpeg2_mc_fct * const * table);
67 struct mpeg2_decoder_s {
68 /* first, state that carries information from one macroblock to the */
69 /* next inside a slice, and is never used outside of mpeg2_slice() */
71 /* bit parsing stuff */
72 uint32_t bitstream_buf; /* current 32 bit working set */
73 int bitstream_bits; /* used bits in working set */
74 const uint8_t * bitstream_ptr; /* buffer with stream data */
85 unsigned int limit_y_16;
86 unsigned int limit_y_8;
90 /* The f_ and b_ correspond to the forward and backward motion */
94 motion_parser_t * motion_parser[5];
96 /* predictor for DC coefficients in intra blocks */
97 int16_t dc_dct_pred[3];
99 /* DCT coefficients */
100 int16_t DCTblock[64] ATTR_ALIGN(64);
102 uint8_t * picture_dest[3];
103 void (* convert) (void * convert_id, uint8_t * const * src,
104 unsigned int v_offset);
108 unsigned int v_offset;
110 /* now non-slice-specific information */
112 /* sequence header stuff */
113 uint16_t * quantizer_matrix[4];
114 uint16_t (* chroma_quantizer[2])[64];
115 uint16_t quantizer_prescale[4][32][64];
117 /* The width and height of the picture snapped to macroblock units */
120 int vertical_position_extension;
123 /* picture header stuff */
125 /* what type of picture this is (I, P, B, D) */
128 /* picture coding extension stuff */
130 /* quantization factor for intra dc coefficients */
131 int intra_dc_precision;
132 /* top/bottom/both fields */
133 int picture_structure;
134 /* bool to indicate all predictions are frame based */
135 int frame_pred_frame_dct;
136 /* bool to indicate whether intra blocks have motion vectors */
137 /* (for concealment) */
138 int concealment_motion_vectors;
139 /* bool to use different vlc tables */
140 int intra_vlc_format;
141 /* used for DMV MC */
144 /* stuff derived from bitstream */
146 /* pointer to the zigzag scan we're supposed to be using */
147 const uint8_t * scan;
153 /* XXX: stuff due to xine shit */
162 mpeg2_decoder_t decoder;
167 int is_display_initialized;
168 mpeg2_state_t (* action) (struct mpeg2dec_s * mpeg2dec);
172 /* allocated in init - gcc has problems allocating such big structures */
173 uint8_t * chunk_buffer;
174 /* pointer to start of the current chunk */
175 uint8_t * chunk_start;
176 /* pointer to current position in chunk_buffer */
178 /* last start code ? */
182 uint32_t tag_current, tag2_current, tag_previous, tag2_previous;
187 int alloc_index_user;
189 uint8_t first_decode_slice;
190 uint8_t nb_decode_slices;
192 unsigned int user_data_len;
194 mpeg2_sequence_t new_sequence;
195 mpeg2_sequence_t sequence;
198 mpeg2_picture_t new_picture;
199 mpeg2_picture_t pictures[4];
200 mpeg2_picture_t * picture;
201 /*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */
203 fbuf_alloc_t fbuf_alloc[3];
206 uint8_t * yuv_buf[3][3];
208 mpeg2_convert_t * convert;
210 unsigned int convert_id_size;
212 void (* convert_start) (void * id, const mpeg2_fbuf_t * fbuf,
213 const mpeg2_picture_t * picture,
214 const mpeg2_gop_t * gop);
219 int16_t display_offset_x, display_offset_y;
222 int8_t scaled[4]; /* XXX: MOVED */
223 //int8_t q_scale_type, scaled[4];
224 uint8_t quantizer_matrix[4][64];
225 uint8_t new_quantizer_matrix[4][64];
236 uint32_t mpeg2_detect_accel (uint32_t accel);
239 void mpeg2_cpu_state_init (uint32_t accel);
242 mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec);
243 mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec);
246 void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec);
247 void mpeg2_reset_info (mpeg2_info_t * info);
248 int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec);
249 int mpeg2_header_gop (mpeg2dec_t * mpeg2dec);
250 mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec);
251 int mpeg2_header_picture (mpeg2dec_t * mpeg2dec);
252 int mpeg2_header_extension (mpeg2dec_t * mpeg2dec);
253 int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec);
254 void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec);
255 void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec);
256 void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels);
257 mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec);
258 mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec);
259 void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type);
262 extern void mpeg2_idct_init (uint32_t accel);
263 extern uint8_t mpeg2_scan_norm[64];
264 extern uint8_t mpeg2_scan_alt[64];
267 void mpeg2_idct_copy_sse2 (int16_t * block, uint8_t * dest, int stride);
268 void mpeg2_idct_add_sse2 (int last, int16_t * block,
269 uint8_t * dest, int stride);
270 void mpeg2_idct_copy_mmxext (int16_t * block, uint8_t * dest, int stride);
271 void mpeg2_idct_add_mmxext (int last, int16_t * block,
272 uint8_t * dest, int stride);
273 void mpeg2_idct_copy_mmx (int16_t * block, uint8_t * dest, int stride);
274 void mpeg2_idct_add_mmx (int last, int16_t * block,
275 uint8_t * dest, int stride);
276 void mpeg2_idct_mmx_init (void);
279 void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride);
280 void mpeg2_idct_add_altivec (int last, int16_t * block,
281 uint8_t * dest, int stride);
282 void mpeg2_idct_altivec_init (void);
285 void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, int stride);
286 void mpeg2_idct_add_mvi (int last, int16_t * block,
287 uint8_t * dest, int stride);
288 void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, int stride);
289 void mpeg2_idct_add_alpha (int last, int16_t * block,
290 uint8_t * dest, int stride);
291 void mpeg2_idct_alpha_init (void);
294 void mpeg2_mc_init (uint32_t accel);
297 mpeg2_mc_fct * put [8];
298 mpeg2_mc_fct * avg [8];
301 #define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = { \
302 {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \
303 MC_put_o_8_##x, MC_put_x_8_##x, MC_put_y_8_##x, MC_put_xy_8_##x}, \
304 {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \
305 MC_avg_o_8_##x, MC_avg_x_8_##x, MC_avg_y_8_##x, MC_avg_xy_8_##x} \
308 extern mpeg2_mc_t mpeg2_mc_c;
309 extern mpeg2_mc_t mpeg2_mc_mmx;
310 extern mpeg2_mc_t mpeg2_mc_mmxext;
311 extern mpeg2_mc_t mpeg2_mc_3dnow;
312 extern mpeg2_mc_t mpeg2_mc_altivec;
313 extern mpeg2_mc_t mpeg2_mc_alpha;
314 extern mpeg2_mc_t mpeg2_mc_vis;
315 extern mpeg2_mc_t mpeg2_mc_arm;
317 #endif /* LIBMPEG2_MPEG2_INTERNAL_H */