comparison h263.c @ 498:0b4450c15067 libavcodec

dc scale simplification/optimization
author michaelni
date Tue, 18 Jun 2002 00:46:02 +0000
parents 1a4d5101a224
children c7e4c8b9a3c4
comparison
equal deleted inserted replaced
497:5b33d11bd1fb 498:0b4450c15067
48 int n, int coded); 48 int n, int coded);
49 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); 49 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
50 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 50 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
51 int n, int coded); 51 int n, int coded);
52 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); 52 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
53 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
54 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, 53 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
55 int dir); 54 int dir);
56 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); 55 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
57 56
58 extern UINT32 inverse[256]; 57 extern UINT32 inverse[256];
174 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ 173 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
175 put_bits(&s->pb, 5, s->qscale); 174 put_bits(&s->pb, 5, s->qscale);
176 } 175 }
177 176
178 put_bits(&s->pb, 1, 0); /* no PEI */ 177 put_bits(&s->pb, 1, 0); /* no PEI */
178
179 if(s->h263_aic){
180 s->y_dc_scale_table=
181 s->c_dc_scale_table= h263_aic_dc_scale_table;
182 }else{
183 s->y_dc_scale_table=
184 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
185 }
179 } 186 }
180 187
181 int h263_encode_gob_header(MpegEncContext * s, int mb_line) 188 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
182 { 189 {
183 int pdif=0; 190 int pdif=0;
494 501
495 for(i=0; i<6; i++){ 502 for(i=0; i<6; i++){
496 const int level= block[i][0]; 503 const int level= block[i][0];
497 UINT16 *dc_ptr; 504 UINT16 *dc_ptr;
498 505
499 dc_diff[i]= level - mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); 506 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
500 if (i < 4) { 507 if (i < 4) {
501 *dc_ptr = level * s->y_dc_scale; 508 *dc_ptr = level * s->y_dc_scale;
502 } else { 509 } else {
503 *dc_ptr = level * s->c_dc_scale; 510 *dc_ptr = level * s->c_dc_scale;
504 } 511 }
1096 case CODEC_ID_H263P: 1103 case CODEC_ID_H263P:
1097 s->fcode_tab= umv_fcode_tab; 1104 s->fcode_tab= umv_fcode_tab;
1098 s->min_qcoeff= -128; 1105 s->min_qcoeff= -128;
1099 s->max_qcoeff= 127; 1106 s->max_qcoeff= 127;
1100 break; 1107 break;
1108 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1101 default: //nothing needed default table allready set in mpegvideo.c 1109 default: //nothing needed default table allready set in mpegvideo.c
1102 s->min_qcoeff= -128; 1110 s->min_qcoeff= -128;
1103 s->max_qcoeff= 127; 1111 s->max_qcoeff= 127;
1112 s->y_dc_scale_table=
1113 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1104 } 1114 }
1105 1115
1106 /* h263 type bias */ 1116 /* h263 type bias */
1107 //FIXME mpeg4 mpeg quantizer 1117 //FIXME mpeg4 mpeg quantizer
1108 s->intra_quant_bias=0; 1118 s->intra_quant_bias=0;
1324 if (s->pict_type != I_TYPE) 1334 if (s->pict_type != I_TYPE)
1325 put_bits(&s->pb, 3, s->f_code); /* fcode_for */ 1335 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1326 if (s->pict_type == B_TYPE) 1336 if (s->pict_type == B_TYPE)
1327 put_bits(&s->pb, 3, s->b_code); /* fcode_back */ 1337 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1328 // printf("****frame %d\n", picture_number); 1338 // printf("****frame %d\n", picture_number);
1329 } 1339
1330 1340 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1331 void h263_dc_scale(MpegEncContext * s) 1341 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1332 { 1342 }
1333 #if 1 1343
1334 const static UINT8 y_tab[32]={ 1344 static void h263_dc_scale(MpegEncContext * s)
1335 // 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 1345 {
1336 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 1346 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1337 }; 1347 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1338 const static UINT8 c_tab[32]={ 1348 }
1339 // 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 1349
1340 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 1350 inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1341 };
1342 s->y_dc_scale = y_tab[s->qscale];
1343 s->c_dc_scale = c_tab[s->qscale];
1344 #else
1345 int quant;
1346 quant = s->qscale;
1347 /* luminance */
1348 if (quant < 5)
1349 s->y_dc_scale = 8;
1350 else if (quant > 4 && quant < 9)
1351 s->y_dc_scale = (2 * quant);
1352 else if (quant > 8 && quant < 25)
1353 s->y_dc_scale = (quant + 8);
1354 else
1355 s->y_dc_scale = (2 * quant - 16);
1356 /* chrominance */
1357 if (quant < 5)
1358 s->c_dc_scale = 8;
1359 else if (quant > 4 && quant < 25)
1360 s->c_dc_scale = ((quant + 13) / 2);
1361 else
1362 s->c_dc_scale = (quant - 6);
1363 #endif
1364 }
1365
1366 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1367 { 1351 {
1368 int a, b, c, wrap, pred, scale; 1352 int a, b, c, wrap, pred, scale;
1369 UINT16 *dc_val; 1353 UINT16 *dc_val;
1370 int dummy; 1354 int dummy;
1371 1355
2651 if (s->h263_pred || s->h263_aic) { 2635 if (s->h263_pred || s->h263_aic) {
2652 s->ac_pred = get_bits1(&s->gb); 2636 s->ac_pred = get_bits1(&s->gb);
2653 if (s->ac_pred && s->h263_aic) 2637 if (s->ac_pred && s->h263_aic)
2654 s->h263_aic_dir = get_bits1(&s->gb); 2638 s->h263_aic_dir = get_bits1(&s->gb);
2655 } 2639 }
2656 if (s->h263_aic) {
2657 s->y_dc_scale = 2 * s->qscale;
2658 s->c_dc_scale = 2 * s->qscale;
2659 }
2660 cbpy = get_vlc(&s->gb, &cbpy_vlc); 2640 cbpy = get_vlc(&s->gb, &cbpy_vlc);
2661 if(cbpy<0) return -1; 2641 if(cbpy<0) return -1;
2662 cbp = (cbpc & 3) | (cbpy << 2); 2642 cbp = (cbpc & 3) | (cbpy << 2);
2663 if (dquant) { 2643 if (dquant) {
2664 s->qscale += quant_tab[get_bits(&s->gb, 2)]; 2644 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2865 return -1; 2845 return -1;
2866 } 2846 }
2867 } 2847 }
2868 } 2848 }
2869 2849
2870 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr); 2850 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
2871 level += pred; 2851 level += pred;
2872 if (level < 0) 2852 if (level < 0)
2873 level = 0; 2853 level = 0;
2874 if (n < 4) { 2854 if (n < 4) {
2875 *dc_val = level * s->y_dc_scale; 2855 *dc_val = level * s->y_dc_scale;
2954 return DECODING_AC_LOST; 2934 return DECODING_AC_LOST;
2955 } 2935 }
2956 #if 1 2936 #if 1
2957 { 2937 {
2958 const int abs_level= ABS(level); 2938 const int abs_level= ABS(level);
2959 int run1;
2960 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){ 2939 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
2940 const int run1= run - rl->max_run[last][abs_level] - 1;
2961 if(abs_level <= rl->max_level[last][run]){ 2941 if(abs_level <= rl->max_level[last][run]){
2962 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n"); 2942 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
2963 return DECODING_AC_LOST; 2943 return DECODING_AC_LOST;
2964 } 2944 }
2965 if(abs_level <= rl->max_level[last][run]*2){ 2945 if(abs_level <= rl->max_level[last][run]*2){
2966 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); 2946 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
2967 return DECODING_AC_LOST; 2947 return DECODING_AC_LOST;
2968 } 2948 }
2969 run1 = run - rl->max_run[last][abs_level] - 1;
2970 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ 2949 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
2971 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); 2950 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
2972 return DECODING_AC_LOST; 2951 return DECODING_AC_LOST;
2973 } 2952 }
2974 } 2953 }
3183 /* PEI */ 3162 /* PEI */
3184 while (get_bits1(&s->gb) != 0) { 3163 while (get_bits1(&s->gb) != 0) {
3185 skip_bits(&s->gb, 8); 3164 skip_bits(&s->gb, 8);
3186 } 3165 }
3187 s->f_code = 1; 3166 s->f_code = 1;
3167
3168 if(s->h263_aic){
3169 s->y_dc_scale_table=
3170 s->c_dc_scale_table= h263_aic_dc_scale_table;
3171 }else{
3172 s->y_dc_scale_table=
3173 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3174 }
3175
3188 return 0; 3176 return 0;
3189 } 3177 }
3190 3178
3191 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s) 3179 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3192 { 3180 {
3624 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n"); 3612 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
3625 #if 0 3613 #if 0
3626 }else{ 3614 }else{
3627 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n" 3615 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
3628 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n"); 3616 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
3629 #endif 3617 #endif
3630 } 3618 }
3631 } 3619 }
3632 } 3620 }
3633 //printf("User Data: %s\n", buf); 3621 //printf("User Data: %s\n", buf);
3634 goto redo; 3622 goto redo;
3758 } 3746 }
3759 3747
3760 s->picture_number++; // better than pic number==0 allways ;) 3748 s->picture_number++; // better than pic number==0 allways ;)
3761 //printf("done\n"); 3749 //printf("done\n");
3762 3750
3751 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
3752 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
3753
3763 return 0; 3754 return 0;
3764 } 3755 }
3765 3756
3766 /* don't understand why they choose a different header ! */ 3757 /* don't understand why they choose a different header ! */
3767 int intel_h263_decode_picture_header(MpegEncContext *s) 3758 int intel_h263_decode_picture_header(MpegEncContext *s)