Esempio n. 1
0
        public byte[] getACArray(List <byte[]> input)
        {
            List <short>      list      = new List <short>();
            pairValues        tempValue = new pairValues();
            List <pairValues> pairList  = new List <pairValues>();
            byte zeroCounter            = 0;

            for (int g = 0; g < input.Count; g++)
            {
                for (int i = 1; i < input[g].Length; i++)
                {
                    if (i == input[g].Length - 1 && input[g][i] == 0)
                    {
                        tempValue.zeros = 0;
                        tempValue.value = 0;
                        pairList.Add(tempValue);
                    }

                    if (zeroCounter == 16)
                    {
                        tempValue.zeros = 15;
                        tempValue.value = 0;
                        pairList.Add(tempValue);

                        zeroCounter = 0;
                    }

                    else if (input[g][i] == 0)
                    {
                        zeroCounter++;
                    }
                    else
                    {
                        tempValue.zeros = zeroCounter;
                        zeroCounter     = 0;
                        tempValue.value = input[g][i];
                        pairList.Add(tempValue);
                    }
                }
            }
            byte[]       streamArray;
            short[]      array     = list.ToArray();
            pairValues[] pairArray = pairList.ToArray();
            streamArray = new byte[pairArray.Length];
            pairList.Clear();


            for (int i = 0; i < pairArray.Length; i++)
            {
                pairArray[i].category = getCategory(pairArray[i].value);

                if (pairArray[i].value < 0)
                {
                    pairArray[i].value = (short)(~(-pairArray[i].value));
                }
                //nur so viele bits von rechts nehmen wie in kategorie sagt
                pairArray[i].merged = connectBytes(pairArray[i].zeros, pairArray[i].category);
                streamArray[i]      = pairArray[i].merged;
            }
            return(streamArray);
        }
Esempio n. 2
0
        public RLEObject encodeACRunLength()
        {
            List <pairValues> pairList = new List <pairValues>();
            RLEObject         RLEobj   = new RLEObject();


            List <Bitstream> finalStreamList = new List <Bitstream>();

            byte[] streamArray;

            byte[]  acArray           = getACArray(input);
            short[] dcDifferenceArray = getDCDifferenceArray(input);
            var     dcCategoryArray   = dcDifferenceArray.Select(getCategory).ToArray();

            for (int g = 0; g < input.Count; g++)
            {
                byte       zeroCounter = 0;
                pairValues tempValue   = new pairValues();
                for (int i = 1; i < input[g].Length; i++)
                {
                    if (i == input[g].Length - 1 && input[g][i] == 0)
                    {
                        tempValue.zeros = 0;
                        tempValue.value = 0;
                        pairList.Add(tempValue);
                    }

                    if (zeroCounter == 16)
                    {
                        tempValue.zeros = 15;
                        tempValue.value = 0;
                        pairList.Add(tempValue);

                        zeroCounter = 0;
                    }

                    else if (input[g][i] == 0)
                    {
                        zeroCounter++;
                    }
                    else
                    {
                        tempValue.zeros = zeroCounter;
                        zeroCounter     = 0;
                        tempValue.value = input[g][i];
                        pairList.Add(tempValue);
                    }
                }


                pairValues[] pairArray = pairList.ToArray();
                streamArray = new byte[pairArray.Length];
                pairList.Clear();


                for (int i = 0; i < pairArray.Length; i++)
                {
                    pairArray[i].category = getCategory(pairArray[i].value);

                    if (pairArray[i].value < 0)
                    {
                        pairArray[i].value = (short)(~(-pairArray[i].value));
                    }
                    //nur so viele bits von rechts nehmen wie in kategorie sagt
                    pairArray[i].merged = connectBytes(pairArray[i].zeros, pairArray[i].category);
                    streamArray[i]      = pairArray[i].merged;
                }

                HuffmanEncoder coder = new HuffmanEncoder();
                SortedList <byte, List <bool> > huffmantable = new SortedList <byte, List <bool> >();
                //MemoryStream stream = new MemoryStream(acArray);
                //coder.PrepareEncodingRightsided(stream);
                huffmantable           = coder.getHuffmanTable();
                RLEobj.huffmantablesAC = huffmantable;
                List <bool> encodedList  = new List <bool>();
                Bitstream   outputStream = new Bitstream();


                pairDC pair = new pairDC();
                pair.value = dcDifferenceArray[g];
                MemoryStream   hufstream = new MemoryStream(dcCategoryArray);
                HuffmanEncoder coderDC   = new HuffmanEncoder();
                SortedList <byte, List <bool> > hufmantable = new SortedList <byte, List <bool> >();
                coderDC.PrepareEncodingRightsided(hufstream);
                hufmantable   = coderDC.getHuffmanTable();
                pair.category = getCategory(pair.value); //huffman codieren
                List <bool> encodedListDC = new List <bool>();
                encodedListDC          = hufmantable[pair.category];
                RLEobj.huffmantablesDC = (hufmantable);

                for (int z = 0; z < encodedListDC.Count; z++)
                {
                    outputStream.AddBit(encodedListDC[z]);
                }

                for (int z = 0; z < pair.category; z++)
                {
                    outputStream.AddBit(getBit(pair.value, z));
                }


                for (int i = 0; i < pairArray.Length; i++)
                {
                    encodedList = huffmantable[pairArray[i].merged];
                    for (int z = 0; z < encodedList.Count; z++)
                    {
                        outputStream.AddBit(encodedList[z]);
                    }
                    for (int z = 0; z < pairArray[i].category; z++)
                    {
                        outputStream.AddBit(getBit(pairArray[i].value, z));
                    }
                }

                finalStreamList.Add(outputStream);
            }
            RLEobj.bitstreams = finalStreamList;
            return(RLEobj);
        }