1 /*
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  * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
24  * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
25  * $Id: mpeg2_internal.h 31395 2010-06-14 08:55:32Z lu_zero $
26  */
27 
28 #ifndef LIBMPEG2_MPEG2_INTERNAL_H
29 #define LIBMPEG2_MPEG2_INTERNAL_H
30 
31 #define STATE_INTERNAL_NORETURN ((mpeg2_state_t)-1)
32 
33 /* macroblock modes */
34 #define MACROBLOCK_INTRA 1
35 #define MACROBLOCK_PATTERN 2
36 #define MACROBLOCK_MOTION_BACKWARD 4
37 #define MACROBLOCK_MOTION_FORWARD 8
38 #define MACROBLOCK_QUANT 16
39 #define DCT_TYPE_INTERLACED 32
40 /* motion_type */
41 #define MOTION_TYPE_SHIFT 6
42 #define MC_FIELD 1
43 #define MC_FRAME 2
44 #define MC_16X8 2
45 #define MC_DMV 3
46 
47 /* picture structure */
48 #define TOP_FIELD 1
49 #define BOTTOM_FIELD 2
50 #define FRAME_PICTURE 3
51 
52 /* picture coding type */
53 #define I_TYPE 1
54 #define P_TYPE 2
55 #define B_TYPE 3
56 #define D_TYPE 4
57 
58 typedef void mpeg2_mc_fct (uint8_t *, const uint8_t *, int, int);
59 
60 typedef struct {
61     uint8_t * ref[2][3];
62     uint8_t ** ref2[2];
63     int pmv[2][2];
64     int f_code[2];
65 } motion_t;
66 
67 typedef void motion_parser_t (mpeg2_decoder_t * decoder,
68 			      motion_t * motion,
69 			      mpeg2_mc_fct * const * table);
70 
71 struct mpeg2_decoder_s {
72     /* first, state that carries information from one macroblock to the */
73     /* next inside a slice, and is never used outside of mpeg2_slice() */
74 
75     /* bit parsing stuff */
76     uint32_t bitstream_buf;		/* current 32 bit working set */
77     int bitstream_bits;			/* used bits in working set */
78     const uint8_t * bitstream_ptr;	/* buffer with stream data */
79 
80     uint8_t * dest[3];
81 
82     int offset;
83     int stride;
84     int uv_stride;
85     int slice_stride;
86     int slice_uv_stride;
87     int stride_frame;
88     unsigned int limit_x;
89     unsigned int limit_y_16;
90     unsigned int limit_y_8;
91     unsigned int limit_y;
92 
93     /* Motion vectors */
94     /* The f_ and b_ correspond to the forward and backward motion */
95     /* predictors */
96     motion_t b_motion;
97     motion_t f_motion;
98     motion_parser_t * motion_parser[5];
99 
100     /* predictor for DC coefficients in intra blocks */
101     int16_t dc_dct_pred[3];
102 
103     /* DCT coefficients */
104     int16_t DCTblock[64] ATTR_ALIGN(64);
105 
106     uint8_t * picture_dest[3];
107     void (* convert) (void * convert_id, uint8_t * const * src,
108 		      unsigned int v_offset);
109     void * convert_id;
110 
111     int dmv_offset;
112     unsigned int v_offset;
113 
114     /* now non-slice-specific information */
115 
116     /* sequence header stuff */
117     uint16_t * quantizer_matrix[4];
118     uint16_t (* chroma_quantizer[2])[64];
119     uint16_t quantizer_prescale[4][32][64];
120 
121     /* The width and height of the picture snapped to macroblock units */
122     int width;
123     int height;
124     int vertical_position_extension;
125     int chroma_format;
126 
127     /* picture header stuff */
128 
129     /* what type of picture this is (I, P, B, D) */
130     int coding_type;
131 
132     /* picture coding extension stuff */
133 
134     /* quantization factor for intra dc coefficients */
135     int intra_dc_precision;
136     /* top/bottom/both fields */
137     int picture_structure;
138     /* bool to indicate all predictions are frame based */
139     int frame_pred_frame_dct;
140     /* bool to indicate whether intra blocks have motion vectors */
141     /* (for concealment) */
142     int concealment_motion_vectors;
143     /* bool to use different vlc tables */
144     int intra_vlc_format;
145     /* used for DMV MC */
146     int top_field_first;
147 
148     /* stuff derived from bitstream */
149 
150     /* pointer to the zigzag scan we're supposed to be using */
151     const uint8_t * scan;
152 
153     int second_field;
154 
155     int mpeg1;
156 
157     /* XXX: stuff due to xine shit */
158     int8_t q_scale_type;
159 
160     int quantizer_scales[32];
161     int quantizer_scale;
162     char* quant_store;
163     int quant_stride;
164 };
165 
166 typedef struct {
167     mpeg2_fbuf_t fbuf;
168 } fbuf_alloc_t;
169 
170 struct mpeg2dec_s {
171     mpeg2_decoder_t decoder;
172 
173     mpeg2_info_t info;
174 
175     uint32_t shift;
176     int is_display_initialized;
177     mpeg2_state_t (* action) (struct mpeg2dec_s * mpeg2dec);
178     mpeg2_state_t state;
179     uint32_t ext_state;
180 
181     /* allocated in init - gcc has problems allocating such big structures */
182     uint8_t * chunk_buffer;
183     /* pointer to start of the current chunk */
184     uint8_t * chunk_start;
185     /* pointer to current position in chunk_buffer */
186     uint8_t * chunk_ptr;
187     /* last start code ? */
188     uint8_t code;
189 
190     /* picture tags */
191     uint32_t tag_current, tag2_current, tag_previous, tag2_previous;
192     int num_tags;
193     int bytes_since_tag;
194 
195     int first;
196     int alloc_index_user;
197     int alloc_index;
198     uint8_t first_decode_slice;
199     uint8_t nb_decode_slices;
200 
201     unsigned int user_data_len;
202 
203     mpeg2_sequence_t new_sequence;
204     mpeg2_sequence_t sequence;
205     mpeg2_gop_t new_gop;
206     mpeg2_gop_t gop;
207     mpeg2_picture_t new_picture;
208     mpeg2_picture_t pictures[4];
209     mpeg2_picture_t * picture;
210     /*const*/ mpeg2_fbuf_t * fbuf[3];	/* 0: current fbuf, 1-2: prediction fbufs */
211 
212     fbuf_alloc_t fbuf_alloc[3];
213     int custom_fbuf;
214 
215     uint8_t * yuv_buf[3][3];
216     int yuv_index;
217     mpeg2_convert_t * convert;
218     void * convert_arg;
219     unsigned int convert_id_size;
220     int convert_stride;
221     void (* convert_start) (void * id, const mpeg2_fbuf_t * fbuf,
222 			    const mpeg2_picture_t * picture,
223 			    const mpeg2_gop_t * gop);
224 
225     uint8_t * buf_start;
226     uint8_t * buf_end;
227 
228     int16_t display_offset_x, display_offset_y;
229 
230     int copy_matrix;
231     int8_t scaled[4]; /* XXX: MOVED */
232     //int8_t q_scale_type, scaled[4];
233     uint8_t quantizer_matrix[4][64];
234     uint8_t new_quantizer_matrix[4][64];
235 };
236 
237 typedef struct {
238 #if ARCH_PPC
239     uint8_t regv[12*16];
240 #endif
241     int dummy;
242 } cpu_state_t;
243 
244 /* cpu_accel.c */
245 uint32_t mpeg2_detect_accel (uint32_t accel);
246 
247 /* cpu_state.c */
248 void mpeg2_cpu_state_init (uint32_t accel);
249 
250 /* decode.c */
251 mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec);
252 mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec);
253 
254 /* header.c */
255 void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec);
256 void mpeg2_reset_info (mpeg2_info_t * info);
257 int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec);
258 int mpeg2_header_gop (mpeg2dec_t * mpeg2dec);
259 mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec);
260 int mpeg2_header_picture (mpeg2dec_t * mpeg2dec);
261 int mpeg2_header_extension (mpeg2dec_t * mpeg2dec);
262 int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec);
263 void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec);
264 void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec);
265 void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels);
266 mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec);
267 mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec);
268 void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type);
269 
270 /* idct.c */
271 extern void mpeg2_idct_init (uint32_t accel);
272 extern uint8_t mpeg2_scan_norm[64];
273 extern uint8_t mpeg2_scan_alt[64];
274 
275 /* idct_mmx.c */
276 void mpeg2_idct_copy_sse2 (int16_t * block, uint8_t * dest, int stride);
277 void mpeg2_idct_add_sse2 (int last, int16_t * block,
278 			  uint8_t * dest, int stride);
279 void mpeg2_idct_copy_mmxext (int16_t * block, uint8_t * dest, int stride);
280 void mpeg2_idct_add_mmxext (int last, int16_t * block,
281 			    uint8_t * dest, int stride);
282 void mpeg2_idct_copy_mmx (int16_t * block, uint8_t * dest, int stride);
283 void mpeg2_idct_add_mmx (int last, int16_t * block,
284 			 uint8_t * dest, int stride);
285 void mpeg2_idct_mmx_init (void);
286 
287 /* idct_altivec.c */
288 void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride);
289 void mpeg2_idct_add_altivec (int last, int16_t * block,
290 			     uint8_t * dest, int stride);
291 void mpeg2_idct_altivec_init (void);
292 
293 /* idct_alpha.c */
294 void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, int stride);
295 void mpeg2_idct_add_mvi (int last, int16_t * block,
296 			 uint8_t * dest, int stride);
297 void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, int stride);
298 void mpeg2_idct_add_alpha (int last, int16_t * block,
299 			   uint8_t * dest, int stride);
300 void mpeg2_idct_alpha_init (void);
301 
302 /* motion_comp.c */
303 void mpeg2_mc_init (uint32_t accel);
304 
305 typedef struct {
306     mpeg2_mc_fct * put [8];
307     mpeg2_mc_fct * avg [8];
308 } mpeg2_mc_t;
309 
310 #define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = {			  \
311     {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \
312      MC_put_o_8_##x,  MC_put_x_8_##x,  MC_put_y_8_##x,  MC_put_xy_8_##x}, \
313     {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \
314      MC_avg_o_8_##x,  MC_avg_x_8_##x,  MC_avg_y_8_##x,  MC_avg_xy_8_##x}  \
315 };
316 
317 extern mpeg2_mc_t mpeg2_mc_c;
318 extern mpeg2_mc_t mpeg2_mc_mmx;
319 extern mpeg2_mc_t mpeg2_mc_mmxext;
320 extern mpeg2_mc_t mpeg2_mc_3dnow;
321 extern mpeg2_mc_t mpeg2_mc_altivec;
322 extern mpeg2_mc_t mpeg2_mc_alpha;
323 extern mpeg2_mc_t mpeg2_mc_vis;
324 extern mpeg2_mc_t mpeg2_mc_arm;
325 
326 #endif /* LIBMPEG2_MPEG2_INTERNAL_H */
327