Mercurial > libavcodec.hg
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 } |