[svn] / branches / dev-api-3 / xvidcore / src / bitstream / bitstream.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-3/xvidcore/src/bitstream/bitstream.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 631 - (view) (download)

1 : Isibaar 3 /******************************************************************************
2 :     * *
3 :     * This file is part of XviD, a free MPEG-4 video encoder/decoder *
4 :     * *
5 :     * XviD is an implementation of a part of one or more MPEG-4 Video tools *
6 :     * as specified in ISO/IEC 14496-2 standard. Those intending to use this *
7 :     * software module in hardware or software products are advised that its *
8 :     * use may infringe existing patents or copyrights, and any such use *
9 :     * would be at such party's own risk. The original developer of this *
10 :     * software module and his/her company, and subsequent editors and their *
11 :     * companies, will have no liability for use of this software or *
12 :     * modifications or derivatives thereof. *
13 :     * *
14 :     * XviD is free software; you can redistribute it and/or modify it *
15 :     * under the terms of the GNU General Public License as published by *
16 :     * the Free Software Foundation; either version 2 of the License, or *
17 :     * (at your option) any later version. *
18 :     * *
19 :     * XviD is distributed in the hope that it will be useful, but *
20 :     * WITHOUT ANY WARRANTY; without even the implied warranty of *
21 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22 :     * GNU General Public License for more details. *
23 :     * *
24 :     * You should have received a copy of the GNU General Public License *
25 :     * along with this program; if not, write to the Free Software *
26 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
27 :     * *
28 :     ******************************************************************************/
29 :    
30 :     /******************************************************************************
31 :     * *
32 :     * bitstream.c *
33 :     * *
34 :     * Copyright (C) 2001 - Peter Ross <pross@cs.rmit.edu.au> *
35 :     * *
36 :     * For more information visit the XviD homepage: http://www.xvid.org *
37 :     * *
38 :     ******************************************************************************/
39 :    
40 :     /******************************************************************************
41 : chenm001 223 * *
42 : Isibaar 3 * Revision history: *
43 : chenm001 223 * *
44 : chl 619 * 28.10.2002 GMC support - gruel *
45 : Isibaar 579 * 04.10.2002 qpel support - Isibaar *
46 : chenm001 294 * 11.07.2002 add VOP width & height return to dec when dec->width *
47 :     * or dec->height is 0 (for use in examples/ex1.c) *
48 :     * MinChen <chenm001@163.com> *
49 :     * 22.05.2002 bs_put_matrix fix *
50 : suxen_drol 229 * 20.05.2002 added BitstreamWriteUserData *
51 : Isibaar 579 * 19.06.2002 Fix a little bug in use custom quant matrix *
52 :     * MinChen <chenm001@163.com> *
53 :     * 08.05.2002 add low_delay support for B_VOP decode *
54 :     * MinChen <chenm001@163.com> *
55 : suxen_drol 164 * 06.05.2002 low_delay *
56 : suxen_drol 163 * 06.05.2002 fixed fincr/fbase error *
57 :     * 01.05.2002 added BVOP support to BitstreamWriteVopHeader *
58 : chenm001 124 * 15.04.2002 rewrite log2bin use asm386 By MinChen <chenm001@163.com> *
59 : chenm001 223 * 26.03.2002 interlacing support *
60 :     * 03.03.2002 qmatrix writing *
61 :     * 03.03.2002 merged BITREADER and BITWRITER *
62 : Isibaar 579 * 30.02.2002 intra_dc_threshold support *
63 :     * 04.12.2001 support for additional headers *
64 :     * 16.12.2001 inital version *
65 :     * *
66 : Isibaar 3 ******************************************************************************/
67 :    
68 :    
69 :     #include "bitstream.h"
70 :     #include "zigzag.h"
71 : Isibaar 4 #include "../quant/quant_matrix.h"
72 : chl 619 #include "mbcoding.h"
73 : Isibaar 3
74 : chenm001 124
75 : edgomez 195 static uint32_t __inline
76 :     log2bin(uint32_t value)
77 : Isibaar 3 {
78 : chenm001 124 /* Changed by Chenm001 */
79 :     #ifndef WIN32
80 : Isibaar 3 int n = 0;
81 : edgomez 195
82 :     while (value) {
83 : Isibaar 3 value >>= 1;
84 :     n++;
85 :     }
86 :     return n;
87 : chenm001 124 #else
88 : edgomez 195 __asm {
89 : suxen_drol 206 bsr eax, value
90 :     inc eax
91 :     }
92 : chenm001 124 #endif
93 : Isibaar 3 }
94 :    
95 :    
96 : edgomez 195 static const uint32_t intra_dc_threshold_table[] = {
97 :     32, /* never use */
98 : Isibaar 3 13,
99 :     15,
100 :     17,
101 :     19,
102 :     21,
103 :     23,
104 :     1,
105 :     };
106 :    
107 :    
108 : edgomez 195 void
109 :     bs_get_matrix(Bitstream * bs,
110 :     uint8_t * matrix)
111 :     {
112 :     int i = 0;
113 :     int last, value = 0;
114 : Isibaar 4
115 : edgomez 195 do {
116 :     last = value;
117 :     value = BitstreamGetBits(bs, 8);
118 :     matrix[scan_tables[0][i++]] = value;
119 :     }
120 :     while (value != 0 && i < 64);
121 : chenm001 223 i--; // fix little bug at coeff not full
122 : edgomez 195
123 :     while (i < 64) {
124 :     matrix[scan_tables[0][i++]] = last;
125 :     }
126 :     }
127 :    
128 : suxen_drol 248
129 :    
130 :     // for PVOP addbits == fcode - 1
131 :     // for BVOP addbits == max(fcode,bcode) - 1
132 :     // returns mbpos
133 :     int
134 : suxen_drol 631 read_video_packet_header(Bitstream *bs,
135 :     DECODER * dec,
136 :     const int addbits,
137 :     int * quant,
138 :     int * fcode_forward,
139 :     int * fcode_backward,
140 :     int * intra_dc_threshold)
141 : suxen_drol 248 {
142 : suxen_drol 631 int startcode_bits = NUMBITS_VP_RESYNC_MARKER + addbits;
143 :     int mbnum_bits = log2bin(dec->mb_width * dec->mb_height - 1);
144 : suxen_drol 248 int mbnum;
145 : suxen_drol 631 int hec = 0;
146 : suxen_drol 248
147 :     BitstreamSkip(bs, BitstreamNumBitsToByteAlign(bs));
148 : suxen_drol 631 BitstreamSkip(bs, startcode_bits);
149 : suxen_drol 248
150 : suxen_drol 252 DPRINTF(DPRINTF_STARTCODE, "<video_packet_header>");
151 :    
152 : suxen_drol 631 if (dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR)
153 :     {
154 :     hec = BitstreamGetBit(bs); /* header_extension_code */
155 :     if (hec && !(dec->sprite_enable == SPRITE_STATIC /* && current_coding_type = I_VOP */))
156 :     {
157 :     BitstreamSkip(bs, 13); /* vop_width */
158 :     READ_MARKER();
159 :     BitstreamSkip(bs, 13); /* vop_height */
160 :     READ_MARKER();
161 :     BitstreamSkip(bs, 13); /* vop_horizontal_mc_spatial_ref */
162 :     READ_MARKER();
163 :     BitstreamSkip(bs, 13); /* vop_vertical_mc_spatial_ref */
164 :     READ_MARKER();
165 :     }
166 :     }
167 : suxen_drol 248
168 : suxen_drol 631 mbnum = BitstreamGetBits(bs, mbnum_bits); /* macroblock_number */
169 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "mbnum %i", mbnum);
170 : suxen_drol 248
171 : suxen_drol 631 if (dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY)
172 :     {
173 :     *quant = BitstreamGetBits(bs, 5); /* quant_scale */
174 :     DPRINTF(DPRINTF_HEADER, "quant %i", *quant);
175 :     }
176 : suxen_drol 248
177 : suxen_drol 631 if (dec->shape == VIDOBJLAY_SHAPE_RECTANGULAR)
178 :     hec = BitstreamGetBit(bs); /* header_extension_code */
179 :    
180 :    
181 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "header_extension_code %i", hec);
182 : suxen_drol 631 if (hec)
183 :     {
184 :     int time_base;
185 :     int time_increment;
186 :     int coding_type;
187 : suxen_drol 248
188 : suxen_drol 631 for (time_base=0; BitstreamGetBit(bs)!=0; time_base++); /* modulo_time_base */
189 :     READ_MARKER();
190 :     if (dec->time_inc_bits)
191 :     time_increment = (BitstreamGetBits(bs, dec->time_inc_bits)); /* vop_time_increment */
192 :     READ_MARKER();
193 :     DPRINTF(DPRINTF_HEADER,"time %i:%i", time_base, time_increment);
194 :    
195 :     coding_type = BitstreamGetBits(bs, 2);
196 :     DPRINTF(DPRINTF_HEADER,"coding_type %i", coding_type);
197 :    
198 :     if (dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR)
199 :     {
200 :     BitstreamSkip(bs, 1); /* change_conv_ratio_disable */
201 :     if (coding_type != I_VOP)
202 :     BitstreamSkip(bs, 1); /* vop_shape_coding_type */
203 :     }
204 :    
205 :     if (dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY)
206 :     {
207 :     *intra_dc_threshold = intra_dc_threshold_table[BitstreamGetBits(bs, 3)];
208 :    
209 :     if (dec->sprite_enable == SPRITE_GMC && coding_type == S_VOP &&
210 :     dec->sprite_warping_points > 0)
211 :     {
212 :     // TODO: sprite trajectory
213 :     }
214 :     if (dec->reduced_resolution_enable &&
215 :     dec->shape == VIDOBJLAY_SHAPE_RECTANGULAR &&
216 :     (coding_type == P_VOP || coding_type == I_VOP))
217 :     {
218 :     BitstreamSkip(bs, 1); /* vop_reduced_resolution */
219 :     }
220 :    
221 :     if (coding_type != I_VOP && fcode_forward)
222 :     {
223 :     *fcode_forward = BitstreamGetBits(bs, 3);
224 :     DPRINTF(DPRINTF_HEADER,"fcode_forward %i", *fcode_forward);
225 :     }
226 :    
227 :     if (coding_type == B_VOP && fcode_backward)
228 :     {
229 :     *fcode_backward = BitstreamGetBits(bs, 3);
230 :     DPRINTF(DPRINTF_HEADER,"fcode_backward %i", fcode_backward);
231 :     }
232 :     }
233 :    
234 :     }
235 :    
236 :     if (dec->newpred_enable)
237 :     {
238 :     int vop_id;
239 :     int vop_id_for_prediction;
240 :    
241 :     vop_id = BitstreamGetBits(bs, MIN(dec->time_inc_bits + 3, 15));
242 :     DPRINTF(DPRINTF_HEADER, "vop_id %i", vop_id);
243 :     if (BitstreamGetBit(bs)) /* vop_id_for_prediction_indication */
244 :     {
245 :     vop_id_for_prediction = BitstreamGetBits(bs, MIN(dec->time_inc_bits + 3, 15));
246 :     DPRINTF(DPRINTF_HEADER, "vop_id_for_prediction %i", vop_id_for_prediction);
247 :     }
248 :     READ_MARKER();
249 :     }
250 :    
251 : suxen_drol 248 return mbnum;
252 :     }
253 :    
254 :    
255 :    
256 : Isibaar 3 /*
257 :     decode headers
258 :     returns coding_type, or -1 if error
259 :     */
260 :    
261 : suxen_drol 252 #define VIDOBJ_START_CODE_MASK 0x0000001f
262 :     #define VIDOBJLAY_START_CODE_MASK 0x0000000f
263 :    
264 : edgomez 195 int
265 :     BitstreamReadHeaders(Bitstream * bs,
266 :     DECODER * dec,
267 :     uint32_t * rounding,
268 : suxen_drol 631 uint32_t * reduced_resolution,
269 : edgomez 195 uint32_t * quant,
270 :     uint32_t * fcode_forward,
271 :     uint32_t * fcode_backward,
272 : suxen_drol 631 uint32_t * intra_dc_threshold,
273 :     VECTOR * gmc_mv)
274 : Isibaar 3 {
275 :     uint32_t vol_ver_id;
276 :     uint32_t coding_type;
277 :     uint32_t start_code;
278 : edgomez 195 uint32_t time_incr = 0;
279 :     int32_t time_increment;
280 : suxen_drol 631 int resize = 0;
281 : chenm001 156
282 : edgomez 195 do {
283 : suxen_drol 631
284 : Isibaar 3 BitstreamByteAlign(bs);
285 :     start_code = BitstreamShowBits(bs, 32);
286 :    
287 : edgomez 195 if (start_code == VISOBJSEQ_START_CODE) {
288 : suxen_drol 252
289 :     int profile;
290 :    
291 :     DPRINTF(DPRINTF_STARTCODE, "<visual_object_sequence>");
292 :    
293 : edgomez 195 BitstreamSkip(bs, 32); // visual_object_sequence_start_code
294 : suxen_drol 252 profile = BitstreamGetBits(bs, 8); // profile_and_level_indication
295 :    
296 :     DPRINTF(DPRINTF_HEADER, "profile_and_level_indication %i", profile);
297 :    
298 : edgomez 195 } else if (start_code == VISOBJSEQ_STOP_CODE) {
299 : suxen_drol 252
300 : edgomez 195 BitstreamSkip(bs, 32); // visual_object_sequence_stop_code
301 : suxen_drol 252
302 :     DPRINTF(DPRINTF_STARTCODE, "</visual_object_sequence>");
303 :    
304 : edgomez 195 } else if (start_code == VISOBJ_START_CODE) {
305 : suxen_drol 252
306 :     DPRINTF(DPRINTF_STARTCODE, "<visual_object>");
307 :    
308 : edgomez 195 BitstreamSkip(bs, 32); // visual_object_start_code
309 :     if (BitstreamGetBit(bs)) // is_visual_object_identified
310 : Isibaar 3 {
311 : edgomez 195 vol_ver_id = BitstreamGetBits(bs, 4); // visual_object_ver_id
312 : suxen_drol 252 DPRINTF(DPRINTF_HEADER,"ver_id %i", vol_ver_id);
313 : edgomez 195 BitstreamSkip(bs, 3); // visual_object_priority
314 :     } else {
315 : Isibaar 3 vol_ver_id = 1;
316 :     }
317 :    
318 :     if (BitstreamShowBits(bs, 4) != VISOBJ_TYPE_VIDEO) // visual_object_type
319 :     {
320 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "visual_object_type != video");
321 : Isibaar 3 return -1;
322 :     }
323 :     BitstreamSkip(bs, 4);
324 :    
325 :     // video_signal_type
326 :    
327 : edgomez 195 if (BitstreamGetBit(bs)) // video_signal_type
328 : Isibaar 3 {
329 : suxen_drol 252 DPRINTF(DPRINTF_HEADER,"+ video_signal_type");
330 : edgomez 195 BitstreamSkip(bs, 3); // video_format
331 :     BitstreamSkip(bs, 1); // video_range
332 :     if (BitstreamGetBit(bs)) // color_description
333 : Isibaar 3 {
334 : suxen_drol 252 DPRINTF(DPRINTF_HEADER,"+ color_description");
335 : edgomez 195 BitstreamSkip(bs, 8); // color_primaries
336 :     BitstreamSkip(bs, 8); // transfer_characteristics
337 :     BitstreamSkip(bs, 8); // matrix_coefficients
338 : Isibaar 3 }
339 :     }
340 : suxen_drol 252 } else if ((start_code & ~VIDOBJ_START_CODE_MASK) == VIDOBJ_START_CODE) {
341 :    
342 :     DPRINTF(DPRINTF_STARTCODE, "<video_object>");
343 :     DPRINTF(DPRINTF_HEADER, "vo id %i", start_code & VIDOBJ_START_CODE_MASK);
344 :    
345 : edgomez 195 BitstreamSkip(bs, 32); // video_object_start_code
346 : suxen_drol 252
347 :     } else if ((start_code & ~VIDOBJLAY_START_CODE_MASK) == VIDOBJLAY_START_CODE) {
348 :    
349 :     DPRINTF(DPRINTF_STARTCODE, "<video_object_layer>");
350 :     DPRINTF(DPRINTF_HEADER, "vol id %i", start_code & VIDOBJLAY_START_CODE_MASK);
351 :    
352 : edgomez 195 BitstreamSkip(bs, 32); // video_object_layer_start_code
353 : Isibaar 3
354 : edgomez 195 BitstreamSkip(bs, 1); // random_accessible_vol
355 : Isibaar 3
356 :     // video_object_type_indication
357 : suxen_drol 631 if (BitstreamShowBits(bs, 8) != VIDOBJLAY_TYPE_SIMPLE &&
358 :     BitstreamShowBits(bs, 8) != VIDOBJLAY_TYPE_CORE &&
359 :     BitstreamShowBits(bs, 8) != VIDOBJLAY_TYPE_MAIN &&
360 :     BitstreamShowBits(bs, 8) != VIDOBJLAY_TYPE_ACE &&
361 :     BitstreamShowBits(bs, 8) != VIDOBJLAY_TYPE_ART_SIMPLE &&
362 :     BitstreamShowBits(bs, 8) != 0) // BUGGY DIVX
363 : Isibaar 3 {
364 : suxen_drol 252 DPRINTF(DPRINTF_ERROR,"video_object_type_indication %i not supported ",
365 :     BitstreamShowBits(bs, 8));
366 : Isibaar 3 return -1;
367 :     }
368 :     BitstreamSkip(bs, 8);
369 :    
370 :    
371 : edgomez 195 if (BitstreamGetBit(bs)) // is_object_layer_identifier
372 : Isibaar 3 {
373 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "+ is_object_layer_identifier");
374 : edgomez 195 vol_ver_id = BitstreamGetBits(bs, 4); // video_object_layer_verid
375 : suxen_drol 252 DPRINTF(DPRINTF_HEADER,"ver_id %i", vol_ver_id);
376 : edgomez 195 BitstreamSkip(bs, 3); // video_object_layer_priority
377 :     } else {
378 : Isibaar 3 vol_ver_id = 1;
379 :     }
380 :    
381 : suxen_drol 631 dec->aspect_ratio = BitstreamGetBits(bs, 4);
382 :    
383 :     if (dec->aspect_ratio == VIDOBJLAY_AR_EXTPAR) // aspect_ratio_info
384 : Isibaar 3 {
385 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "+ aspect_ratio_info");
386 : suxen_drol 631 dec->par_width = BitstreamGetBits(bs, 8); // par_width
387 :     dec->par_height = BitstreamGetBits(bs, 8); // par_height
388 : Isibaar 3 }
389 :    
390 : edgomez 195 if (BitstreamGetBit(bs)) // vol_control_parameters
391 : Isibaar 3 {
392 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "+ vol_control_parameters");
393 : edgomez 195 BitstreamSkip(bs, 2); // chroma_format
394 :     dec->low_delay = BitstreamGetBit(bs); // low_delay
395 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "low_delay %i", dec->low_delay);
396 : edgomez 195 if (BitstreamGetBit(bs)) // vbv_parameters
397 : Isibaar 3 {
398 : suxen_drol 252 DPRINTF(DPRINTF_HEADER,"+ vbv_parameters");
399 : edgomez 195 BitstreamSkip(bs, 15); // first_half_bitrate
400 : Isibaar 3 READ_MARKER();
401 : edgomez 195 BitstreamSkip(bs, 15); // latter_half_bitrate
402 : Isibaar 3 READ_MARKER();
403 : edgomez 195 BitstreamSkip(bs, 15); // first_half_vbv_buffer_size
404 : Isibaar 3 READ_MARKER();
405 : edgomez 195 BitstreamSkip(bs, 3); // latter_half_vbv_buffer_size
406 :     BitstreamSkip(bs, 11); // first_half_vbv_occupancy
407 : Isibaar 3 READ_MARKER();
408 : edgomez 195 BitstreamSkip(bs, 15); // latter_half_vbv_occupancy
409 : Isibaar 3 READ_MARKER();
410 :     }
411 :     }
412 :    
413 :     dec->shape = BitstreamGetBits(bs, 2); // video_object_layer_shape
414 : suxen_drol 631
415 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "shape %i", dec->shape);
416 : suxen_drol 631 if (dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR)
417 :     {
418 :     DPRINTF(DPRINTF_ERROR,"non-rectangular shapes are not supported");
419 :     }
420 : edgomez 195
421 :     if (dec->shape == VIDOBJLAY_SHAPE_GRAYSCALE && vol_ver_id != 1) {
422 :     BitstreamSkip(bs, 4); // video_object_layer_shape_extension
423 : Isibaar 3 }
424 :    
425 :     READ_MARKER();
426 :    
427 : chenm001 156 // *************************** for decode B-frame time ***********************
428 : suxen_drol 631 dec->time_inc_resolution = BitstreamGetBits(bs, 16); // vop_time_increment_resolution
429 :     DPRINTF(DPRINTF_HEADER,"vop_time_increment_resolution %i", dec->time_inc_resolution);
430 : suxen_drol 252
431 : suxen_drol 631 // dec->time_inc_resolution--;
432 : suxen_drol 252
433 : suxen_drol 631 if (dec->time_inc_resolution > 0) {
434 :     dec->time_inc_bits = log2bin(dec->time_inc_resolution-1);
435 : edgomez 195 } else {
436 : Isibaar 3 // dec->time_inc_bits = 0;
437 :     // for "old" xvid compatibility, set time_inc_bits = 1
438 :     dec->time_inc_bits = 1;
439 :     }
440 :    
441 :     READ_MARKER();
442 :    
443 : edgomez 195 if (BitstreamGetBit(bs)) // fixed_vop_rate
444 : Isibaar 3 {
445 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "+ fixed_vop_rate");
446 : Isibaar 3 BitstreamSkip(bs, dec->time_inc_bits); // fixed_vop_time_increment
447 :     }
448 :    
449 : edgomez 195 if (dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY) {
450 : Isibaar 3
451 : edgomez 195 if (dec->shape == VIDOBJLAY_SHAPE_RECTANGULAR) {
452 : Isibaar 3 uint32_t width, height;
453 :    
454 :     READ_MARKER();
455 : edgomez 195 width = BitstreamGetBits(bs, 13); // video_object_layer_width
456 : Isibaar 3 READ_MARKER();
457 : edgomez 195 height = BitstreamGetBits(bs, 13); // video_object_layer_height
458 : Isibaar 3 READ_MARKER();
459 :    
460 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "width %i", width);
461 :     DPRINTF(DPRINTF_HEADER, "height %i", height);
462 :    
463 : suxen_drol 631 if (dec->width != width || dec->height != height)
464 :     {
465 :     if (dec->fixed_dimensions)
466 :     {
467 :     DPRINTF(DPRINTF_ERROR, "XVID_DEC_PARAM width/height does not match bitstream");
468 :     return -1;
469 :     }
470 :     resize = 1;
471 : chenm001 294 dec->width = width;
472 :     dec->height = height;
473 : Isibaar 3 }
474 :     }
475 : h 69
476 : suxen_drol 252 dec->interlacing = BitstreamGetBit(bs);
477 : suxen_drol 631 DPRINTF(DPRINTF_HEADER, "interlacing %i", dec->interlacing);
478 : Isibaar 3
479 : edgomez 195 if (!BitstreamGetBit(bs)) // obmc_disable
480 : Isibaar 3 {
481 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "obmc_disabled==false not supported");
482 : Isibaar 3 // TODO
483 :     // fucking divx4.02 has this enabled
484 :     }
485 :    
486 : suxen_drol 631 dec->sprite_enable = BitstreamGetBits(bs, (vol_ver_id == 1 ? 1 : 2)); // sprite_enable
487 :    
488 :     if (dec->sprite_enable == SPRITE_STATIC || dec->sprite_enable == SPRITE_GMC)
489 : Isibaar 3 {
490 : suxen_drol 631 int low_latency_sprite_enable;
491 :    
492 :     if (dec->sprite_enable != SPRITE_GMC)
493 :     {
494 :     int sprite_width;
495 :     int sprite_height;
496 :     int sprite_left_coord;
497 :     int sprite_top_coord;
498 :     sprite_width = BitstreamGetBits(bs, 13); // sprite_width
499 :     READ_MARKER();
500 :     sprite_height = BitstreamGetBits(bs, 13); // sprite_height
501 :     READ_MARKER();
502 :     sprite_left_coord = BitstreamGetBits(bs, 13); // sprite_left_coordinate
503 :     READ_MARKER();
504 :     sprite_top_coord = BitstreamGetBits(bs, 13); // sprite_top_coordinate
505 :     READ_MARKER();
506 :     }
507 :     dec->sprite_warping_points = BitstreamGetBits(bs, 6); // no_of_sprite_warping_points
508 :     dec->sprite_warping_accuracy = BitstreamGetBits(bs, 2); // sprite_warping_accuracy
509 :     dec->sprite_brightness_change = BitstreamGetBits(bs, 1); // brightness_change
510 :     if (dec->sprite_enable != SPRITE_GMC)
511 :     {
512 :     low_latency_sprite_enable = BitstreamGetBits(bs, 1); // low_latency_sprite_enable
513 :     }
514 : Isibaar 3 }
515 : edgomez 195
516 :     if (vol_ver_id != 1 &&
517 :     dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR) {
518 :     BitstreamSkip(bs, 1); // sadct_disable
519 : Isibaar 3 }
520 :    
521 : edgomez 195 if (BitstreamGetBit(bs)) // not_8_bit
522 : Isibaar 3 {
523 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "not_8_bit==true (ignored)");
524 : Isibaar 3 dec->quant_bits = BitstreamGetBits(bs, 4); // quant_precision
525 : edgomez 195 BitstreamSkip(bs, 4); // bits_per_pixel
526 :     } else {
527 : Isibaar 3 dec->quant_bits = 5;
528 :     }
529 :    
530 : edgomez 195 if (dec->shape == VIDOBJLAY_SHAPE_GRAYSCALE) {
531 :     BitstreamSkip(bs, 1); // no_gray_quant_update
532 :     BitstreamSkip(bs, 1); // composition_method
533 :     BitstreamSkip(bs, 1); // linear_composition
534 : Isibaar 3 }
535 :    
536 : edgomez 195 dec->quant_type = BitstreamGetBit(bs); // quant_type
537 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "quant_type %i", dec->quant_type);
538 : Isibaar 3
539 : edgomez 195 if (dec->quant_type) {
540 :     if (BitstreamGetBit(bs)) // load_intra_quant_mat
541 : Isibaar 3 {
542 : Isibaar 20 uint8_t matrix[64];
543 : edgomez 195
544 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "load_intra_quant_mat");
545 :    
546 : Isibaar 4 bs_get_matrix(bs, matrix);
547 :     set_intra_matrix(matrix);
548 : edgomez 195 } else
549 : Isibaar 20 set_intra_matrix(get_default_intra_matrix());
550 : Isibaar 4
551 : edgomez 195 if (BitstreamGetBit(bs)) // load_inter_quant_mat
552 : Isibaar 3 {
553 : edgomez 195 uint8_t matrix[64];
554 : suxen_drol 252
555 :     DPRINTF(DPRINTF_HEADER, "load_inter_quant_mat");
556 : edgomez 195
557 : Isibaar 4 bs_get_matrix(bs, matrix);
558 :     set_inter_matrix(matrix);
559 : edgomez 195 } else
560 : Isibaar 20 set_inter_matrix(get_default_inter_matrix());
561 : Isibaar 3
562 : edgomez 195 if (dec->shape == VIDOBJLAY_SHAPE_GRAYSCALE) {
563 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "greyscale matrix not supported");
564 : Isibaar 3 return -1;
565 :     }
566 : Isibaar 4
567 : Isibaar 3 }
568 :    
569 : edgomez 195
570 :     if (vol_ver_id != 1) {
571 : Isibaar 333 dec->quarterpel = BitstreamGetBit(bs); // quarter_sample
572 : suxen_drol 631 DPRINTF(DPRINTF_HEADER,"quarterpel %i", dec->quarterpel);
573 : Isibaar 3 }
574 : Isibaar 333 else
575 :     dec->quarterpel = 0;
576 :    
577 : Isibaar 3
578 : edgomez 195 if (!BitstreamGetBit(bs)) // complexity_estimation_disable
579 : Isibaar 3 {
580 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "complexity_estimation not supported");
581 : Isibaar 3 return -1;
582 :     }
583 :    
584 : suxen_drol 252 BitstreamSkip(bs, 1); // resync_marker_disable
585 : Isibaar 3
586 : edgomez 195 if (BitstreamGetBit(bs)) // data_partitioned
587 : Isibaar 3 {
588 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "data_partitioned not supported");
589 : edgomez 195 BitstreamSkip(bs, 1); // reversible_vlc
590 : Isibaar 3 }
591 :    
592 : edgomez 195 if (vol_ver_id != 1) {
593 : suxen_drol 631 dec->newpred_enable = BitstreamGetBit(bs);
594 :     if (dec->newpred_enable) // newpred_enable
595 : Isibaar 3 {
596 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "+ newpred_enable");
597 : edgomez 195 BitstreamSkip(bs, 2); // requested_upstream_message_type
598 :     BitstreamSkip(bs, 1); // newpred_segment_type
599 : Isibaar 3 }
600 : suxen_drol 631 dec->reduced_resolution_enable = BitstreamGetBit(bs);
601 :     if (dec->reduced_resolution_enable) // reduced_resolution_vop_enable
602 : Isibaar 3 {
603 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "reduced_resolution_vop not supported");
604 : suxen_drol 631 //return -1;
605 : Isibaar 3 }
606 :     }
607 : suxen_drol 631 else
608 :     {
609 :     dec->newpred_enable = 0;
610 :     dec->reduced_resolution_enable = 0;
611 :     }
612 : edgomez 195
613 :     if ((dec->scalability = BitstreamGetBit(bs))) // scalability
614 : Isibaar 3 {
615 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "scalability not supported");
616 : Isibaar 3 return -1;
617 :     }
618 : edgomez 195 } else // dec->shape == BINARY_ONLY
619 : Isibaar 3 {
620 : edgomez 195 if (vol_ver_id != 1) {
621 : Isibaar 3 if (BitstreamGetBit(bs)) // scalability
622 :     {
623 : suxen_drol 252 DPRINTF(DPRINTF_ERROR, "scalability not supported");
624 : Isibaar 3 return -1;
625 :     }
626 :     }
627 : edgomez 195 BitstreamSkip(bs, 1); // resync_marker_disable
628 : Isibaar 3
629 :     }
630 :    
631 : suxen_drol 631 return (resize ? -3 : -2 ); /* VOL */
632 :    
633 : edgomez 195 } else if (start_code == GRPOFVOP_START_CODE) {
634 : suxen_drol 252
635 :     DPRINTF(DPRINTF_STARTCODE, "<group_of_vop>");
636 :    
637 : Isibaar 3 BitstreamSkip(bs, 32);
638 :     {
639 :     int hours, minutes, seconds;
640 : edgomez 195
641 : Isibaar 3 hours = BitstreamGetBits(bs, 5);
642 :     minutes = BitstreamGetBits(bs, 6);
643 :     READ_MARKER();
644 :     seconds = BitstreamGetBits(bs, 6);
645 : suxen_drol 252
646 :     DPRINTF(DPRINTF_HEADER, "time %ih%im%is", hours);
647 : Isibaar 3 }
648 : edgomez 195 BitstreamSkip(bs, 1); // closed_gov
649 :     BitstreamSkip(bs, 1); // broken_link
650 : suxen_drol 252
651 : edgomez 195 } else if (start_code == VOP_START_CODE) {
652 : suxen_drol 252
653 :     DPRINTF(DPRINTF_STARTCODE, "<vop>");
654 :    
655 : edgomez 195 BitstreamSkip(bs, 32); // vop_start_code
656 : Isibaar 3
657 : edgomez 195 coding_type = BitstreamGetBits(bs, 2); // vop_coding_type
658 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "coding_type %i", coding_type);
659 : Isibaar 3
660 : chenm001 156 // *************************** for decode B-frame time ***********************
661 : edgomez 195 while (BitstreamGetBit(bs) != 0) // time_base
662 : chenm001 156 time_incr++;
663 : edgomez 195
664 : Isibaar 3 READ_MARKER();
665 : edgomez 195
666 :     if (dec->time_inc_bits) {
667 : chenm001 156 time_increment = (BitstreamGetBits(bs, dec->time_inc_bits)); // vop_time_increment
668 : Isibaar 3 }
669 : suxen_drol 240
670 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "time_base %i", time_incr);
671 :     DPRINTF(DPRINTF_HEADER, "time_increment %i", time_increment);
672 :    
673 :     DPRINTF(DPRINTF_TIMECODE, "%c %i:%i",
674 : suxen_drol 631 coding_type == I_VOP ? 'I' : coding_type == P_VOP ? 'P' : coding_type == B_VOP ? 'B' : 'S',
675 : suxen_drol 240 time_incr, time_increment);
676 :    
677 : edgomez 195 if (coding_type != B_VOP) {
678 :     dec->last_time_base = dec->time_base;
679 : chenm001 156 dec->time_base += time_incr;
680 : chl 316 dec->time = time_increment;
681 :    
682 : suxen_drol 631 /* dec->time_base * dec->time_inc_resolution +
683 : edgomez 195 time_increment;
684 : chl 316 */ dec->time_pp = (uint32_t)
685 : suxen_drol 631 (dec->time_inc_resolution + dec->time - dec->last_non_b_time)%dec->time_inc_resolution;
686 : edgomez 195 dec->last_non_b_time = dec->time;
687 :     } else {
688 : chl 316 dec->time = time_increment;
689 :     /*
690 : edgomez 195 (dec->last_time_base +
691 : suxen_drol 631 time_incr) * dec->time_inc_resolution + time_increment;
692 : chl 316 */
693 : chl 313 dec->time_bp = (uint32_t)
694 : suxen_drol 631 (dec->time_inc_resolution + dec->last_non_b_time - dec->time)%dec->time_inc_resolution;
695 : chenm001 156 }
696 : Isibaar 3
697 :     READ_MARKER();
698 :    
699 : edgomez 195 if (!BitstreamGetBit(bs)) // vop_coded
700 : Isibaar 3 {
701 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "vop_coded==false");
702 : Isibaar 3 return N_VOP;
703 :     }
704 :    
705 : suxen_drol 631 if (dec->newpred_enable)
706 :     {
707 :     int vop_id;
708 :     int vop_id_for_prediction;
709 :    
710 :     vop_id = BitstreamGetBits(bs, MIN(dec->time_inc_bits + 3, 15));
711 :     DPRINTF(DPRINTF_HEADER, "vop_id %i", vop_id);
712 :     if (BitstreamGetBit(bs)) /* vop_id_for_prediction_indication */
713 :     {
714 :     vop_id_for_prediction = BitstreamGetBits(bs, MIN(dec->time_inc_bits + 3, 15));
715 :     DPRINTF(DPRINTF_HEADER, "vop_id_for_prediction %i", vop_id_for_prediction);
716 :     }
717 :     READ_MARKER();
718 :     }
719 : Isibaar 3
720 : suxen_drol 631
721 :    
722 : chenm001 156 // fix a little bug by MinChen <chenm002@163.com>
723 : edgomez 195 if ((dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY) &&
724 : suxen_drol 631 ( (coding_type == P_VOP) || (coding_type == S_VOP && dec->sprite_enable == SPRITE_GMC) ) ) {
725 : Isibaar 3 *rounding = BitstreamGetBit(bs); // rounding_type
726 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "rounding %i", *rounding);
727 : Isibaar 3 }
728 :    
729 : suxen_drol 631 if (dec->reduced_resolution_enable &&
730 :     dec->shape == VIDOBJLAY_SHAPE_RECTANGULAR &&
731 :     (coding_type == P_VOP || coding_type == I_VOP)) {
732 : Isibaar 3
733 : suxen_drol 631 *reduced_resolution = BitstreamGetBit(bs);
734 :     }
735 :     else
736 :     {
737 :     *reduced_resolution = 0;
738 :     }
739 :    
740 : edgomez 195 if (dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR) {
741 : suxen_drol 631 if(!(dec->sprite_enable == SPRITE_STATIC && coding_type == I_VOP)) {
742 : edgomez 195
743 : suxen_drol 631 uint32_t width, height;
744 :     uint32_t horiz_mc_ref, vert_mc_ref;
745 : Isibaar 3
746 : suxen_drol 631 width = BitstreamGetBits(bs, 13);
747 :     READ_MARKER();
748 :     height = BitstreamGetBits(bs, 13);
749 :     READ_MARKER();
750 :     horiz_mc_ref = BitstreamGetBits(bs, 13);
751 :     READ_MARKER();
752 :     vert_mc_ref = BitstreamGetBits(bs, 13);
753 :     READ_MARKER();
754 : Isibaar 3
755 : suxen_drol 631 DPRINTF(DPRINTF_HEADER, "width %i", width);
756 :     DPRINTF(DPRINTF_HEADER, "height %i", height);
757 :     DPRINTF(DPRINTF_HEADER, "horiz_mc_ref %i", horiz_mc_ref);
758 :     DPRINTF(DPRINTF_HEADER, "vert_mc_ref %i", vert_mc_ref);
759 :     }
760 :    
761 : edgomez 195 BitstreamSkip(bs, 1); // change_conv_ratio_disable
762 :     if (BitstreamGetBit(bs)) // vop_constant_alpha
763 : Isibaar 3 {
764 : edgomez 195 BitstreamSkip(bs, 8); // vop_constant_alpha_value
765 : Isibaar 3 }
766 :     }
767 :    
768 : edgomez 195 if (dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY) {
769 : Isibaar 3 // intra_dc_vlc_threshold
770 : edgomez 195 *intra_dc_threshold =
771 :     intra_dc_threshold_table[BitstreamGetBits(bs, 3)];
772 : Isibaar 3
773 : h 543 dec->top_field_first = 0;
774 :     dec->alternate_vertical_scan = 0;
775 :    
776 : edgomez 195 if (dec->interlacing) {
777 : suxen_drol 252 dec->top_field_first = BitstreamGetBit(bs);
778 :     DPRINTF(DPRINTF_HEADER, "interlace top_field_first %i", dec->top_field_first);
779 :     dec->alternate_vertical_scan = BitstreamGetBit(bs);
780 :     DPRINTF(DPRINTF_HEADER, "interlace alternate_vertical_scan %i", dec->alternate_vertical_scan);
781 :    
782 : h 69 }
783 : Isibaar 3 }
784 : edgomez 195
785 : suxen_drol 631 if ((dec->sprite_enable == SPRITE_STATIC || dec->sprite_enable== SPRITE_GMC) && coding_type == S_VOP) {
786 :    
787 :     int i;
788 :    
789 :     for (i = 0 ; i < dec->sprite_warping_points; i++)
790 :     {
791 :     int length;
792 :     int x = 0, y = 0;
793 :    
794 :     /* sprite code borowed from ffmpeg; thx Michael Niedermayer <michaelni@gmx.at> */
795 :     length = bs_get_spritetrajectory(bs);
796 :     if(length){
797 :     x= BitstreamGetBits(bs, length);
798 :     if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
799 :     x = - (x ^ ((1 << length) - 1));
800 :     }
801 :     READ_MARKER();
802 :    
803 :     length = bs_get_spritetrajectory(bs);
804 :     if(length){
805 :     y = BitstreamGetBits(bs, length);
806 :     if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
807 :     y = - (y ^ ((1 << length) - 1));
808 :     }
809 :     READ_MARKER();
810 :    
811 :     gmc_mv[i].x = x;
812 :     gmc_mv[i].y = y;
813 :    
814 :     DPRINTF(DPRINTF_HEADER,"sprite_warping_point[%i] xy=(%i,%i)", i, x, y);
815 :     }
816 :    
817 :     if (dec->sprite_brightness_change)
818 :     {
819 :     // XXX: brightness_change_factor()
820 :     }
821 :     if (dec->sprite_enable == SPRITE_STATIC)
822 :     {
823 :     // XXX: todo
824 :     }
825 :    
826 :     }
827 :    
828 : edgomez 195 if ((*quant = BitstreamGetBits(bs, dec->quant_bits)) < 1) // vop_quant
829 : Isibaar 157 *quant = 1;
830 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "quant %i", *quant);
831 : edgomez 195
832 :     if (coding_type != I_VOP) {
833 :     *fcode_forward = BitstreamGetBits(bs, 3); // fcode_forward
834 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "fcode_forward %i", *fcode_forward);
835 : Isibaar 3 }
836 : edgomez 195
837 :     if (coding_type == B_VOP) {
838 :     *fcode_backward = BitstreamGetBits(bs, 3); // fcode_backward
839 : suxen_drol 252 DPRINTF(DPRINTF_HEADER, "fcode_backward %i", *fcode_backward);
840 : Isibaar 3 }
841 : edgomez 195 if (!dec->scalability) {
842 :     if ((dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR) &&
843 :     (coding_type != I_VOP)) {
844 :     BitstreamSkip(bs, 1); // vop_shape_coding_type
845 : chenm001 156 }
846 :     }
847 : Isibaar 3 return coding_type;
848 : suxen_drol 252
849 : edgomez 195 } else if (start_code == USERDATA_START_CODE) {
850 : suxen_drol 252
851 :     DPRINTF(DPRINTF_STARTCODE, "<user_data>");
852 :    
853 : edgomez 195 BitstreamSkip(bs, 32); // user_data_start_code
854 : suxen_drol 252
855 : edgomez 195 } else // start_code == ?
856 : Isibaar 3 {
857 : edgomez 195 if (BitstreamShowBits(bs, 24) == 0x000001) {
858 : suxen_drol 252 DPRINTF(DPRINTF_STARTCODE, "<unknown: %x>", BitstreamShowBits(bs, 32));
859 : Isibaar 3 }
860 :     BitstreamSkip(bs, 8);
861 :     }
862 :     }
863 :     while ((BitstreamPos(bs) >> 3) < bs->length);
864 :    
865 : suxen_drol 233 //DPRINTF("*** WARNING: no vop_start_code found");
866 : edgomez 195 return -1; /* ignore it */
867 : Isibaar 3 }
868 :    
869 :    
870 :     /* write custom quant matrix */
871 :    
872 : edgomez 195 static void
873 :     bs_put_matrix(Bitstream * bs,
874 :     const int16_t * matrix)
875 : Isibaar 3 {
876 :     int i, j;
877 :     const int last = matrix[scan_tables[0][63]];
878 :    
879 : suxen_drol 233 for (j = 63; j > 0 && matrix[scan_tables[0][j - 1]] == last; j--);
880 : Isibaar 3
881 : edgomez 195 for (i = 0; i <= j; i++) {
882 : Isibaar 3 BitstreamPutBits(bs, matrix[scan_tables[0][i]], 8);
883 :     }
884 :    
885 : edgomez 195 if (j < 63) {
886 : Isibaar 3 BitstreamPutBits(bs, 0, 8);
887 :     }
888 :     }
889 :    
890 :    
891 :     /*
892 :     write vol header
893 :     */
894 : edgomez 195 void
895 :     BitstreamWriteVolHeader(Bitstream * const bs,
896 :     const MBParam * pParam,
897 : chl 619 const FRAMEINFO * const frame)
898 : Isibaar 3 {
899 : chl 619 int vol_ver_id=1;
900 :    
901 :     if ( (pParam->m_quarterpel) || (frame->global_flags & XVID_GMC) )
902 :     vol_ver_id = 2;
903 :    
904 : Isibaar 3 // video object_start_code & vo_id
905 : edgomez 195 BitstreamPad(bs);
906 : Isibaar 3 BitstreamPutBits(bs, VO_START_CODE, 27);
907 : edgomez 195 BitstreamPutBits(bs, 0, 5);
908 : Isibaar 3
909 :     // video_object_layer_start_code & vol_id
910 :     BitstreamPutBits(bs, VOL_START_CODE, 28);
911 :     BitstreamPutBits(bs, 0, 4);
912 :    
913 : edgomez 195 BitstreamPutBit(bs, 0); // random_accessible_vol
914 :     BitstreamPutBits(bs, 0, 8); // video_object_type_indication
915 : Isibaar 579
916 : chl 619 if (vol_ver_id == 1)
917 : Isibaar 579 {
918 :     BitstreamPutBit(bs, 0); // is_object_layer_identified (0=not given)
919 :     }
920 :     else
921 :     {
922 :     BitstreamPutBit(bs, 1); // is_object_layer_identified
923 : chl 619 BitstreamPutBits(bs, vol_ver_id, 4); // vol_ver_id == 2
924 :     BitstreamPutBits(bs, 4, 3); // vol_ver_priority (1==lowest, 7==highest) ??
925 : Isibaar 579 }
926 :    
927 : edgomez 195 BitstreamPutBits(bs, 1, 4); // aspect_ratio_info (1=1:1)
928 : suxen_drol 164
929 : chl 387 BitstreamPutBit(bs, 1); // vol_control_parameters
930 :     BitstreamPutBits(bs, 1, 2); // chroma_format 1="4:2:0"
931 :    
932 : edgomez 195 if (pParam->max_bframes > 0) {
933 :     BitstreamPutBit(bs, 0); // low_delay
934 :     } else
935 : suxen_drol 164 {
936 : chl 386 BitstreamPutBit(bs, 1); // low_delay
937 : suxen_drol 164 }
938 : chl 387 BitstreamPutBit(bs, 0); // vbv_parameters (0=not given)
939 : suxen_drol 164
940 : edgomez 195 BitstreamPutBits(bs, 0, 2); // video_object_layer_shape (0=rectangular)
941 : Isibaar 3
942 :     WRITE_MARKER();
943 : edgomez 195
944 : suxen_drol 631 /* time_inc_resolution; ignored by current decore versions
945 : edgomez 195 eg. 2fps res=2 inc=1
946 :     25fps res=25 inc=1
947 :     29.97fps res=30000 inc=1001
948 :     */
949 : suxen_drol 163 BitstreamPutBits(bs, pParam->fbase, 16);
950 : Isibaar 3
951 :     WRITE_MARKER();
952 :    
953 : suxen_drol 241 BitstreamPutBit(bs, 1); // fixed_vop_rate = 1
954 :     BitstreamPutBits(bs, pParam->fincr, log2bin(pParam->fbase)); // fixed_vop_time_increment
955 : Isibaar 3
956 :     WRITE_MARKER();
957 : edgomez 195 BitstreamPutBits(bs, pParam->width, 13); // width
958 : Isibaar 3 WRITE_MARKER();
959 : edgomez 195 BitstreamPutBits(bs, pParam->height, 13); // height
960 : Isibaar 3 WRITE_MARKER();
961 : edgomez 195
962 :     BitstreamPutBit(bs, frame->global_flags & XVID_INTERLACING); // interlace
963 : Isibaar 3 BitstreamPutBit(bs, 1); // obmc_disable (overlapped block motion compensation)
964 : Isibaar 579
965 : chl 619 if (vol_ver_id != 1)
966 :     { if (frame->global_flags & XVID_GMC)
967 :     { BitstreamPutBits(bs, 2, 2); // sprite_enable=='GMC'
968 :     BitstreamPutBits(bs, 2, 6); // no_of_sprite_warping_points
969 :     BitstreamPutBits(bs, 3, 2); // sprite_warping_accuracy 0==1/2, 1=1/4, 2=1/8, 3=1/16
970 :     BitstreamPutBit(bs, 0); // sprite_brightness_change (not supported)
971 :    
972 :     /* currently we use no_of_sprite_warping_points==2, sprite_warping_accuracy==3
973 :     for DivX5 compatability */
974 :    
975 :     } else
976 :     BitstreamPutBits(bs, 0, 2); // sprite_enable==off
977 : Isibaar 579 }
978 :     else
979 : chl 619 BitstreamPutBit(bs, 0); // sprite_enable==off
980 : Isibaar 579
981 : chl 619 BitstreamPutBit(bs, 0); // not_8_bit
982 : Isibaar 3
983 :     // quant_type 0=h.263 1=mpeg4(quantizer tables)
984 : suxen_drol 136 BitstreamPutBit(bs, pParam->m_quant_type);
985 : edgomez 195
986 :     if (pParam->m_quant_type) {
987 : Isibaar 4 BitstreamPutBit(bs, get_intra_matrix_status()); // load_intra_quant_mat
988 : edgomez 195 if (get_intra_matrix_status()) {
989 : Isibaar 4 bs_put_matrix(bs, get_intra_matrix());
990 : Isibaar 3 }
991 :    
992 : edgomez 195 BitstreamPutBit(bs, get_inter_matrix_status()); // load_inter_quant_mat
993 :     if (get_inter_matrix_status()) {
994 : Isibaar 4 bs_put_matrix(bs, get_inter_matrix());
995 : Isibaar 3 }
996 :    
997 :     }
998 :    
999 : chl 619 if (vol_ver_id != 1) {
1000 :     if (pParam->m_quarterpel)
1001 :     BitstreamPutBit(bs, 1); // quarterpel
1002 :     else
1003 :     BitstreamPutBit(bs, 0); // no quarterpel
1004 : Isibaar 579 }
1005 :    
1006 : Isibaar 3 BitstreamPutBit(bs, 1); // complexity_estimation_disable
1007 :     BitstreamPutBit(bs, 1); // resync_marker_disable
1008 :     BitstreamPutBit(bs, 0); // data_partitioned
1009 : Isibaar 579
1010 : chl 619 if (vol_ver_id != 1)
1011 : Isibaar 579 {
1012 :     BitstreamPutBit(bs, 0); // newpred_enable
1013 :     BitstreamPutBit(bs, 0); // reduced_resolution_vop_enabled
1014 :     }
1015 : chl 619
1016 :     BitstreamPutBit(bs, 0); // scalability
1017 : Isibaar 579
1018 : Isibaar 3 }
1019 :    
1020 :    
1021 :     /*
1022 :     write vop header
1023 :     */
1024 : edgomez 195 void
1025 :     BitstreamWriteVopHeader(Bitstream * const bs,
1026 :     const MBParam * pParam,
1027 : chl 619 const FRAMEINFO * const frame,
1028 : suxen_drol 229 int vop_coded)
1029 : Isibaar 3 {
1030 : suxen_drol 152 uint32_t i;
1031 : chl 387
1032 : edgomez 195 BitstreamPad(bs);
1033 :     BitstreamPutBits(bs, VOP_START_CODE, 32);
1034 : Isibaar 3
1035 : edgomez 195 BitstreamPutBits(bs, frame->coding_type, 2);
1036 : suxen_drol 631 DPRINTF(DPRINTF_HEADER, "coding_type = %i", frame->coding_type);
1037 : edgomez 195
1038 :     for (i = 0; i < frame->seconds; i++) {
1039 : suxen_drol 152 BitstreamPutBit(bs, 1);
1040 :     }
1041 :     BitstreamPutBit(bs, 0);
1042 : Isibaar 3
1043 :     WRITE_MARKER();
1044 :    
1045 :     // time_increment: value=nth_of_sec, nbits = log2(resolution)
1046 : chl 619
1047 : edgomez 195 BitstreamPutBits(bs, frame->ticks, log2bin(pParam->fbase));
1048 : suxen_drol 631 /*DPRINTF("[%i:%i] %c", frame->seconds, frame->ticks,
1049 : edgomez 195 frame->coding_type == I_VOP ? 'I' : frame->coding_type ==
1050 : suxen_drol 252 P_VOP ? 'P' : 'B');*/
1051 : Isibaar 3
1052 :     WRITE_MARKER();
1053 :    
1054 : suxen_drol 229 if (!vop_coded) {
1055 :     BitstreamPutBits(bs, 0, 1);
1056 :     return;
1057 :     }
1058 :    
1059 : edgomez 195 BitstreamPutBits(bs, 1, 1); // vop_coded
1060 : Isibaar 3
1061 : chl 619 if ( (frame->coding_type == P_VOP) || (frame->coding_type == S_VOP) )
1062 : suxen_drol 136 BitstreamPutBits(bs, frame->rounding_type, 1);
1063 : Isibaar 3
1064 : edgomez 195 BitstreamPutBits(bs, 0, 3); // intra_dc_vlc_threshold
1065 :    
1066 :     if (frame->global_flags & XVID_INTERLACING) {
1067 : h 543 BitstreamPutBit(bs, (frame->global_flags & XVID_TOPFIELDFIRST));
1068 :     BitstreamPutBit(bs, (frame->global_flags & XVID_ALTERNATESCAN));
1069 : h 69 }
1070 : chl 619
1071 :     if (frame->coding_type == S_VOP) {
1072 :     if (1) { // no_of_sprite_warping_points>=1
1073 :     if (pParam->m_quarterpel)
1074 :     bs_put_spritetrajectory(bs, frame->GMC_MV.x/2 ); // du[0]
1075 :     else
1076 :     bs_put_spritetrajectory(bs, frame->GMC_MV.x ); // du[0]
1077 :     WRITE_MARKER();
1078 :    
1079 :     if (pParam->m_quarterpel)
1080 :     bs_put_spritetrajectory(bs, frame->GMC_MV.y/2 ); // dv[0]
1081 :     else
1082 :     bs_put_spritetrajectory(bs, frame->GMC_MV.y ); // dv[0]
1083 :     WRITE_MARKER();
1084 : suxen_drol 631
1085 :    
1086 :     if (pParam->m_quarterpel)
1087 :     {
1088 :     DPRINTF(DPRINTF_HEADER,"sprite_warping_point[%i] xy=(%i,%i) *QPEL*", 0, frame->GMC_MV.x/2, frame->GMC_MV.y/2);
1089 :     }
1090 :     else
1091 :     {
1092 :     DPRINTF(DPRINTF_HEADER,"sprite_warping_point[%i] xy=(%i,%i)", 0, frame->GMC_MV.x, frame->GMC_MV.y);
1093 :     }
1094 :    
1095 : chl 619 }
1096 :     /* GMC is halfpel in bitstream, even though GMC_MV was pseudo-qpel (2*halfpel) */
1097 : h 69
1098 : chl 619 if (2) { // no_of_sprite_warping_points>=2 (for DivX5 compat)
1099 :     bs_put_spritetrajectory(bs, 0 );
1100 :     WRITE_MARKER();
1101 :     bs_put_spritetrajectory(bs, 0 );
1102 :     WRITE_MARKER();
1103 :     }
1104 :     // no support for brightness_change!
1105 :     }
1106 :    
1107 : edgomez 195 BitstreamPutBits(bs, frame->quant, 5); // quantizer
1108 :    
1109 : suxen_drol 136 if (frame->coding_type != I_VOP)
1110 : edgomez 195 BitstreamPutBits(bs, frame->fcode, 3); // forward_fixed_code
1111 : suxen_drol 152
1112 :     if (frame->coding_type == B_VOP)
1113 : edgomez 195 BitstreamPutBits(bs, frame->bcode, 3); // backward_fixed_code
1114 : suxen_drol 152
1115 : Isibaar 3 }
1116 : suxen_drol 229
1117 :     void
1118 :     BitstreamWriteUserData(Bitstream * const bs,
1119 :     uint8_t * data,
1120 :     const int length)
1121 :     {
1122 :     int i;
1123 :    
1124 :     BitstreamPad(bs);
1125 :     BitstreamPutBits(bs, USERDATA_START_CODE, 32);
1126 :    
1127 :     for (i = 0; i < length; i++) {
1128 :     BitstreamPutBits(bs, data[i], 8);
1129 :     }
1130 :    
1131 : chl 313 }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4