~ubuntu-branches/debian/sid/v4l-utils/sid

« back to all changes in this revision

Viewing changes to lib/libv4lconvert/ov518-decomp.c

  • Committer: Bazaar Package Importer
  • Author(s): Gregor Jasny
  • Date: 2010-05-07 20:48:34 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20100507204834-ga01cxhz3fekk47r
Tags: 0.8.0-1
* New upstream version
* Switch to 3.0 (quilt) source format
* Re-enable pristine-tar
* Split utils package into command line and the Qt based qv4l2
  (Closes: #576422)
* Update upstream URL

Show diffs side-by-side

added added

removed removed

Lines of Context:
439
439
/* Return: Depth of node found, or -1 if invalid input code */
440
440
static int
441
441
getNodeAC(unsigned int in, signed char *coeffbits, signed char *skip,
442
 
          const struct tree_node *tree)
 
442
                const struct tree_node *tree)
443
443
{
444
444
        int node = 0;
445
445
        int i = 0;
536
536
                                        b1 = in[0];
537
537
                                        b2 = in[1];
538
538
                                } else {
539
 
                                        if (bytes <= bufLen) {
 
539
                                        if (bytes <= bufLen)
540
540
                                                b1 = in[0];
541
 
                                        } else {
 
541
                                        else
542
542
                                                b1 = 0;
543
 
                                        }
544
543
                                        b2 = 0;
545
544
                                }
546
545
                                b3 = 0;
566
565
 
567
566
static int
568
567
getACCoefficient(int *rawData, int *coeff, struct comp_info *cinfo,
569
 
                 const struct tree_node *tree)
 
568
                const struct tree_node *tree)
570
569
{
571
570
        int input, bits, bytes, tmp_c;
572
571
        signed char coeffbits = 0;
578
577
        if (coeffbits) {
579
578
                input = input << (bits - 1);
580
579
                input &= 0x7fffffff;
581
 
                if (! (input & 0x40000000))
 
580
                if (!(input & 0x40000000))
582
581
                        input |= 0x80000000;
583
582
 
584
583
                tmp_c = input >> (31 - coeffbits);
598
597
 
599
598
static void
600
599
getDCCoefficient(int *rawData, int *coeff, struct comp_info *cinfo,
601
 
                 const struct tree_node *tree)
 
600
                const struct tree_node *tree)
602
601
{
603
602
        int input, bits, bytes, tmp_c;
604
603
        signed char coeffbits = 0;
613
612
 
614
613
                input = input << (bits - 1);
615
614
                input &= 0x7fffffff;
616
 
                if (! (input & 0x40000000))
 
615
                if (!(input & 0x40000000))
617
616
                        input |= 0x80000000;
618
617
 
619
618
                tmp_c = input >> (31 - coeffbits);
675
674
        } while (i <= 31);
676
675
 
677
676
        if (skip == -1)
678
 
                while (i <= 31)  C[i++] = 0;
 
677
                while (i <= 31)
 
678
                        C[i++] = 0;
679
679
        else
680
680
                getACCoefficient(pIn, &coeff, cinfo, treeYAC);
681
681
}
718
718
        } while (i <= 31);
719
719
 
720
720
        if (skip == -1)
721
 
                while (i <= 31)  C[i++] = 0;
 
721
                while (i <= 31)
 
722
                        C[i++] = 0;
722
723
        else
723
724
                getACCoefficient(pIn, &coeff, cinfo, treeUVAC);
724
725
}
731
732
 
732
733
#define IDCT_MESSAGE "iDCT with multiply"
733
734
 
734
 
#define TIMES_16382(u)  ((u)? 16382 * (u):0)
735
 
#define TIMES_23168(u)  ((u)? 23168 * (u):0)
736
 
#define TIMES_30270(u)  ((u)? 30270 * (u):0)
737
 
#define TIMES_41986(u)  ((u)? 41986 * (u):0)
738
 
#define TIMES_35594(u)  ((u)? 35594 * (u):0)
739
 
#define TIMES_23783(u)  ((u)? 23783 * (u):0)
740
 
#define TIMES_8351(u)   ((u)? 8351  * (u):0)
741
 
#define TIMES_17391(u)  ((u)? 17391 * (u):0)
742
 
#define TIMES_14743(u)  ((u)? 14743 * (u):0)
743
 
#define TIMES_9851(u)   ((u)? 9851  * (u):0)
744
 
#define TIMES_3459(u)   ((u)? 3459  * (u):0)
745
 
#define TIMES_32134(u)  ((u)? 32134 * (u):0)
746
 
#define TIMES_27242(u)  ((u)? 27242 * (u):0)
747
 
#define TIMES_18202(u)  ((u)? 18202 * (u):0)
748
 
#define TIMES_6392(u)   ((u)? 6392  * (u):0)
749
 
#define TIMES_39550(u)  ((u)? 39550 * (u):0)
750
 
