comparison indeo3.c @ 2528:5b738c5093ce libavcodec

indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
author michael
date Sun, 27 Feb 2005 23:43:24 +0000
parents f67b63ed036d
children 89ca1169b24c
comparison
equal deleted inserted replaced
2527:ace6e273f318 2528:5b738c5093ce
93 static void iv_Decode_Chunk(Indeo3DecodeContext *s, unsigned char *cur, 93 static void iv_Decode_Chunk(Indeo3DecodeContext *s, unsigned char *cur,
94 unsigned char *ref, int width, int height, unsigned char *buf1, 94 unsigned char *ref, int width, int height, unsigned char *buf1,
95 long fflags2, unsigned char *hdr, 95 long fflags2, unsigned char *hdr,
96 unsigned char *buf2, int min_width_160); 96 unsigned char *buf2, int min_width_160);
97 97
98 #ifndef min
98 #define min(a,b) ((a) < (b) ? (a) : (b)) 99 #define min(a,b) ((a) < (b) ? (a) : (b))
100 #endif
99 101
100 /* ---------------------------------------------------------------------- */ 102 /* ---------------------------------------------------------------------- */
101 static void iv_alloc_frames(Indeo3DecodeContext *s) 103 static void iv_alloc_frames(Indeo3DecodeContext *s)
102 { 104 {
103 int luma_width, luma_height, luma_pixels, chroma_width, chroma_height, 105 int luma_width, luma_height, luma_pixels, chroma_width, chroma_height,
312 unsigned char *buf2, int min_width_160) 314 unsigned char *buf2, int min_width_160)
313 { 315 {
314 unsigned char bit_buf; 316 unsigned char bit_buf;
315 unsigned long bit_pos, lv, lv1, lv2; 317 unsigned long bit_pos, lv, lv1, lv2;
316 long *width_tbl, width_tbl_arr[10]; 318 long *width_tbl, width_tbl_arr[10];
317 char *ref_vectors; 319 signed char *ref_vectors;
318 unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2; 320 unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2;
319 uint32_t *cur_lp, *ref_lp; 321 uint32_t *cur_lp, *ref_lp;
320 const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2]; 322 const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2];
321 unsigned short *correction_type_sp[2]; 323 unsigned short *correction_type_sp[2];
322 ustr_t strip_tbl[20], *strip; 324 ustr_t strip_tbl[20], *strip;
323 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width, 325 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width,
324 rle_v1, rle_v2, rle_v3; 326 rle_v1, rle_v2, rle_v3;
327 unsigned short res;
325 328
326 bit_buf = 0; 329 bit_buf = 0;
327 ref_vectors = NULL; 330 ref_vectors = NULL;
328 331
329 width_tbl = width_tbl_arr + 1; 332 width_tbl = width_tbl_arr + 1;
454 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2]; 457 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2];
455 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2]; 458 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2];
456 459
457 switch(correction_type_sp[0][k]) { 460 switch(correction_type_sp[0][k]) {
458 case 0: 461 case 0:
459 *cur_lp = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 462 *cur_lp = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
460 lp2++; 463 lp2++;
461 break; 464 break;
462 case 1: 465 case 1:
463 ((unsigned short *)cur_lp)[0] = ((((unsigned short *)(ref_lp))[0] >> 1) 466 res = ((le2me_16(((unsigned short *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1;
464 + correction_lp[lp2 & 0x01][*buf1++]) << 1; 467 ((unsigned short *)cur_lp)[0] = le2me_16(res);
465 ((unsigned short *)cur_lp)[1] = ((((unsigned short *)(ref_lp))[1] >> 1) 468 res = ((le2me_16(((unsigned short *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
466 + correction_lp[lp2 & 0x01][k]) << 1; 469 ((unsigned short *)cur_lp)[1] = le2me_16(res);
467 lp2++; 470 lp2++;
468 break; 471 break;
469 case 2: 472 case 2:
470 if(lp2 == 0) { 473 if(lp2 == 0) {
471 for(i = 0, j = 0; i < 2; i++, j += width_tbl[1]) 474 for(i = 0, j = 0; i < 2; i++, j += width_tbl[1])
556 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2]; 559 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
557 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; 560 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
558 561
559 switch(correction_type_sp[lp2 & 0x01][k]) { 562 switch(correction_type_sp[lp2 & 0x01][k]) {
560 case 0: 563 case 0:
561 cur_lp[width_tbl[1]] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 564 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
562 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) 565 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
563 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; 566 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
564 else 567 else
565 cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 568 cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
566 lp2++; 569 lp2++;
567 break; 570 break;
568 571
569 case 1: 572 case 1:
570 ((unsigned short *)cur_lp)[width_tbl[2]] = 573 res = ((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1;
571 ((((unsigned short *)ref_lp)[0] >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1; 574 ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
572 ((unsigned short *)cur_lp)[width_tbl[2]+1] = 575 res = ((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
573 ((((unsigned short *)ref_lp)[1] >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 576 ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
577
574 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) 578 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
575 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; 579 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
576 else 580 else
577 cur_lp[0] = cur_lp[width_tbl[1]]; 581 cur_lp[0] = cur_lp[width_tbl[1]];
578 lp2++; 582 lp2++;
668 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2]; 672 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
669 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; 673 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
670 lv1 = ref_lp[0]; 674 lv1 = ref_lp[0];
671 lv2 = ref_lp[1]; 675 lv2 = ref_lp[1];
672 if(lp2 == 0 && flag1 != 0) { 676 if(lp2 == 0 && flag1 != 0) {
677 #ifdef WORDS_BIGENDIAN
678 lv1 = lv1 & 0xFF00FF00;
679 lv1 = (lv1 >> 8) | lv1;
680 lv2 = lv2 & 0xFF00FF00;
681 lv2 = (lv2 >> 8) | lv2;
682 #else
673 lv1 = lv1 & 0x00FF00FF; 683 lv1 = lv1 & 0x00FF00FF;
674 lv1 = (lv1 << 8) | lv1; 684 lv1 = (lv1 << 8) | lv1;
675 lv2 = lv2 & 0x00FF00FF; 685 lv2 = lv2 & 0x00FF00FF;
676 lv2 = (lv2 << 8) | lv2; 686 lv2 = (lv2 << 8) | lv2;
687 #endif
677 } 688 }
678 689
679 switch(correction_type_sp[lp2 & 0x01][k]) { 690 switch(correction_type_sp[lp2 & 0x01][k]) {
680 case 0: 691 case 0:
681 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; 692 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
682 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1; 693 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1);
683 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { 694 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
684 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; 695 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
685 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; 696 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
686 } else { 697 } else {
687 cur_lp[0] = cur_lp[width_tbl[1]]; 698 cur_lp[0] = cur_lp[width_tbl[1]];
689 } 700 }
690 lp2++; 701 lp2++;
691 break; 702 break;
692 703
693 case 1: 704 case 1:
694 cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1++]) << 1; 705 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1++]) << 1);
695 cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; 706 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
696 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { 707 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
697 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; 708 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
698 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; 709 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
699 } else { 710 } else {
700 cur_lp[0] = cur_lp[width_tbl[1]]; 711 cur_lp[0] = cur_lp[width_tbl[1]];
832 843
833 switch(correction_type_sp[lp2 & 0x01][k]) { 844 switch(correction_type_sp[lp2 & 0x01][k]) {
834 case 0: 845 case 0:
835 lv1 = correctionloworder_lp[lp2 & 0x01][k]; 846 lv1 = correctionloworder_lp[lp2 & 0x01][k];
836 lv2 = correctionhighorder_lp[lp2 & 0x01][k]; 847 lv2 = correctionhighorder_lp[lp2 & 0x01][k];
837 cur_lp[0] = ((ref_lp[0] >> 1) + lv1) << 1; 848 cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
838 cur_lp[1] = ((ref_lp[1] >> 1) + lv2) << 1; 849 cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
839 cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + lv1) << 1; 850 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
840 cur_lp[width_tbl[1]+1] = ((ref_lp[width_tbl[1]+1] >> 1) + lv2) << 1; 851 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
841 lp2++; 852 lp2++;
842 break; 853 break;
843 854
844 case 1: 855 case 1:
845 lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++]; 856 lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];
846 lv2 = correctionloworder_lp[lp2 & 0x01][k]; 857 lv2 = correctionloworder_lp[lp2 & 0x01][k];
847 cur_lp[0] = ((ref_lp[0] >> 1) + lv1) << 1; 858 cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
848 cur_lp[1] = ((ref_lp[1] >> 1) + lv2) << 1; 859 cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
849 cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + lv1) << 1; 860 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
850 cur_lp[width_tbl[1]+1] = ((ref_lp[width_tbl[1]+1] >> 1) + lv2) << 1; 861 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
851 lp2++; 862 lp2++;
852 break; 863 break;
853 864
854 case 2: 865 case 2:
855 if(lp2 == 0) { 866 if(lp2 == 0) {
933 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2]; 944 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
934 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2]; 945 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
935 946
936 switch(correction_type_sp[lp2 & 0x01][k]) { 947 switch(correction_type_sp[lp2 & 0x01][k]) {
937 case 0: 948 case 0:
938 cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 949 cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
939 cur_lp[width_tbl[1]] = ((ref_lp[width_tbl[1]] >> 1) + correction_lp[lp2 & 0x01][k]) << 1; 950 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
940 lp2++; 951 lp2++;
941 break; 952 break;
942 953
943 case 1: 954 case 1:
944 lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]); 955 lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);
945 lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]); 956 lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]);
946 ((unsigned short *)cur_lp)[0] = ((((unsigned short *)ref_lp)[0] >> 1) + lv1) << 1; 957 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + lv1) << 1);
947 ((unsigned short *)cur_lp)[1] = ((((unsigned short *)ref_lp)[1] >> 1) + lv2) << 1; 958 ((unsigned short *)cur_lp)[0] = le2me_16(res);
948 ((unsigned short *)cur_lp)[width_tbl[2]] = ((((unsigned short *)ref_lp)[width_tbl[2]] >> 1) + lv1) << 1; 959 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + lv2) << 1);
949 ((unsigned short *)cur_lp)[width_tbl[2]+1] = ((((unsigned short *)ref_lp)[width_tbl[2]+1] >> 1) + lv2) << 1; 960 ((unsigned short *)cur_lp)[1] = le2me_16(res);
961 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1);
962 ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
963 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1);
964 ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
950 lp2++; 965 lp2++;
951 break; 966 break;
952 967
953 case 2: 968 case 2:
954 if(lp2 == 0) { 969 if(lp2 == 0) {