comparison h263.c @ 753:8e1f0939d15d libavcodec

complete mpeg4 GMC decoding support
author michaelni
date Wed, 16 Oct 2002 19:55:49 +0000
parents cbe316f082bc
children d031d1575ceb
comparison
equal deleted inserted replaced
752:97077dd24bfa 753:8e1f0939d15d
31 #include "h263data.h" 31 #include "h263data.h"
32 #include "mpeg4data.h" 32 #include "mpeg4data.h"
33 33
34 //#undef NDEBUG 34 //#undef NDEBUG
35 //#include <assert.h> 35 //#include <assert.h>
36
37 //rounded divison & shift
38 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
39 36
40 #if 1 37 #if 1
41 #define PRINT_MB_TYPE(a) {} 38 #define PRINT_MB_TYPE(a) {}
42 #else 39 #else
43 #define PRINT_MB_TYPE(a) printf(a) 40 #define PRINT_MB_TYPE(a) printf(a)
2431 2428
2432 return -1; 2429 return -1;
2433 } 2430 }
2434 2431
2435 /** 2432 /**
2433 * @param n either 0 for the x component or 1 for y
2434 * @returns the average MV for a GMC MB
2435 */
2436 static inline int get_amv(MpegEncContext *s, int n){
2437 int x, y, mb_v, sum, dx, dy, shift;
2438 int len = 1 << (s->f_code + 4);
2439 const int a= s->sprite_warping_accuracy;
2440
2441 if(s->real_sprite_warping_points==1){
2442 if(s->divx_version==500 && s->divx_build==413)
2443 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2444 else
2445 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2446 }else{
2447 dx= s->sprite_delta[n][0];
2448 dy= s->sprite_delta[n][1];
2449 shift= s->sprite_shift[0];
2450 if(n) dy -= 1<<(shift + a + 1);
2451 else dx -= 1<<(shift + a + 1);
2452 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2453
2454 sum=0;
2455 for(y=0; y<16; y++){
2456 int v;
2457
2458 v= mb_v + dy*y;
2459 //XXX FIXME optimize
2460 for(x=0; x<16; x++){
2461 sum+= v>>shift;
2462 v+= dx;
2463 }
2464 }
2465 sum /= 256;
2466 sum= RSHIFT(sum<<s->quarter_sample, a);
2467 }
2468
2469 if (sum < -len) sum= -len;
2470 else if (sum >= len) sum= len-1;
2471
2472 return sum;
2473 }
2474
2475 /**
2436 * decodes first partition. 2476 * decodes first partition.
2437 * @return number of MBs decoded or <0 if an error occured 2477 * @return number of MBs decoded or <0 if an error occured
2438 */ 2478 */
2439 static int mpeg4_decode_partition_a(MpegEncContext *s){ 2479 static int mpeg4_decode_partition_a(MpegEncContext *s){
2440 int mb_num; 2480 int mb_num;
2506 skip_bits1(&s->gb); 2546 skip_bits1(&s->gb);
2507 if(bits&0x10000){ 2547 if(bits&0x10000){
2508 /* skip mb */ 2548 /* skip mb */
2509 s->mb_type[xy]= MB_TYPE_SKIPED; 2549 s->mb_type[xy]= MB_TYPE_SKIPED;
2510 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ 2550 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2511 const int a= s->sprite_warping_accuracy;
2512 PRINT_MB_TYPE("G"); 2551 PRINT_MB_TYPE("G");
2513 if(s->divx_version==500 && s->divx_build==413){ 2552 mx= get_amv(s, 0);
2514 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample)); 2553 my= get_amv(s, 1);
2515 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2516 }else{
2517 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2518 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2519 s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
2520 }
2521 }else{ 2554 }else{
2522 PRINT_MB_TYPE("S"); 2555 PRINT_MB_TYPE("S");
2523 mx = 0; 2556 mx=my=0;
2524 my = 0;
2525 } 2557 }
2526 mot_val[0 ]= mot_val[2 ]= 2558 mot_val[0 ]= mot_val[2 ]=
2527 mot_val[0+stride]= mot_val[2+stride]= mx; 2559 mot_val[0+stride]= mot_val[2+stride]= mx;
2528 mot_val[1 ]= mot_val[3 ]= 2560 mot_val[1 ]= mot_val[3 ]=
2529 mot_val[1+stride]= mot_val[3+stride]= my; 2561 mot_val[1+stride]= mot_val[3+stride]= my;
2568 PRINT_MB_TYPE("P"); 2600 PRINT_MB_TYPE("P");
2569 /* 16x16 motion prediction */ 2601 /* 16x16 motion prediction */
2570 s->mb_type[xy]= MB_TYPE_INTER; 2602 s->mb_type[xy]= MB_TYPE_INTER;
2571 2603
2572 h263_pred_motion(s, 0, &pred_x, &pred_y); 2604 h263_pred_motion(s, 0, &pred_x, &pred_y);
2573 if(!s->mcsel) 2605 if(!s->mcsel){
2574 mx = h263_decode_motion(s, pred_x, s->f_code); 2606 mx = h263_decode_motion(s, pred_x, s->f_code);
2575 else { 2607 if (mx >= 0xffff)
2576 const int a= s->sprite_warping_accuracy; 2608 return -1;
2577 if(s->divx_version==500 && s->divx_build==413){ 2609
2578 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample)); 2610 my = h263_decode_motion(s, pred_y, s->f_code);
2579 }else{ 2611 if (my >= 0xffff)
2580 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample); 2612 return -1;
2581 } 2613 } else {
2614 mx = get_amv(s, 0);
2615 my = get_amv(s, 1);
2582 } 2616 }
2583 if (mx >= 0xffff) 2617
2584 return -1;
2585
2586 if(!s->mcsel)
2587 my = h263_decode_motion(s, pred_y, s->f_code);
2588 else{
2589 const int a= s->sprite_warping_accuracy;
2590 if(s->divx_version==500 && s->divx_build==413){
2591 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2592 }else{
2593 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2594 }
2595 }
2596 if (my >= 0xffff)
2597 return -1;
2598 mot_val[0 ]= mot_val[2 ] = 2618 mot_val[0 ]= mot_val[2 ] =
2599 mot_val[0+stride]= mot_val[2+stride]= mx; 2619 mot_val[0+stride]= mot_val[2+stride]= mx;
2600 mot_val[1 ]= mot_val[3 ]= 2620 mot_val[1 ]= mot_val[3 ]=
2601 mot_val[1+stride]= mot_val[3+stride]= my; 2621 mot_val[1+stride]= mot_val[3+stride]= my;
2602 } else { 2622 } else {
2874 for(i=0;i<6;i++) 2894 for(i=0;i<6;i++)
2875 s->block_last_index[i] = -1; 2895 s->block_last_index[i] = -1;
2876 s->mv_dir = MV_DIR_FORWARD; 2896 s->mv_dir = MV_DIR_FORWARD;
2877 s->mv_type = MV_TYPE_16X16; 2897 s->mv_type = MV_TYPE_16X16;
2878 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ 2898 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2879 const int a= s->sprite_warping_accuracy;
2880 // int l = (1 << (s->f_code - 1)) * 32;
2881 PRINT_MB_TYPE("G"); 2899 PRINT_MB_TYPE("G");
2882 s->mcsel=1; 2900 s->mcsel=1;
2883 if(s->divx_version==500 && s->divx_build==413){ 2901 s->mv[0][0][0]= get_amv(s, 0);
2884 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample)); 2902 s->mv[0][0][1]= get_amv(s, 1);
2885 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2886 }else{
2887 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2888 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2889 }
2890 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
2891 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
2892 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
2893 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
2894 2903
2895 s->mb_skiped = 0; 2904 s->mb_skiped = 0;
2896 }else{ 2905 }else{
2897 PRINT_MB_TYPE("S"); 2906 PRINT_MB_TYPE("S");
2898 s->mcsel=0; 2907 s->mcsel=0;
2927 s->interlaced_dct= get_bits1(&s->gb); 2936 s->interlaced_dct= get_bits1(&s->gb);
2928 2937
2929 s->mv_dir = MV_DIR_FORWARD; 2938 s->mv_dir = MV_DIR_FORWARD;
2930 if ((cbpc & 16) == 0) { 2939 if ((cbpc & 16) == 0) {
2931 if(s->mcsel){ 2940 if(s->mcsel){
2932 const int a= s->sprite_warping_accuracy;
2933 PRINT_MB_TYPE("G"); 2941 PRINT_MB_TYPE("G");
2934 /* 16x16 global motion prediction */ 2942 /* 16x16 global motion prediction */
2935 s->mv_type = MV_TYPE_16X16; 2943 s->mv_type = MV_TYPE_16X16;
2936 // int l = (1 << (s->f_code - 1)) * 32; 2944 mx= get_amv(s, 0);
2937 if(s->divx_version==500 && s->divx_build==413){ 2945 my= get_amv(s, 1);
2938 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2939 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2940 }else{
2941 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2942 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2943 }
2944 // int l = (1 << (s->f_code - 1)) * 32;
2945 s->mv[0][0][0] = mx; 2946 s->mv[0][0][0] = mx;
2946 s->mv[0][0][1] = my; 2947 s->mv[0][0][1] = my;
2947 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){ 2948 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
2948 PRINT_MB_TYPE("f"); 2949 PRINT_MB_TYPE("f");
2949 /* 16x8 field motion prediction */ 2950 /* 16x8 field motion prediction */
3860 int r=16/a; 3861 int r=16/a;
3861 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes 3862 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3862 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}}; 3863 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3863 int sprite_ref[4][2]; 3864 int sprite_ref[4][2];
3864 int virtual_ref[2][2]; 3865 int virtual_ref[2][2];
3865 int w2, h2; 3866 int w2, h2, w3, h3;
3866 int alpha=0, beta=0; 3867 int alpha=0, beta=0;
3867 int w= s->width; 3868 int w= s->width;
3868 int h= s->height; 3869 int h= s->height;
3869 //printf("SP %d\n", s->sprite_warping_accuracy); 3870 int min_ab;
3871
3870 for(i=0; i<s->num_sprite_warping_points; i++){ 3872 for(i=0; i<s->num_sprite_warping_points; i++){
3871 int length; 3873 int length;
3872 int x=0, y=0; 3874 int x=0, y=0;
3873 3875
3874 length= get_vlc(&s->gb, &sprite_trajectory); 3876 length= get_vlc(&s->gb, &sprite_trajectory);
3875 if(length){ 3877 if(length){
3876 x= get_bits(&s->gb, length); 3878 x= get_bits(&s->gb, length);
3877 //printf("lx %d %d\n", length, x); 3879
3878 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/ 3880 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3879 x = - (x ^ ((1 << length) - 1)); 3881 x = - (x ^ ((1 << length) - 1));
3880 } 3882 }
3881 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */ 3883 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3882 3884
3883 length= get_vlc(&s->gb, &sprite_trajectory); 3885 length= get_vlc(&s->gb, &sprite_trajectory);
3884 if(length){ 3886 if(length){
3885 y=get_bits(&s->gb, length); 3887 y=get_bits(&s->gb, length);
3886 //printf("ly %d %d\n", length, y); 3888
3887 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/ 3889 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3888 y = - (y ^ ((1 << length) - 1)); 3890 y = - (y ^ ((1 << length) - 1));
3889 } 3891 }
3890 skip_bits1(&s->gb); /* marker bit */ 3892 skip_bits1(&s->gb); /* marker bit */
3891 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy); 3893 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3892 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
3893 //x=y=0;
3894 d[i][0]= x; 3894 d[i][0]= x;
3895 d[i][1]= y; 3895 d[i][1]= y;
3896 } 3896 }
3897 3897
3898 while((1<<alpha)<w) alpha++; 3898 while((1<<alpha)<w) alpha++;
3929 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w); 3929 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
3930 virtual_ref[1][0]= 16*vop_ref[0][0] 3930 virtual_ref[1][0]= 16*vop_ref[0][0]
3931 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h); 3931 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
3932 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) 3932 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3933 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h); 3933 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
3934 3934
3935 switch(s->num_sprite_warping_points) 3935 switch(s->num_sprite_warping_points)
3936 { 3936 {
3937 case 0: 3937 case 0:
3938 s->sprite_offset[0][0]= 0; 3938 s->sprite_offset[0][0]= 0;
3939 s->sprite_offset[0][1]= 0; 3939 s->sprite_offset[0][1]= 0;
3940 s->sprite_offset[1][0]= 0; 3940 s->sprite_offset[1][0]= 0;
3941 s->sprite_offset[1][1]= 0; 3941 s->sprite_offset[1][1]= 0;
3942 s->sprite_delta[0][0][0]= a; 3942 s->sprite_delta[0][0]= a;
3943 s->sprite_delta[0][0][1]= 0; 3943 s->sprite_delta[0][1]= 0;
3944 s->sprite_delta[0][1][0]= 0; 3944 s->sprite_delta[1][0]= 0;
3945 s->sprite_delta[0][1][1]= a; 3945 s->sprite_delta[1][1]= a;
3946 s->sprite_delta[1][0][0]= a; 3946 s->sprite_shift[0]= 0;
3947 s->sprite_delta[1][0][1]= 0; 3947 s->sprite_shift[1]= 0;
3948 s->sprite_delta[1][1][0]= 0;
3949 s->sprite_delta[1][1][1]= a;
3950 s->sprite_shift[0][0]= 0;
3951 s->sprite_shift[0][1]= 0;
3952 s->sprite_shift[1][0]= 0;
3953 s->sprite_shift[1][1]= 0;
3954 break; 3948 break;
3955 case 1: //GMC only 3949 case 1: //GMC only
3956 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0]; 3950 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3957 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1]; 3951 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3958 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2); 3952 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3959 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); 3953 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3960 s->sprite_delta[0][0][0]= a; 3954 s->sprite_delta[0][0]= a;
3961 s->sprite_delta[0][0][1]= 0; 3955 s->sprite_delta[0][1]= 0;
3962 s->sprite_delta[0][1][0]= 0; 3956 s->sprite_delta[1][0]= 0;
3963 s->sprite_delta[0][1][1]= a; 3957 s->sprite_delta[1][1]= a;
3964 s->sprite_delta[1][0][0]= a; 3958 s->sprite_shift[0]= 0;
3965 s->sprite_delta[1][0][1]= 0; 3959 s->sprite_shift[1]= 0;
3966 s->sprite_delta[1][1][0]= 0;
3967 s->sprite_delta[1][1][1]= a;
3968 s->sprite_shift[0][0]= 0;
3969 s->sprite_shift[0][1]= 0;
3970 s->sprite_shift[1][0]= 0;
3971 s->sprite_shift[1][1]= 0;
3972 break; 3960 break;
3973 case 2: 3961 case 2:
3974 case 3: //FIXME
3975 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) 3962 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3976 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) 3963 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3977 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])); 3964 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
3965 + (1<<(alpha+rho-1));
3978 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) 3966 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3979 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) 3967 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3980 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])); 3968 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
3981 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) 3969 + (1<<(alpha+rho-1));
3982 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) 3970 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3983 +2*w2*r*sprite_ref[0][0] - 16*w2); 3971 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3984 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) 3972 +2*w2*r*sprite_ref[0][0]
3985 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) 3973 - 16*w2
3986 +2*w2*r*sprite_ref[0][1] - 16*w2); 3974 + (1<<(alpha+rho+1)));
3987 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); 3975 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3988 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]); 3976 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3989 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); 3977 +2*w2*r*sprite_ref[0][1]
3990 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); 3978 - 16*w2
3991 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]); 3979 + (1<<(alpha+rho+1)));
3992 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]); 3980 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3993 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]); 3981 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
3994 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]); 3982 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3995 s->sprite_shift[0][0]= alpha+rho; 3983 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3996 s->sprite_shift[0][1]= alpha+rho; 3984
3997 s->sprite_shift[1][0]= alpha+rho+2; 3985 s->sprite_shift[0]= alpha+rho;
3998 s->sprite_shift[1][1]= alpha+rho+2; 3986 s->sprite_shift[1]= alpha+rho+2;
3999 break; 3987 break;
4000 // case 3: 3988 case 3:
3989 min_ab= MIN(alpha, beta);
3990 w3= w2>>min_ab;
3991 h3= h2>>min_ab;
3992 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
3993 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
3994 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
3995 + (1<<(alpha+beta+rho-min_ab-1));
3996 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
3997 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
3998 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
3999 + (1<<(alpha+beta+rho-min_ab-1));
4000 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4001 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4002 + 2*w2*h3*r*sprite_ref[0][0]
4003 - 16*w2*h3
4004 + (1<<(alpha+beta+rho-min_ab+1));
4005 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4006 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4007 + 2*w2*h3*r*sprite_ref[0][1]
4008 - 16*w2*h3
4009 + (1<<(alpha+beta+rho-min_ab+1));
4010 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4011 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4012 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4013 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4014
4015 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4016 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4001 break; 4017 break;
4002 } 4018 }
4003 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
4004 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
4005 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
4006 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
4007 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
4008 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
4009 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
4010 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
4011 /* try to simplify the situation */ 4019 /* try to simplify the situation */
4012 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0] 4020 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4013 && s->sprite_delta[0][0][1] == 0 4021 && s->sprite_delta[0][1] == 0
4014 && s->sprite_delta[0][1][0] == 0 4022 && s->sprite_delta[1][0] == 0
4015 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1] 4023 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4016 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
4017 && s->sprite_delta[1][0][1] == 0
4018 && s->sprite_delta[1][1][0] == 0
4019 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
4020 { 4024 {
4021 s->sprite_offset[0][0]>>=s->sprite_shift[0][0]; 4025 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4022 s->sprite_offset[0][1]>>=s->sprite_shift[0][1]; 4026 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4023 s->sprite_offset[1][0]>>=s->sprite_shift[1][0]; 4027 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4024 s->sprite_offset[1][1]>>=s->sprite_shift[1][1]; 4028 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4025 s->sprite_delta[0][0][0]= a; 4029 s->sprite_delta[0][0]= a;
4026 s->sprite_delta[0][0][1]= 0; 4030 s->sprite_delta[0][1]= 0;
4027 s->sprite_delta[0][1][0]= 0; 4031 s->sprite_delta[1][0]= 0;
4028 s->sprite_delta[0][1][1]= a; 4032 s->sprite_delta[1][1]= a;
4029 s->sprite_delta[1][0][0]= a; 4033 s->sprite_shift[0]= 0;
4030 s->sprite_delta[1][0][1]= 0; 4034 s->sprite_shift[1]= 0;
4031 s->sprite_delta[1][1][0]= 0;
4032 s->sprite_delta[1][1][1]= a;
4033 s->sprite_shift[0][0]= 0;
4034 s->sprite_shift[0][1]= 0;
4035 s->sprite_shift[1][0]= 0;
4036 s->sprite_shift[1][1]= 0;
4037 s->real_sprite_warping_points=1; 4035 s->real_sprite_warping_points=1;
4038 } 4036 }
4039 else 4037 else{
4038 int shift_y= 16 - s->sprite_shift[0];
4039 int shift_c= 16 - s->sprite_shift[1];
4040 //printf("shifts %d %d\n", shift_y, shift_c);
4041 for(i=0; i<2; i++){
4042 s->sprite_offset[0][i]<<= shift_y;
4043 s->sprite_offset[1][i]<<= shift_c;
4044 s->sprite_delta[0][i]<<= shift_y;
4045 s->sprite_delta[1][i]<<= shift_y;
4046 s->sprite_shift[i]= 16;
4047 }
4040 s->real_sprite_warping_points= s->num_sprite_warping_points; 4048 s->real_sprite_warping_points= s->num_sprite_warping_points;
4041 4049 }
4042 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]); 4050 #if 0
4051 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4052 vop_ref[0][0], vop_ref[0][1],
4053 vop_ref[1][0], vop_ref[1][1],
4054 vop_ref[2][0], vop_ref[2][1],
4055 sprite_ref[0][0], sprite_ref[0][1],
4056 sprite_ref[1][0], sprite_ref[1][1],
4057 sprite_ref[2][0], sprite_ref[2][1],
4058 virtual_ref[0][0], virtual_ref[0][1],
4059 virtual_ref[1][0], virtual_ref[1][1]
4060 );
4061
4062 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4063 s->sprite_offset[0][0], s->sprite_offset[0][1],
4064 s->sprite_delta[0][0], s->sprite_delta[0][1],
4065 s->sprite_delta[1][0], s->sprite_delta[1][1],
4066 s->sprite_shift[0]
4067 );
4068 #endif
4043 } 4069 }
4044 4070
4045 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ 4071 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4046 int width, height, vo_ver_id; 4072 int width, height, vo_ver_id;
4047 4073
4335 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */ 4361 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4336 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){ 4362 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4337 printf("low_delay flag set, but shouldnt, clearing it\n"); 4363 printf("low_delay flag set, but shouldnt, clearing it\n");
4338 s->low_delay=0; 4364 s->low_delay=0;
4339 } 4365 }
4340 // printf("pic: %d, qpel:%d part:%d resync:%d\n", s->pict_type, s->quarter_sample, s->data_partitioning, s->resync_marker); 4366
4341
4342 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE; 4367 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4343 if(s->partitioned_frame) 4368 if(s->partitioned_frame)
4344 s->decode_mb= mpeg4_decode_partitioned_mb; 4369 s->decode_mb= mpeg4_decode_partitioned_mb;
4345 else 4370 else
4346 s->decode_mb= ff_h263_decode_mb; 4371 s->decode_mb= ff_h263_decode_mb;
4481 if (s->pict_type == B_TYPE) { 4506 if (s->pict_type == B_TYPE) {
4482 s->b_code = get_bits(gb, 3); 4507 s->b_code = get_bits(gb, 3);
4483 }else 4508 }else
4484 s->b_code=1; 4509 s->b_code=1;
4485 #if 0 4510 #if 0
4486 printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d\n", 4511 printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d w:%d a:%d\n",
4487 s->qscale, s->f_code, s->b_code, 4512 s->qscale, s->f_code, s->b_code,
4488 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), 4513 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4489 gb->size,s->progressive_sequence, s->alternate_scan, s->top_field_first, 4514 gb->size,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4490 s->quarter_sample, s->data_partitioning, s->resync_marker); 4515 s->quarter_sample, s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4516 s->sprite_warping_accuracy);
4491 #endif 4517 #endif
4492 if(!s->scalability){ 4518 if(!s->scalability){
4493 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { 4519 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4494 skip_bits1(gb); // vop shape coding type 4520 skip_bits1(gb); // vop shape coding type
4495 } 4521 }