#define TIMES_6785(u)   ((u)? 6785  * (u):0)
751
 
#define TIMES_12538(u)  ((u)? 12538 * (u):0)
 
735
#define TIMES_16382(u)  ((u) ? 16382 * (u) : 0)
 
736
#define TIMES_23168(u)  ((u) ? 23168 * (u) : 0)
 
737
#define TIMES_30270(u)  ((u) ? 30270 * (u) : 0)
 
738
#define TIMES_41986(u)  ((u) ? 41986 * (u) : 0)
 
739
#define TIMES_35594(u)  ((u) ? 35594 * (u) : 0)
 
740
#define TIMES_23783(u)  ((u) ? 23783 * (u) : 0)
 
741
#define TIMES_8351(u)   ((u) ? 8351  * (u) : 0)
 
742
#define TIMES_17391(u)  ((u) ? 17391 * (u) : 0)
 
743
#define TIMES_14743(u)  ((u) ? 14743 * (u) : 0)
 
744
#define TIMES_9851(u)   ((u) ? 9851  * (u) : 0)
 
745
#define TIMES_3459(u)   ((u) ? 3459  * (u) : 0)
 
746
#define TIMES_32134(u)  ((u) ? 32134 * (u) : 0)
 
747
#define TIMES_27242(u)  ((u) ? 27242 * (u) : 0)
 
748
#define TIMES_18202(u)  ((u) ? 18202 * (u) : 0)
 
749
#define TIMES_6392(u)   ((u) ? 6392  * (u) : 0)
 
750
#define TIMES_39550(u)  ((u) ? 39550 * (u) : 0)
 
751
#define TIMES_6785(u)   ((u) ? 6785  * (u) : 0)
 
752
#define TIMES_12538(u)  ((u) ? 12538 * (u) : 0)
752
753
 
753
754
#else
754
755
 
755
756
#define IDCT_MESSAGE "iDCT with shift"
756
757
 
757
 
#define TIMES_16382(u) ( (u)? x=(u) , (x<<14) - (x<<1) :0 )
758
 
#define TIMES_23168(u) ( (u)? x=(u) , (x<<14) + (x<<12) + (x<<11) + (x<<9) :0 )
759
 
#define TIMES_30270(u) ( (u)? x=(u) , (x<<15) - (x<<11) :0 )
760
 
#define TIMES_41986(u) ( (u)? x=(u) , (x<<15) + (x<<13) + (x<<10) :0 )
761
 
#define TIMES_35594(u) ( (u)? x=(u) , (x<<15) + (x<<11) + (x<<9) + (x<<8) :0 )
762
 
#define TIMES_23783(u) ( (u)? x=(u) , (x<<14) + (x<<13) - (x<<9) - (x<<8) :0 )
763
 
#define TIMES_8351(u)  ( (u)? x=(u) , (x<<13) :0 )
764
 
#define TIMES_17391(u) ( (u)? x=(u) , (x<<14) + (x<<10) :0 )
765
 
#define TIMES_14743(u) ( (u)? x=(u) , (x<<14) - (x<<10) - (x<<9) :0 )
766
 
#define TIMES_9851(u)  ( (u)? x=(u) , (x<<13) + (x<<10) + (x<<9) :0 )
767
 
#define TIMES_3459(u)  ( (u)? x=(u) , (x<<12) - (x<<9) :0 )
768
 
#define TIMES_32134(u) ( (u)? x=(u) , (x<<15) - (x<<9) :0 )
769
 
#define TIMES_27242(u) ( (u)? x=(u) , (x<<14) + (x<<13) + (x<<11) + (x<<9) :0 )
770
 
#define TIMES_18202(u) ( (u)? x=(u) , (x<<14) + (x<<11) - (x<<8) :0 )
771
 
#define TIMES_6392(u)  ( (u)? x=(u) , (x<<13) - (x<<11) + (x<<8) :0 )
772
 
#define TIMES_39550(u) ( (u)? x=(u) , (x<<15) + (x<<12) + (x<<11) + (x<<9) :0 )
773
 
#define TIMES_6785(u)  ( (u)? x=(u) , (x<<12) + (x<<11) + (x<<9) :0 )
774
 
#define TIMES_12538(u) ( (u)? x=(u) , (x<<13) + (x<<12) + (x<<8) :0 )
 
758
#define TIMES_16382(u) ((u) ? x = (u), (x << 14) - (x << 1) : 0)
 
759
#define TIMES_23168(u) ((u) ? x = (u), (x << 14) + (x << 12) + (x << 11) + (x << 9) : 0)
 
760
#define TIMES_30270(u) ((u) ? x = (u), (x << 15) - (x << 11) : 0)
 
761
#define TIMES_41986(u) ((u) ? x = (u), (x << 15) + (x << 13) + (x << 10) : 0)
 
762
#define TIMES_35594(u) ((u) ? x = (u), (x << 15) + (x << 11) + (x << 9) + (x << 8) : 0)
 
