Mercurial > mplayer.hg
annotate libmpeg2/mpeg2_internal.h @ 17283:4fea216307d2
Partial support for QuickTime sound atom version 2.
This doesn't add support for parsing the sound atom itself, but does
recognize the different offset at which the ESDS atom starts. Also,
this patch supports "3" in the channels field, which indicates
6-channel (5.1) audio. For more information, see this mail:
From: Corey Hickey <bugfood-ml@fatooh.org>
To: mplayer-dev-eng@mplayerhq.hu
Date: Wed, 28 Dec 2005 23:42:46 -0800
Subject: [PATCH] (partially) support QuickTime sound atom version 2
author | corey |
---|---|
date | Mon, 02 Jan 2006 06:56:22 +0000 |
parents | 1385ec491ffb |
children | 0783dd397f74 |
rev | line source |
---|---|
1 | 1 /* |
2 * mpeg2_internal.h | |
12932 | 3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> |
9852 | 4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> |
1 | 5 * |
6 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. | |
9852 | 7 * See http://libmpeg2.sourceforge.net/ for updates. |
1 | 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 | |
14732
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13123
diff
changeset
|
22 * |
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13123
diff
changeset
|
23 * Modified for use with MPlayer, see libmpeg-0.4.0.diff for the exact changes. |
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13123
diff
changeset
|
24 * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ |
1385ec491ffb
Mark locally modified files as such to comply more closely with GPL 2a.
diego
parents:
13123
diff
changeset
|
25 * $Id$ |
1 | 26 */ |
27 | |
36 | 28 /* macroblock modes */ |
1 | 29 #define MACROBLOCK_INTRA 1 |
30 #define MACROBLOCK_PATTERN 2 | |
31 #define MACROBLOCK_MOTION_BACKWARD 4 | |
32 #define MACROBLOCK_MOTION_FORWARD 8 | |
33 #define MACROBLOCK_QUANT 16 | |
34 #define DCT_TYPE_INTERLACED 32 | |
36 | 35 /* motion_type */ |
12932 | 36 #define MOTION_TYPE_SHIFT 6 |
37 #define MC_FIELD 1 | |
38 #define MC_FRAME 2 | |
39 #define MC_16X8 2 | |
40 #define MC_DMV 3 | |
1 | 41 |
36 | 42 /* picture structure */ |
1 | 43 #define TOP_FIELD 1 |
44 #define BOTTOM_FIELD 2 | |
45 #define FRAME_PICTURE 3 | |
46 | |
36 | 47 /* picture coding type */ |
1 | 48 #define I_TYPE 1 |
49 #define P_TYPE 2 | |
50 #define B_TYPE 3 | |
51 #define D_TYPE 4 | |
52 | |
12932 | 53 typedef void mpeg2_mc_fct (uint8_t *, const uint8_t *, int, int); |
54 | |
9852 | 55 typedef struct { |
1 | 56 uint8_t * ref[2][3]; |
9852 | 57 uint8_t ** ref2[2]; |
1 | 58 int pmv[2][2]; |
59 int f_code[2]; | |
60 } motion_t; | |
61 | |
12932 | 62 typedef void motion_parser_t (mpeg2_decoder_t * decoder, |
63 motion_t * motion, | |
64 mpeg2_mc_fct * const * table); | |
65 | |
66 struct mpeg2_decoder_s { | |
36 | 67 /* first, state that carries information from one macroblock to the */ |
9852 | 68 /* next inside a slice, and is never used outside of mpeg2_slice() */ |
36 | 69 |
70 /* bit parsing stuff */ | |
9852 | 71 uint32_t bitstream_buf; /* current 32 bit working set */ |
72 int bitstream_bits; /* used bits in working set */ | |
73 const uint8_t * bitstream_ptr; /* buffer with stream data */ | |
74 | |
75 uint8_t * dest[3]; | |
76 | |
77 int offset; | |
78 int stride; | |
79 int uv_stride; | |
12932 | 80 int slice_stride; |
81 int slice_uv_stride; | |
82 int stride_frame; | |
9852 | 83 unsigned int limit_x; |
84 unsigned int limit_y_16; | |
85 unsigned int limit_y_8; | |
86 unsigned int limit_y; | |
36 | 87 |
88 /* Motion vectors */ | |
89 /* The f_ and b_ correspond to the forward and backward motion */ | |
90 /* predictors */ | |
1 | 91 motion_t b_motion; |
92 motion_t f_motion; | |
12932 | 93 motion_parser_t * motion_parser[5]; |
1 | 94 |
36 | 95 /* predictor for DC coefficients in intra blocks */ |
1 | 96 int16_t dc_dct_pred[3]; |
97 | |
12932 | 98 /* DCT coefficients */ |
99 int16_t DCTblock[64] ATTR_ALIGN(64); | |
100 | |
101 uint8_t * picture_dest[3]; | |
102 void (* convert) (void * convert_id, uint8_t * const * src, | |
103 unsigned int v_offset); | |
104 void * convert_id; | |
105 | |
106 int dmv_offset; | |
107 unsigned int v_offset; | |
36 | 108 |
109 /* now non-slice-specific information */ | |
110 | |
111 /* sequence header stuff */ | |
12932 | 112 uint16_t * quantizer_matrix[4]; |
113 uint16_t (* chroma_quantizer[2])[64]; | |
114 uint16_t quantizer_prescale[4][32][64]; | |
36 | 115 |
116 /* The width and height of the picture snapped to macroblock units */ | |
9852 | 117 int width; |
118 int height; | |
119 int vertical_position_extension; | |
12932 | 120 int chroma_format; |
36 | 121 |
122 /* picture header stuff */ | |
123 | |
124 /* what type of picture this is (I, P, B, D) */ | |
9852 | 125 int coding_type; |
126 | |
36 | 127 /* picture coding extension stuff */ |
9852 | 128 |
36 | 129 /* quantization factor for intra dc coefficients */ |
130 int intra_dc_precision; | |
131 /* top/bottom/both fields */ | |
132 int picture_structure; | |
133 /* bool to indicate all predictions are frame based */ | |
134 int frame_pred_frame_dct; | |
135 /* bool to indicate whether intra blocks have motion vectors */ | |
136 /* (for concealment) */ | |
137 int concealment_motion_vectors; | |
138 /* bool to use different vlc tables */ | |
139 int intra_vlc_format; | |
140 /* used for DMV MC */ | |
141 int top_field_first; | |
142 | |
143 /* stuff derived from bitstream */ | |
144 | |
145 /* pointer to the zigzag scan we're supposed to be using */ | |
9852 | 146 const uint8_t * scan; |
36 | 147 |
148 int second_field; | |
149 | |
150 int mpeg1; | |
12935 | 151 |
152 /* for MPlayer: */ | |
13123 | 153 int quantizer_scales[32]; |
12935 | 154 int quantizer_scale; |
155 char* quant_store; | |
156 int quant_stride; | |
9852 | 157 }; |
36 | 158 |
9852 | 159 typedef struct { |
12932 | 160 mpeg2_fbuf_t fbuf; |
9852 | 161 } fbuf_alloc_t; |
162 | |
163 struct mpeg2dec_s { | |
12932 | 164 mpeg2_decoder_t decoder; |
9852 | 165 |
166 mpeg2_info_t info; | |
167 | |
168 uint32_t shift; | |
169 int is_display_initialized; | |
12932 | 170 mpeg2_state_t (* action) (struct mpeg2dec_s * mpeg2dec); |
171 mpeg2_state_t state; | |
9852 | 172 uint32_t ext_state; |
79 | 173 |
9852 | 174 /* allocated in init - gcc has problems allocating such big structures */ |
175 uint8_t * chunk_buffer; | |
176 /* pointer to start of the current chunk */ | |
177 uint8_t * chunk_start; | |
178 /* pointer to current position in chunk_buffer */ | |
179 uint8_t * chunk_ptr; | |
180 /* last start code ? */ | |
181 uint8_t code; | |
182 | |
12932 | 183 /* picture tags */ |
184 uint32_t tag_current, tag2_current, tag_previous, tag2_previous; | |
185 int num_tags; | |
186 int bytes_since_tag; | |
9852 | 187 |
188 int first; | |
189 int alloc_index_user; | |
190 int alloc_index; | |
191 uint8_t first_decode_slice; | |
192 uint8_t nb_decode_slices; | |
193 | |
12932 | 194 unsigned int user_data_len; |
195 | |
196 mpeg2_sequence_t new_sequence; | |
197 mpeg2_sequence_t sequence; | |
198 mpeg2_gop_t new_gop; | |
199 mpeg2_gop_t gop; | |
200 mpeg2_picture_t new_picture; | |
201 mpeg2_picture_t pictures[4]; | |
202 mpeg2_picture_t * picture; | |
203 /*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */ | |
9852 | 204 |
205 fbuf_alloc_t fbuf_alloc[3]; | |
206 int custom_fbuf; | |
79 | 207 |
9852 | 208 uint8_t * yuv_buf[3][3]; |
209 int yuv_index; | |
12932 | 210 mpeg2_convert_t * convert; |
211 void * convert_arg; | |
212 unsigned int convert_id_size; | |
213 int convert_stride; | |
214 void (* convert_start) (void * id, const mpeg2_fbuf_t * fbuf, | |
215 const mpeg2_picture_t * picture, | |
216 const mpeg2_gop_t * gop); | |
1 | 217 |
9852 | 218 uint8_t * buf_start; |
219 uint8_t * buf_end; | |
220 | |
221 int16_t display_offset_x, display_offset_y; | |
12932 | 222 |
223 int copy_matrix; | |
224 int8_t q_scale_type, scaled[4]; | |
225 uint8_t quantizer_matrix[4][64]; | |
226 uint8_t new_quantizer_matrix[4][64]; | |
13112 | 227 |
228 /* for MPlayer: */ | |
229 unsigned char *pending_buffer; | |
230 int pending_length; | |
9852 | 231 }; |
232 | |
233 typedef struct { | |
234 #ifdef ARCH_PPC | |
235 uint8_t regv[12*16]; | |
236 #endif | |
237 int dummy; | |
238 } cpu_state_t; | |
1 | 239 |
9852 | 240 /* cpu_accel.c */ |
241 uint32_t mpeg2_detect_accel (void); | |
1 | 242 |
9852 | 243 /* cpu_state.c */ |
244 void mpeg2_cpu_state_init (uint32_t accel); | |
1 | 245 |
9852 | 246 /* decode.c */ |
12932 | 247 mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec); |
248 mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec); | |
9852 | 249 |
250 /* header.c */ | |
251 void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec); | |
12932 | 252 void mpeg2_reset_info (mpeg2_info_t * info); |
9852 | 253 int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec); |
254 int mpeg2_header_gop (mpeg2dec_t * mpeg2dec); | |
12932 | 255 mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec); |
9852 | 256 int mpeg2_header_picture (mpeg2dec_t * mpeg2dec); |
257 int mpeg2_header_extension (mpeg2dec_t * mpeg2dec); | |
258 int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec); | |
259 void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec); | |
12932 | 260 void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec); |
261 void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels); | |
262 mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec); | |
263 mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec); | |
264 void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type); | |
1 | 265 |
36 | 266 /* idct.c */ |
9852 | 267 void mpeg2_idct_init (uint32_t accel); |
1 | 268 |
36 | 269 /* idct_mmx.c */ |
9852 | 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); | |
277 | |
278 /* idct_altivec.c */ | |
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); | |
283 | |
284 /* idct_alpha.c */ | |
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); | |
12932 | 291 void mpeg2_idct_alpha_init (void); |
1 | 292 |
36 | 293 /* motion_comp.c */ |
9852 | 294 void mpeg2_mc_init (uint32_t accel); |
295 | |
296 typedef struct { | |
297 mpeg2_mc_fct * put [8]; | |
298 mpeg2_mc_fct * avg [8]; | |
299 } mpeg2_mc_t; | |
1 | 300 |
9852 | 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} \ | |
1 | 306 }; |
307 | |
9852 | 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; | |
12932 | 314 extern mpeg2_mc_t mpeg2_mc_vis; |