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