763
#define TIMES_23783(u) ((u) ? x = (u), (x << 14) + (x << 13) - (x << 9) - (x << 8) : 0)
 
764
#define TIMES_8351(u)  ((u) ? x = (u), (x << 13) : 0)
 
765
#define TIMES_17391(u) ((u) ? x = (u), (x << 14) + (x << 10) : 0)
 
766
#define TIMES_14743(u) ((u) ? x = (u), (x << 14) - (x << 10) - (x << 9) : 0)
 
767
#define TIMES_9851(u)  ((u) ? x = (u), (x << 13) + (x << 10) + (x << 9) : 0)
 
768
#define TIMES_3459(u)  ((u) ? x = (u), (x << 12) - (x << 9) : 0)
 
769
#define TIMES_32134(u) ((u) ? x = (u), (x << 15) - (x << 9) : 0)
 
770
#define TIMES_27242(u) ((u) ? x = (u), (x << 14) + (x << 13) + (x << 11) + (x << 9) : 0)
 
771
#define TIMES_18202(u) ((u) ? x = (u), (x << 14) + (x << 11) - (x << 8) : 0)
 
772
#define TIMES_6392(u)  ((u) ? x = (u), (x << 13) - (x << 11) + (x << 8) : 0)
 
773
#define TIMES_39550(u) ((u) ? x = (u), (x << 15) + (x << 12) + (x << 11) + (x << 9) : 0)
 
774
#define TIMES_6785(u)  ((u) ? x = (u), (x << 12) + (x << 11) + (x << 9) : 0)
 
775
#define TIMES_12538(u) ((u) ? x = (u), (x << 13) + (x << 12) + (x << 8) : 0)
775
776
 
776
777
/*
777
778
 * The variables C0, C4, C16 and C20 can also be removed from the algorithm
783
784
 
784
785
static void
785
786
DCT_8x4(int *coeff, unsigned char *out)
786
 
/* pre: coeff == coefficients
787
 
   post: coeff != coefficients
788
 
   ** DO NOT ASSUME coeff TO BE THE SAME BEFORE AND AFTER CALLING THIS FUNCTION!
789
 
*/
 
787
        /* pre: coeff == coefficients
 
788
           post: coeff != coefficients
 
789
         ** DO NOT ASSUME coeff TO BE THE SAME BEFORE AND AFTER CALLING THIS FUNCTION!
 
790
         */
