Mercurial > libavcodec.hg
comparison h263.c @ 265:4e9e728021d8 libavcodec
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
some minor optimizations
last non zero index cant be 64 bugfix
author | michaelni |
---|---|
date | Fri, 15 Mar 2002 04:10:53 +0000 |
parents | 28c5c62b1c4c |
children | 252444e5259b |
comparison
equal
deleted
inserted
replaced
264:28c5c62b1c4c | 265:4e9e728021d8 |
---|---|
26 #include "mpeg4data.h" | 26 #include "mpeg4data.h" |
27 | 27 |
28 //rounded divison & shift | 28 //rounded divison & shift |
29 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b)) | 29 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b)) |
30 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) | 30 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) |
31 #define ABS(a) (((a)>=0)?(a):(-(a))) | |
31 | 32 |
32 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, | 33 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, |
33 int n); | 34 int n); |
34 static void h263_encode_motion(MpegEncContext * s, int val); | 35 static void h263_encode_motion(MpegEncContext * s, int val); |
35 static void h263p_encode_umotion(MpegEncContext * s, int val); | 36 static void h263p_encode_umotion(MpegEncContext * s, int val); |
36 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, | 37 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, |
37 int n); | 38 int n, int dc, UINT8 *scan_table); |
38 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); | 39 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); |
39 static int h263p_decode_umotion(MpegEncContext * s, int pred); | 40 static int h263p_decode_umotion(MpegEncContext * s, int pred); |
40 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 41 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
41 int n, int coded); | 42 int n, int coded); |
42 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 43 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
43 int n, int coded); | 44 int n, int coded); |
45 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); | |
46 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, | |
47 int dir); | |
48 | |
49 extern UINT32 inverse[256]; | |
44 | 50 |
45 int h263_get_picture_format(int width, int height) | 51 int h263_get_picture_format(int width, int height) |
46 { | 52 { |
47 int format; | 53 int format; |
48 | 54 |
193 return pdif; | 199 return pdif; |
194 } | 200 } |
195 } | 201 } |
196 return 0; | 202 return 0; |
197 } | 203 } |
204 | |
205 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6]) | |
206 { | |
207 int score0=0, score1=0; | |
208 int i, n; | |
209 | |
210 for(n=0; n<6; n++){ | |
211 int x, y, wrap; | |
212 INT16 *ac_val, *ac_val1; | |
213 | |
214 if (n < 4) { | |
215 x = 2 * s->mb_x + 1 + (n & 1); | |
216 y = 2 * s->mb_y + 1 + (n >> 1); | |
217 wrap = s->mb_width * 2 + 2; | |
218 ac_val = s->ac_val[0][0]; | |
219 } else { | |
220 x = s->mb_x + 1; | |
221 y = s->mb_y + 1; | |
222 wrap = s->mb_width + 2; | |
223 ac_val = s->ac_val[n - 4 + 1][0]; | |
224 } | |
225 ac_val += ((y) * wrap + (x)) * 16; | |
226 ac_val1= ac_val; | |
227 if(dir[n]){ | |
228 ac_val-= wrap*16; | |
229 for(i=1; i<8; i++){ | |
230 const int level= block[n][block_permute_op(i )]; | |
231 score0+= ABS(level); | |
232 score1+= ABS(level - ac_val[i+8]); | |
233 ac_val1[i ]= block[n][block_permute_op(i<<3)]; | |
234 ac_val1[i+8]= level; | |
235 } | |
236 }else{ | |
237 ac_val-= 16; | |
238 for(i=1; i<8; i++){ | |
239 const int level= block[n][block_permute_op(i<<3)]; | |
240 score0+= ABS(level); | |
241 score1+= ABS(level - ac_val[i]); | |
242 ac_val1[i ]= level; | |
243 ac_val1[i+8]= block[n][block_permute_op(i )]; | |
244 } | |
245 } | |
246 } | |
247 | |
248 return score0 > score1 ? 1 : 0; | |
249 } | |
250 | |
251 void mpeg4_encode_mb(MpegEncContext * s, | |
252 DCTELEM block[6][64], | |
253 int motion_x, int motion_y) | |
254 { | |
255 int cbpc, cbpy, i, cbp, pred_x, pred_y; | |
198 | 256 |
257 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); | |
258 if (!s->mb_intra) { | |
259 /* compute cbp */ | |
260 cbp = 0; | |
261 for (i = 0; i < 6; i++) { | |
262 if (s->block_last_index[i] >= 0) | |
263 cbp |= 1 << (5 - i); | |
264 } | |
265 if ((cbp | motion_x | motion_y) == 0) { | |
266 /* skip macroblock */ | |
267 put_bits(&s->pb, 1, 1); | |
268 return; | |
269 } | |
270 put_bits(&s->pb, 1, 0); /* mb coded */ | |
271 cbpc = cbp & 3; | |
272 put_bits(&s->pb, | |
273 inter_MCBPC_bits[cbpc], | |
274 inter_MCBPC_code[cbpc]); | |
275 cbpy = cbp >> 2; | |
276 cbpy ^= 0xf; | |
277 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
278 | |
279 /* motion vectors: 16x16 mode only now */ | |
280 h263_pred_motion(s, 0, &pred_x, &pred_y); | |
281 | |
282 h263_encode_motion(s, motion_x - pred_x); | |
283 h263_encode_motion(s, motion_y - pred_y); | |
284 | |
285 /* encode each block */ | |
286 for (i = 0; i < 6; i++) { | |
287 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct); | |
288 } | |
289 } else { | |
290 int dc_diff[6]; //dc values with the dc prediction subtracted | |
291 int dir[6]; //prediction direction | |
292 int zigzag_last_index[6]; | |
293 UINT8 *scan_table[6]; | |
294 | |
295 for(i=0; i<6; i++){ | |
296 const int level= block[i][0]; | |
297 UINT16 *dc_ptr; | |
298 | |
299 dc_diff[i]= level - mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); | |
300 if (i < 4) { | |
301 *dc_ptr = level * s->y_dc_scale; | |
302 } else { | |
303 *dc_ptr = level * s->c_dc_scale; | |
304 } | |
305 } | |
306 | |
307 s->ac_pred= decide_ac_pred(s, block, dir); | |
308 | |
309 if(s->ac_pred){ | |
310 for(i=0; i<6; i++){ | |
311 UINT8 *st; | |
312 int last_index; | |
313 | |
314 mpeg4_inv_pred_ac(s, block[i], i, dir[i]); | |
315 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */ | |
316 else st = ff_alternate_horizontal_scan; /* top */ | |
317 | |
318 for(last_index=63; last_index>=0; last_index--) //FIXME optimize | |
319 if(block[i][st[last_index]]) break; | |
320 zigzag_last_index[i]= s->block_last_index[i]; | |
321 s->block_last_index[i]= last_index; | |
322 scan_table[i]= st; | |
323 } | |
324 }else{ | |
325 for(i=0; i<6; i++) | |
326 scan_table[i]= zigzag_direct; | |
327 } | |
328 | |
329 /* compute cbp */ | |
330 cbp = 0; | |
331 for (i = 0; i < 6; i++) { | |
332 if (s->block_last_index[i] >= 1) | |
333 cbp |= 1 << (5 - i); | |
334 } | |
335 | |
336 cbpc = cbp & 3; | |
337 if (s->pict_type == I_TYPE) { | |
338 put_bits(&s->pb, | |
339 intra_MCBPC_bits[cbpc], | |
340 intra_MCBPC_code[cbpc]); | |
341 } else { | |
342 put_bits(&s->pb, 1, 0); /* mb coded */ | |
343 put_bits(&s->pb, | |
344 inter_MCBPC_bits[cbpc + 4], | |
345 inter_MCBPC_code[cbpc + 4]); | |
346 } | |
347 put_bits(&s->pb, 1, s->ac_pred); | |
348 cbpy = cbp >> 2; | |
349 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
350 | |
351 /* encode each block */ | |
352 for (i = 0; i < 6; i++) { | |
353 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i]); | |
354 } | |
355 | |
356 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ | |
357 if(s->ac_pred){ | |
358 for(i=0; i<6; i++){ | |
359 int j; | |
360 int x, y, wrap; | |
361 INT16 *ac_val; | |
362 | |
363 if (i < 4) { | |
364 x = 2 * s->mb_x + 1 + (i & 1); | |
365 y = 2 * s->mb_y + 1 + (i >> 1); | |
366 wrap = s->mb_width * 2 + 2; | |
367 ac_val = s->ac_val[0][0]; | |
368 } else { | |
369 x = s->mb_x + 1; | |
370 y = s->mb_y + 1; | |
371 wrap = s->mb_width + 2; | |
372 ac_val = s->ac_val[i - 4 + 1][0]; | |
373 } | |
374 ac_val += ((y) * wrap + (x)) * 16; | |
375 | |
376 if(dir[i]){ | |
377 for(j=1; j<8; j++) | |
378 block[i][block_permute_op(j )]= ac_val[j+8]; | |
379 }else{ | |
380 for(j=1; j<8; j++) | |
381 block[i][block_permute_op(j<<3)]= ac_val[j ]; | |
382 } | |
383 s->block_last_index[i]= zigzag_last_index[i]; | |
384 } | |
385 } | |
386 } | |
387 } | |
388 | |
199 void h263_encode_mb(MpegEncContext * s, | 389 void h263_encode_mb(MpegEncContext * s, |
200 DCTELEM block[6][64], | 390 DCTELEM block[6][64], |
201 int motion_x, int motion_y) | 391 int motion_x, int motion_y) |
202 { | 392 { |
203 int cbpc, cbpy, i, cbp, pred_x, pred_y; | 393 int cbpc, cbpy, i, cbp, pred_x, pred_y; |
266 } | 456 } |
267 | 457 |
268 /* encode each block */ | 458 /* encode each block */ |
269 if (s->h263_pred) { | 459 if (s->h263_pred) { |
270 for (i = 0; i < 6; i++) { | 460 for (i = 0; i < 6; i++) { |
271 mpeg4_encode_block(s, block[i], i); | 461 // mpeg4_encode_block(s, block[i], i); |
272 } | 462 } |
273 } else { | 463 } else { |
274 for (i = 0; i < 6; i++) { | 464 for (i = 0; i < 6; i++) { |
275 h263_encode_block(s, block[i], i); | 465 h263_encode_block(s, block[i], i); |
276 } | 466 } |
277 } | 467 } |
278 } | 468 } |
279 | |
280 | 469 |
281 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) | 470 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) |
282 { | 471 { |
283 int x, y, wrap, a, c, pred_dc, scale, i; | 472 int x, y, wrap, a, c, pred_dc, scale, i; |
284 INT16 *dc_val, *ac_val, *ac_val1; | 473 INT16 *dc_val, *ac_val, *ac_val1; |
664 // printf("****frame %d\n", picture_number); | 853 // printf("****frame %d\n", picture_number); |
665 } | 854 } |
666 | 855 |
667 void h263_dc_scale(MpegEncContext * s) | 856 void h263_dc_scale(MpegEncContext * s) |
668 { | 857 { |
858 #if 1 | |
859 const static UINT8 y_tab[32]={ | |
860 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
861 0, 8, 8, 8, 8,10,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,36,38,40,42,44,46 | |
862 }; | |
863 const static UINT8 c_tab[32]={ | |
864 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
865 0, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,20,21,22,23,24,25 | |
866 }; | |
867 s->y_dc_scale = y_tab[s->qscale]; | |
868 s->c_dc_scale = c_tab[s->qscale]; | |
869 #else | |
669 int quant; | 870 int quant; |
670 | |
671 quant = s->qscale; | 871 quant = s->qscale; |
672 /* luminance */ | 872 /* luminance */ |
673 if (quant < 5) | 873 if (quant < 5) |
674 s->y_dc_scale = 8; | 874 s->y_dc_scale = 8; |
675 else if (quant > 4 && quant < 9) | 875 else if (quant > 4 && quant < 9) |
683 s->c_dc_scale = 8; | 883 s->c_dc_scale = 8; |
684 else if (quant > 4 && quant < 25) | 884 else if (quant > 4 && quant < 25) |
685 s->c_dc_scale = ((quant + 13) / 2); | 885 s->c_dc_scale = ((quant + 13) / 2); |
686 else | 886 else |
687 s->c_dc_scale = (quant - 6); | 887 s->c_dc_scale = (quant - 6); |
688 } | 888 #endif |
689 | 889 } |
690 static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) | 890 |
891 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) | |
691 { | 892 { |
692 int a, b, c, xy, wrap, pred, scale; | 893 int a, b, c, xy, wrap, pred, scale; |
693 UINT16 *dc_val; | 894 UINT16 *dc_val; |
895 int dummy; | |
694 | 896 |
695 /* find prediction */ | 897 /* find prediction */ |
696 if (n < 4) { | 898 if (n < 4) { |
697 wrap = s->mb_width * 2 + 2; | 899 wrap = s->mb_width * 2 + 2; |
698 xy = 2 * s->mb_y + 1 + ((n & 2) >> 1); | 900 xy = 2 * s->mb_y + 1 + (n >> 1); |
699 xy *= wrap; | 901 xy *= wrap; |
700 xy += 2 * s->mb_x + 1 + (n & 1); | 902 xy += 2 * s->mb_x + 1 + (n & 1); |
701 dc_val = s->dc_val[0]; | 903 dc_val = s->dc_val[0]; |
702 scale = s->y_dc_scale; | 904 scale = s->y_dc_scale; |
703 } else { | 905 } else { |
722 } else { | 924 } else { |
723 pred = a; | 925 pred = a; |
724 *dir_ptr = 0; /* left */ | 926 *dir_ptr = 0; /* left */ |
725 } | 927 } |
726 /* we assume pred is positive */ | 928 /* we assume pred is positive */ |
929 #ifdef ARCH_X86 | |
930 asm volatile ( | |
931 "xorl %%edx, %%edx \n\t" | |
932 "mul %%ecx \n\t" | |
933 : "=d" (pred), "=a"(dummy) | |
934 : "a" (pred + (scale >> 1)), "c" (inverse[scale]) | |
935 ); | |
936 #else | |
727 pred = (pred + (scale >> 1)) / scale; | 937 pred = (pred + (scale >> 1)) / scale; |
938 #endif | |
728 | 939 |
729 /* prepare address for prediction update */ | 940 /* prepare address for prediction update */ |
730 *dc_val_ptr = &dc_val[xy]; | 941 *dc_val_ptr = &dc_val[xy]; |
731 | 942 |
732 return pred; | 943 return pred; |
739 INT16 *ac_val, *ac_val1; | 950 INT16 *ac_val, *ac_val1; |
740 | 951 |
741 /* find prediction */ | 952 /* find prediction */ |
742 if (n < 4) { | 953 if (n < 4) { |
743 x = 2 * s->mb_x + 1 + (n & 1); | 954 x = 2 * s->mb_x + 1 + (n & 1); |
744 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); | 955 y = 2 * s->mb_y + 1 + (n >> 1); |
745 wrap = s->mb_width * 2 + 2; | 956 wrap = s->mb_width * 2 + 2; |
746 ac_val = s->ac_val[0][0]; | 957 ac_val = s->ac_val[0][0]; |
747 } else { | 958 } else { |
748 x = s->mb_x + 1; | 959 x = s->mb_x + 1; |
749 y = s->mb_y + 1; | 960 y = s->mb_y + 1; |
773 /* top copy */ | 984 /* top copy */ |
774 for(i=1;i<8;i++) | 985 for(i=1;i<8;i++) |
775 ac_val1[8 + i] = block[block_permute_op(i)]; | 986 ac_val1[8 + i] = block[block_permute_op(i)]; |
776 } | 987 } |
777 | 988 |
778 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) | 989 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, |
779 { | 990 int dir) |
780 int size, v, pred; | 991 { |
781 UINT16 *dc_val; | 992 int x, y, wrap, i; |
782 | 993 INT16 *ac_val; |
783 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr); | 994 |
995 /* find prediction */ | |
784 if (n < 4) { | 996 if (n < 4) { |
785 *dc_val = level * s->y_dc_scale; | 997 x = 2 * s->mb_x + 1 + (n & 1); |
998 y = 2 * s->mb_y + 1 + (n >> 1); | |
999 wrap = s->mb_width * 2 + 2; | |
1000 ac_val = s->ac_val[0][0]; | |
786 } else { | 1001 } else { |
787 *dc_val = level * s->c_dc_scale; | 1002 x = s->mb_x + 1; |
788 } | 1003 y = s->mb_y + 1; |
789 | 1004 wrap = s->mb_width + 2; |
790 /* do the prediction */ | 1005 ac_val = s->ac_val[n - 4 + 1][0]; |
791 level -= pred; | 1006 } |
1007 ac_val += ((y) * wrap + (x)) * 16; | |
1008 | |
1009 if (dir == 0) { | |
1010 /* left prediction */ | |
1011 ac_val -= 16; | |
1012 for(i=1;i<8;i++) { | |
1013 block[block_permute_op(i*8)] -= ac_val[i]; | |
1014 } | |
1015 } else { | |
1016 /* top prediction */ | |
1017 ac_val -= 16 * wrap; | |
1018 for(i=1;i<8;i++) { | |
1019 block[block_permute_op(i)] -= ac_val[i + 8]; | |
1020 } | |
1021 } | |
1022 } | |
1023 | |
1024 | |
1025 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n) | |
1026 { | |
1027 int size, v; | |
792 /* find number of bits */ | 1028 /* find number of bits */ |
793 size = 0; | 1029 size = 0; |
794 v = abs(level); | 1030 v = abs(level); |
795 while (v) { | 1031 while (v) { |
796 v >>= 1; | 1032 v >>= 1; |
813 if (size > 8) | 1049 if (size > 8) |
814 put_bits(&s->pb, 1, 1); | 1050 put_bits(&s->pb, 1, 1); |
815 } | 1051 } |
816 } | 1052 } |
817 | 1053 |
818 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n) | 1054 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table) |
819 { | 1055 { |
820 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; | 1056 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; |
821 int code, dc_pred_dir; | 1057 int code; |
822 const RLTable *rl; | 1058 const RLTable *rl; |
823 | 1059 |
824 if (s->mb_intra) { | 1060 if (s->mb_intra) { |
825 /* mpeg4 based DC predictor */ | 1061 /* mpeg4 based DC predictor */ |
826 mpeg4_encode_dc(s, block[0], n, &dc_pred_dir); | 1062 mpeg4_encode_dc(s, intra_dc, n); |
827 i = 1; | 1063 i = 1; |
828 rl = &rl_intra; | 1064 rl = &rl_intra; |
829 } else { | 1065 } else { |
830 i = 0; | 1066 i = 0; |
831 rl = &rl_inter; | 1067 rl = &rl_inter; |
833 | 1069 |
834 /* AC coefs */ | 1070 /* AC coefs */ |
835 last_index = s->block_last_index[n]; | 1071 last_index = s->block_last_index[n]; |
836 last_non_zero = i - 1; | 1072 last_non_zero = i - 1; |
837 for (; i <= last_index; i++) { | 1073 for (; i <= last_index; i++) { |
838 j = zigzag_direct[i]; | 1074 j = scan_table[i]; |
839 level = block[j]; | 1075 level = block[j]; |
840 if (level) { | 1076 if (level) { |
841 run = i - last_non_zero - 1; | 1077 run = i - last_non_zero - 1; |
842 last = (i == last_index); | 1078 last = (i == last_index); |
843 sign = 0; | 1079 sign = 0; |
1447 i++; | 1683 i++; |
1448 } | 1684 } |
1449 not_coded: | 1685 not_coded: |
1450 if (s->mb_intra && s->h263_aic) { | 1686 if (s->mb_intra && s->h263_aic) { |
1451 h263_pred_acdc(s, block, n); | 1687 h263_pred_acdc(s, block, n); |
1452 i = 64; | 1688 i = 63; |
1453 } | 1689 } |
1454 s->block_last_index[n] = i; | 1690 s->block_last_index[n] = i; |
1455 return 0; | 1691 return 0; |
1456 } | 1692 } |
1457 | 1693 |
2096 s->time= (s->last_non_b_time[1]/s->time_increment_resolution + time_incr)*s->time_increment_resolution; | 2332 s->time= (s->last_non_b_time[1]/s->time_increment_resolution + time_incr)*s->time_increment_resolution; |
2097 s->time+= s->time_increment; | 2333 s->time+= s->time_increment; |
2098 } | 2334 } |
2099 | 2335 |
2100 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){ | 2336 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){ |
2101 int i; | |
2102 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n"); | 2337 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n"); |
2103 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){ | 2338 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){ |
2104 if(get_bits1(&s->gb)) break; | 2339 if(get_bits1(&s->gb)) break; |
2105 } | 2340 } |
2106 printf("my guess is %d bits ;)\n",s->time_increment_bits); | 2341 printf("my guess is %d bits ;)\n",s->time_increment_bits); |