790
791
{
791
 
        register int base,val1,val2,val3;
792
 
        int tmp1,tmp2;
793
 
        int C0,C4,C16,C20;
794
 
        int C2_18,C6_22,C1_17,C3_19,C5_21,C7_23;
 
792
        register int base, val1, val2, val3;
 
793
        int tmp1, tmp2;
 
794
        int C0, C4, C16, C20;
 
795
        int C2_18, C6_22, C1_17, C3_19, C5_21, C7_23;
795
796
        register int t;
796
797
#ifdef APPROXIMATE_MUL_BY_SHIFT
797
798
        register int x;
798
799
#endif
799
800
 
800
 
        C0=coeff[0];
801
 
        C4=coeff[4];
802
 
        C16=coeff[16];
803
 
        C20=coeff[20];
804
 
 
805
 
        coeff[0]=TIMES_23168(coeff[0]);
806
 
        coeff[4]=TIMES_23168(coeff[4]);
807
 
        coeff[16]=TIMES_23168(coeff[16]);
808
 
        coeff[20]=TIMES_23168(coeff[20]);
809
 
 
810
 
        C2_18 = coeff[2]+coeff[18];
811
 
        C6_22 = coeff[6]+coeff[22];
812
 
        C1_17 = coeff[1]+coeff[17];
813
 
        C3_19 = coeff[3]+coeff[19];
814
 
        C5_21 = coeff[5]+coeff[21];
815
 
        C7_23 = coeff[7]+coeff[23];
816
 
 
817
 
// 0,7,25,32
 
801
        C0 = coeff[0];
 
802
        C4 = coeff[4];
 
803
        C16 = coeff[16];
 
804
        C20 = coeff[20];
 
805
 
 
806
        coeff[0] = TIMES_23168(coeff[0]);
 
807
        coeff[4] = TIMES_23168(coeff[4]);
 
808
        coeff[16] = TIMES_23168(coeff[16]);
 
809
        coeff[20] = TIMES_23168(coeff[20]);
 
810
 
 
811
        C2_18 = coeff[2] + coeff[18];
 
812
        C6_22 = coeff[6] + coeff[22];
 
813
        C1_17 = coeff[1] + coeff[17];
 
814
        C3_19 = coeff[3] + coeff[19];
 
815
        C5_21 = coeff[5] + coeff[21];
 
816
        C7_23 = coeff[7] + coeff[23];
 
817
 
 
818
        // 0,7,25,32
818
819
 
819
820
        base = 0x1000000;
820
 
        base += coeff[0]+coeff[4]+coeff[16]+coeff[20];
 
821
        base += coeff[0] + coeff[4] + coeff[16] + coeff[20];
821
822
        base += TIMES_30270(C2_18);
822
823
        base += TIMES_12538(C6_22);
823
824
 
836
837
        val2 += TIMES_6392(C7_23);
837
838
 
838
839
        val3 = TIMES_39550(coeff[10]);
839
 
        val3 += TIMES_16382(coeff[14]+coeff[26]);
 
840
        val3 += TIMES_16382(coeff[14] + coeff[26]);
840
841
        val3 += TIMES_6785(coeff[30]);
841
 
        val3 += TIMES_30270(coeff[8]+coeff[12]);
842
 
        val3 += TIMES_12538(coeff[24]+coeff[28]);
843
 
 
844
 
        t=(base + val1 + val2 + val3) >> 17;
845
 
        out[0]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
846
 
        t=(base - val1 - val2 + val3 - C4 - C20) >> 17;
847
 
        out[7]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
848
 
        t=(base - val1 + val2 - val3 - C16- C20) >> 17;
849
 
        out[24]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
850
 
        t=(base + val1 - val2 - val3 - C4 - C16 - C20) >> 17;
851
 
        out[31]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
852
 
 
853
 
//1,6,25,30
 
842
        val3 += TIMES_30270(coeff[8] + coeff[12]);
 
843
        val3 += TIMES_12538(coeff[24] + coeff[28]);
 
844
 
 
845
        t = (base + val1 + val2 + val3) >> 17;
 
846
        out[0] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
847
        t = (base - val1 - val2 + val3 - C4 - C20) >> 17;
 
848
        out[7] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
849
        t = (base - val1 + val2 - val3 - C16 - C20) >> 17;
 
850
        out[24] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
851
        t = (base + val1 - val2 - val3 - C4 - C16 - C20) >> 17;
 
852
        out[31] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
853
 
 
854
        //1,6,25,30
854
855
 
855
856
        base = 0x1000000;
856
 
        base += coeff[0]-coeff[4]+coeff[16]-coeff[20];
 
857
        base += coeff[0] - coeff[4] + coeff[16] - coeff[20];
857
858
        base += TIMES_12538(C2_18);
858
859
        base -= TIMES_30270(C6_22);
859
860
 
871
872
        val2 -= TIMES_32134(C5_21);
872
873
        val2 -= TIMES_18202(C7_23);
873
874
 
874
 
        val3 = TIMES_16382(coeff[10]-coeff[30]);
 
875
        val3 = TIMES_16382(coeff[10] - coeff[30]);
875
876
        val3 -= TIMES_39550(coeff[14]);
876
877
        val3 += TIMES_6785(coeff[26]);
877
 
        val3 += TIMES_12538(coeff[24]-coeff[28]);
878
 
        val3 += TIMES_30270(coeff[8]-coeff[12]);
879
 
 
880
 
        t=(base + val1 + val2 + val3 + C4 + C20) >> 17;
881
 
        out[1]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
882
 
        t=(base - val1 - val2 + val3) >> 17;
883
 
        out[6]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
884
 
        t=(base - val1 + val2 - val3 + C4 - C16 + C20) >> 17;
885
 
        out[25]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
886
 
        t=(base + val1 - val2 - val3 + C20) >> 17;
887
 
        out[30]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
888
 
 
889
 
//2,5,26,29
 
878
        val3 += TIMES_12538(coeff[24] - coeff[28]);
 
879
        val3 += TIMES_30270(coeff[8] - coeff[12]);
 
880
 
 
881
        t = (base + val1 + val2 + val3 + C4 + C20) >> 17;
 
882
        out[1] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
883
        t = (base - val1 - val2 + val3) >> 17;
 
884
        out[6] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
885
        t = (base - val1 + val2 - val3 + C4 - C16 + C20) >> 17;
 
886
        out[25] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
887
        t = (base + val1 - val2 - val3 + C20) >> 17;
 
888
        out[30] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
889
 
 
890
        //2,5,26,29
890
891
 
891
892
        base = 0x1000000;
892
893
        base += coeff[0] - coeff[4] + coeff[16] - coeff[20];
913
914
        val3 += TIMES_12538(coeff[24] - coeff[28]);
914
915
        val3 += TIMES_30270(coeff[8] - coeff[12]);
915
916
 
916
 
        t=(base + val1 + val2 + val3) >> 17;
917
 
        out[2]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
918
 
        t=(base - val1 - val2 + val3) >> 17;
919
 
        out[5]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
920
 
        t=(base - val1 + val2 - val3 - C16) >> 17;
921
 
        out[26]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
922
 
        t=(base + val1 - val2 - val3 + C4 - C16 + C20) >> 17;
923
 
        out[29]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
 
917
        t = (base + val1 + val2 + val3) >> 17;
 
918
        out[2] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
919
        t = (base - val1 - val2 + val3) >> 17;
 
920
        out[5] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
921
        t = (base - val1 + val2 - val3 - C16) >> 17;
 
922
        out[26] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
923
        t = (base + val1 - val2 - val3 + C4 - C16 + C20) >> 17;
 
924
        out[29] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
924
925
 
925
 
//3,4,27,28
 
926
        //3,4,27,28
926
927
 
927
928
        base = 0x1000000;
928
929
        base += coeff[0] + coeff[4] + coeff[16] + coeff[20];
949
950
        tmp1 = TIMES_32134(C7_23);
950
951
        tmp2 = TIMES_41986(coeff[15]) + TIMES_17391(coeff[31]);
951
952
 
952
 
        t=(base + val1 + val2 + val3 - tmp1 - tmp2 - C4 - C20) >> 17;
953
 
        out[3]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
954
 
        t=(base - val1 - val2 + val3) >> 17;
955
 
        out[4]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
956
 
        t=(base - val1 + val2 - val3 - tmp1 + tmp2) >> 17;
957
 
        out[27]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
958
 
        t=(base + val1 - val2 - val3 - C16 - C20) >> 17;
959
 
        out[28]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
 
953
        t = (base + val1 + val2 + val3 - tmp1 - tmp2 - C4 - C20) >> 17;
 
954
        out[3] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
955
        t = (base - val1 - val2 + val3) >> 17;
 
956
        out[4] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
957
        t = (base - val1 + val2 - val3 - tmp1 + tmp2) >> 17;
 
958
        out[27] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
959
        t = (base + val1 - val2 - val3 - C16 - C20) >> 17;
 
960
        out[28] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
960
961
 
961
 
// Second half
 
962
        // Second half
962
963
        C2_18 = coeff[2] - coeff[18];
963
964
        C6_22 = coeff[6] - coeff[22];
964
965
        C1_17 = coeff[1] - coeff[17];
966
967
        C5_21 = coeff[5] - coeff[21];
967
968
        C7_23 = coeff[7] - coeff[23];
968
969
 
969
 
// 8,15,16,23
 
970
        // 8,15,16,23
970
971
 
971
972
        base = 0x1000000;
972
973
        base += coeff[0] + coeff[4] - coeff[16] - coeff[20];
973
 
        base +=TIMES_30270(C2_18);
974
 
        base +=TIMES_12538(C6_22);
 
974
        base += TIMES_30270(C2_18);
 
975
        base += TIMES_12538(C6_22);
975
976
 
976
977
        val1 = TIMES_17391(coeff[9]);
977
978
        val1 += TIMES_14743(coeff[11]);
990
991
        val3 = TIMES_16382(coeff[10] - coeff[30]);
991
992
        val3 += TIMES_6785(coeff[14]);
992
993
        val3 -= TIMES_39550(coeff[26]);
993
 
        val3 -=TIMES_30270(coeff[24] + coeff[28]);
994
 
        val3 +=TIMES_12538(coeff[8] + coeff[12]);
995
 
 
996
 
        t=(base + val1 + val2 + val3) >> 17;
997
 
        out[8]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
998
 
        t=(base - val1 - val2 + val3 - C4 + C16 + C20) >> 17;
999
 
        out[15]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1000
 
        t=(base - val1 + val2 - val3) >> 17;
1001
 
        out[16]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1002
 
        t=(base + val1 - val2 - val3 - C4 + C20) >> 17;
1003
 
        out[23]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1004
 
 
1005
 
//9,14,17,22
 
994
        val3 -= TIMES_30270(coeff[24] + coeff[28]);
 
995
        val3 += TIMES_12538(coeff[8] + coeff[12]);
 
996
 
 
997
        t = (base + val1 + val2 + val3) >> 17;
 
998
        out[8] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
999
        t = (base - val1 - val2 + val3 - C4 + C16 + C20) >> 17;
 
1000
        out[15] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1001
        t = (base - val1 + val2 - val3) >> 17;
 
1002
        out[16] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1003
        t = (base + val1 - val2 - val3 - C4 + C20) >> 17;
 
1004
        out[23] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1005
 
 
1006
        //9,14,17,22
1006
1007
 
1007
1008
        base = 0x1000000;
1008
1009
        base += coeff[0] - coeff[4] - coeff[16] + coeff[20];
1029
1030
        val3 += TIMES_12538(coeff[8] - coeff[12]);
1030
1031
        val3 -= TIMES_30270(coeff[24] - coeff[28]);
1031
1032
 
1032
 
        t=(base + val1 + val2 + val3 + C4 + C16 - C20) >> 17;
1033
 
        out[9]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1034
 
        t=(base - val1 - val2 + val3 + C16) >> 17;
1035
 
        out[14]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1036
 
        t=(base - val1 + val2 - val3 + C4) >> 17;
1037
 
        out[17]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1038
 
        t=(base + val1 - val2 - val3) >> 17;
1039
 
        out[22]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
 
1033
        t = (base + val1 + val2 + val3 + C4 + C16 - C20) >> 17;
 
1034
        out[9] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1035
        t = (base - val1 - val2 + val3 + C16) >> 17;
 
1036
        out[14] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1037
        t = (base - val1 + val2 - val3 + C4) >> 17;
 
1038
        out[17] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1039
        t = (base + val1 - val2 - val3) >> 17;
 
1040
        out[22] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
1040
1041
 
1041
 
//10,13,18,21
 
1042
        //10,13,18,21
1042
1043
 
1043
1044
        base = 0x1000000;
1044
1045
        base += coeff[0] - coeff[4] - coeff[16] + coeff[20];
1060
1061
        val2 += TIMES_27242(C7_23);
1061
1062
 
1062
1063
        val3 = -TIMES_6785(coeff[10]);
1063
 
        val3 += TIMES_16382(coeff[14]+coeff[26]);
 
1064
        val3 += TIMES_16382(coeff[14] + coeff[26]);
1064
1065
        val3 -= TIMES_39550(coeff[30]);
1065
 
        val3 += TIMES_12538(coeff[8]-coeff[12]);
1066
 
        val3 -= TIMES_30270(coeff[24]-coeff[28]);
1067
 
 
1068
 
        t=(base + val1 + val2 + val3) >> 17;
1069
 
        out[10]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1070
 
        t=(base - val1 - val2 + val3 + C4 + C16 - C20) >> 17;
1071
 
        out[13]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1072
 
        t=(base - val1 + val2 - val3) >> 17;
1073
 
        out[18]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1074
 
        t=(base + val1 - val2 - val3 + C4) >> 17;
1075
 
        out[21]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1076
 
 
1077
 
// 11,12,19,20
 
1066
        val3 += TIMES_12538(coeff[8] - coeff[12]);
 
1067
        val3 -= TIMES_30270(coeff[24] - coeff[28]);
 
1068
 
 
1069
        t = (base + val1 + val2 + val3) >> 17;
 
1070
        out[10] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1071
        t = (base - val1 - val2 + val3 + C4 + C16 - C20) >> 17;
 
1072
        out[13] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1073
        t = (base - val1 + val2 - val3) >> 17;
 
1074
        out[18] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1075
        t = (base + val1 - val2 - val3 + C4) >> 17;
 
1076
        out[21] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1077
 
 
1078
        // 11,12,19,20
1078
1079
 
1079
1080
        base = 0x1000000;
1080
 
        base += coeff[0]+coeff[4]-coeff[16]-coeff[20];
 
1081
        base += coeff[0] + coeff[4] - coeff[16] - coeff[20];
1081
1082
        base -= TIMES_30270(C2_18);
1082
1083
        base -= TIMES_12538(C6_22);
1083
1084
 
1095
1096
        val3 = -TIMES_16382(coeff[10] - coeff[30]);
1096
1097
        val3 -= TIMES_6785(coeff[14]);
1097
1098
        val3 += TIMES_39550(coeff[26]);
1098
 
        val3 -= TIMES_30270(coeff[24]+coeff[28]);
1099
 
        val3 += TIMES_12538(coeff[8]+coeff[12]);
 
1099
        val3 -= TIMES_30270(coeff[24] + coeff[28]);
 
1100
        val3 += TIMES_12538(coeff[8] + coeff[12]);
1100
1101
 
1101
1102
        tmp1 = TIMES_32134(C7_23);
1102
1103
        tmp2 = -TIMES_17391(coeff[15]) + TIMES_41986(coeff[31]);
1103
1104
 
1104
 
        t=(base + val1 + val2 + val3 - tmp1 + tmp2 + C16 + C20) >> 17;
1105
 
        out[11]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1106
 
        t=(base - val1 - val2 + val3 + C16 + C20) >> 17;
1107
 
        out[12]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1108
 
        t=(base - val1 + val2 - val3 - tmp1 - tmp2 - C4 + C20) >> 17;
1109
 
        out[19]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
1110
 
        t=(base + val1 - val2 - val3) >> 17;
1111
 
        out[20]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;
 
1105
        t = (base + val1 + val2 + val3 - tmp1 + tmp2 + C16 + C20) >> 17;
 
1106
        out[11] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1107
        t = (base - val1 - val2 + val3 + C16 + C20) >> 17;
 
1108
        out[12] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1109
        t = (base - val1 + val2 - val3 - tmp1 - tmp2 - C4 + C20) >> 17;
 
1110
        out[19] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
 
1111
        t = (base + val1 - val2 - val3) >> 17;
 
1112
        out[20] = t & 0xFFFFFF00 ? t < 0 ? 0 : 255 : (unsigned char)t;
1112
1113
}
1113
1114
 
1114
1115
#undef TIMES_16382
1140
1141
 */
1141
1142
static int
1142
1143
decompress8x4(unsigned char     *pOut,
1143
 
              unsigned char     *pIn,
1144
 
              int               *lastDC,
1145
 
              int               uvFlag,
1146
 
              struct comp_info  *cinfo)
 
1144
                unsigned char   *pIn,
 
1145
                int             *lastDC,
 
1146
                int             uvFlag,
 
1147
                struct comp_info        *cinfo)
1147
1148
{
1148
1149
        int i, x, y, dc;
1149
1150
        int coeffs[32];
1152
1153
        int *src;
1153
1154
        unsigned char *qt = cinfo->qt;
1154
1155
 
1155
 
        if (! uvFlag) {
1156
 
                huffmanDecoderY(coeffs, (int*) pIn, cinfo);
 
1156
        if (!uvFlag) {
 
1157
                huffmanDecoderY(coeffs, (int *)pIn, cinfo);
1157
1158
 
1158
1159
                /* iDPCM and dequantize first coefficient */
1159
1160
                dc = (*lastDC) + coeffs[0];
1167
1168
                for (i = 2; i < 32; i++)
1168
1169
                        coeffs[i] = (qt[i] + 1) * coeffs[i];
1169
1170
        } else {
1170
 
                huffmanDecoderUV(coeffs, (int*) pIn, cinfo);
 
1171
                huffmanDecoderUV(coeffs, (int *)pIn, cinfo);
1171
1172
 
1172
1173
                /* iDPCM */
1173
1174
                dc = (*lastDC) + coeffs[0];
1187
1188
        src = deZigZag;
1188
1189
        dest = coeffs;
1189
1190
        for (y = 0; y <= 3; ++y) {
1190
 
                for (x = 0; x <= 7; ++x) {
 
1191
                for (x = 0; x <= 7; ++x)
1191
1192
                        dest[x] = src[x * 4];
1192
 
                }
1193
1193
                src += 1;
1194
1194
                dest += 8;
1195
1195
        }
1219
1219
#if 0
1220
1220
static inline int
1221
1221
decompress400NoMMXOV518(unsigned char    *pIn,
1222
 
                        unsigned char    *pOut,
1223
 
                        unsigned char    *pTmp,
1224
 
                        const int        w,
1225
 
                        const int        h,
1226
 
                        const int        numpix,
1227
 
                        struct comp_info *cinfo)
 
1222
                unsigned char    *pOut,
 
1223
                unsigned char    *pTmp,
 
1224
                const int        w,
 
1225
                const int        h,
 
1226
                const int        numpix,
 
1227
                struct comp_info *cinfo)
1228
1228
{
1229
1229
        int iOutY, x, y;
1230
1230
        int lastYDC = 0;
1257
1257
 
1258
1258
static inline int
1259
1259
decompress420NoMMXOV518(unsigned char    *pIn,
1260
 
                        unsigned char    *pOut,
1261
 
                        unsigned char    *pTmp,
1262
 
                        const int        w,
1263
 
                        const int        h,
1264
 
                        const int        numpix,
1265
 
                        struct comp_info *cinfo,
1266
 
                        int yvu)
 
1260
                unsigned char    *pOut,
 
1261
                unsigned char    *pTmp,
 
1262
                const int        w,
 
1263
                const int        h,
 
1264
                const int        numpix,
 
1265
                struct comp_info *cinfo,
 
1266
                int yvu)
1267
1267
{
1268
1268
        unsigned char *pOutU, *pOutV;
1269
1269
        int iOutY, iOutU, iOutV, x, y;
1339
1339
        int rawLen = cinfo->rawLen;
1340
1340
 
1341
1341
        /* Make sure input is actually big enough to hold trailer */
1342
 
        if (rawLen < 72) {
 
1342
        if (rawLen < 72)
1343
1343
                return -1;
1344
 
        }
1345
1344
 
1346
1345
        cinfo->qt = pIn + rawLen - 64;
1347
1346
 
1371
1370
 */
1372
1371
static int
1373
1372
Decompress400(unsigned char *pIn,
1374
 
              unsigned char *pOut,
1375
 
              int            w,
1376
 
              int            h,
1377
 
              int            inSize)
 
1373
                unsigned char *pOut,
 
1374
                int          w,
 
1375
                int          h,
 
1376
                int          inSize)
1378
1377
{
1379
1378
        struct comp_info cinfo;
1380
1379
        int numpix = w * h;
1391
1390
 
1392
1391
        /* Decompress, skipping the 8-byte SOF header */
1393
1392
        if (decompress400NoMMXOV518(pIn + 8, pOut, pTmp, w, h, numpix, &cinfo))
1394
 
//              return 0;
 
1393
                /*              return 0; */
1395
1394
                ; /* Don't return error yet */
1396
1395
 
1397
 
        return (numpix);
 
1396
        return numpix;
1398
1397
}
1399
1398
#endif
1400
1399
 
1404
1403
 * Returns uncompressed data length if success, or zero if error
1405
1404
 */
1406
1405
static int v4lconvert_ov518_to_yuv420(unsigned char *src, unsigned char *dst,
1407
 
  int w, int h, int yvu, int inSize)
 
1406
                int w, int h, int yvu, int inSize)
1408
1407
{
1409
1408
        struct comp_info cinfo;
1410
1409
        int numpix = w * h;
1428
1427
 
1429
1428
int main(int argc, char *argv[])
1430
1429
{
1431
 
  int width, height, yvu, src_size, dest_size;
1432
 
  unsigned char src_buf[200000];
1433
 
  unsigned char dest_buf[500000];
1434
 
 
1435
 
  while (1) {
1436
 
    if (v4lconvert_helper_read(STDIN_FILENO, &width, sizeof(int), argv[0]))
1437
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1438
 
 
1439
 
    if (v4lconvert_helper_read(STDIN_FILENO, &height, sizeof(int), argv[0]))
1440
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1441
 
 
1442
 
    if (v4lconvert_helper_read(STDIN_FILENO, &yvu, sizeof(int), argv[0]))
1443
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1444
 
 
1445
 
    if (v4lconvert_helper_read(STDIN_FILENO, &src_size, sizeof(int), argv[0]))
1446
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1447
 
 
1448
 
    if (src_size > sizeof(src_buf)) {
1449
 
      fprintf(stderr, "%s: error: src_buf too small, need: %d\n",
1450
 
              argv[0], src_size);
1451
 
      return 2;
1452
 
    }
1453
 
 
1454
 
    if (v4lconvert_helper_read(STDIN_FILENO, src_buf, src_size, argv[0]))
1455
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1456
 
 
1457
 
 
1458
 
    dest_size = width * height * 3 / 2;
1459
 
    if (dest_size > sizeof(dest_buf)) {
1460
 
      fprintf(stderr, "%s: error: dest_buf too small, need: %d\n",
1461
 
              argv[0], dest_size);
1462
 
      dest_size = -1;
1463
 
    } else if (v4lconvert_ov518_to_yuv420(src_buf, dest_buf, width, height,
1464
 
                                          yvu, src_size))
1465
 
      dest_size = -1;
1466
 
 
1467
 
    if (v4lconvert_helper_write(STDOUT_FILENO, &dest_size, sizeof(int),
1468
 
                                argv[0]))
1469
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1470
 
 
1471
 
    if (dest_size == -1)
1472
 
      continue;
1473
 
 
1474
 
    if (v4lconvert_helper_write(STDOUT_FILENO, dest_buf, dest_size, argv[0]))
1475
 
      return 1; /* Erm, no way to recover without loosing sync with libv4l */
1476
 
  }
 
1430
        int width, height, yvu, src_size, dest_size;
 
1431
        unsigned char src_buf[200000];
 
1432
        unsigned char dest_buf[500000];
 
1433
 
 
1434
        while (1) {
 
1435
                if (v4lconvert_helper_read(STDIN_FILENO, &width, sizeof(int), argv[0]))
 
1436
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1437
 
 
1438
                if (v4lconvert_helper_read(STDIN_FILENO, &height, sizeof(int), argv[0]))
 
1439
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1440
 
 
1441
                if (v4lconvert_helper_read(STDIN_FILENO, &yvu, sizeof(int), argv[0]))
 
1442
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1443
 
 
1444
                if (v4lconvert_helper_read(STDIN_FILENO, &src_size, sizeof(int), argv[0]))
 
1445
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1446
 
 
1447
                if (src_size > sizeof(src_buf)) {
 
1448
                        fprintf(stderr, "%s: error: src_buf too small, need: %d\n",
 
1449
                                        argv[0], src_size);
 
1450
                        return 2;
 
1451
                }
 
1452
 
 
1453
                if (v4lconvert_helper_read(STDIN_FILENO, src_buf, src_size, argv[0]))
 
1454
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1455
 
 
1456
 
 
1457
                dest_size = width * height * 3 / 2;
 
1458
                if (dest_size > sizeof(dest_buf)) {
 
1459
                        fprintf(stderr, "%s: error: dest_buf too small, need: %d\n",
 
1460
                                        argv[0], dest_size);
 
1461
                        dest_size = -1;
 
1462
                } else if (v4lconvert_ov518_to_yuv420(src_buf, dest_buf, width, height,
 
1463
                                        yvu, src_size))
 
1464
                        dest_size = -1;
 
1465
 
 
1466
                if (v4lconvert_helper_write(STDOUT_FILENO, &dest_size, sizeof(int),
 
1467
                                        argv[0]))
 
1468
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1469
 
 
1470
                if (dest_size == -1)
 
1471
                        continue;
 
1472
 
 
1473
                if (v4lconvert_helper_write(STDOUT_FILENO, dest_buf, dest_size, argv[0]))
 
1474
                        return 1; /* Erm, no way to recover without loosing sync with libv4l */
 
1475
        }
1477
1476
}