示例#1
0
        public JpegReadStatusInt DecodeACFirst(JpegBinaryReader stream, float[] zz)
        {
            if (stream.eobRun > 0)
            {
                stream.eobRun--;
                return(JpegReadStatusInt.GetSuccess());
            }

            for (int k = spectralStart; k <= spectralEnd; k++)
            {
                var status = ACTable.Decode(stream);
                if (status.Status != Status.Success)
                {
                    return(status);
                }
                int s = status.Result;
                int r = s >> 4;
                s &= 15;

                if (s != 0)
                {
                    k     += r;
                    status = stream.ReadBits(s);
                    if (status.Status != Status.Success)
                    {
                        return(status);
                    }
                    r     = status.Result;
                    s     = HuffmanTable.Extend(r, s);
                    zz[k] = s << successiveLow;
                }
                else
                {
                    if (r != 15)
                    {
                        stream.eobRun = 1 << r;

                        if (r != 0)
                        {
                            status = stream.ReadBits(r);
                            if (status.Status != Status.Success)
                            {
                                return(status);
                            }
                            stream.eobRun += status.Result;
                        }

                        stream.eobRun--;
                        break;
                    }

                    k += 15;
                }
            }
            return(JpegReadStatusInt.GetSuccess());
        }
示例#2
0
        /// <summary>
        /// Generated from text on F-23, F.13 - Huffman decoded of AC coefficients
        /// on ISO DIS 10918-1. Requirements and Guidelines.
        /// </summary>
        internal JpegReadStatusInt decode_ac_coefficients(JpegBinaryReader jpegStream, float[] zz)
        {
            var status = new JpegReadStatusInt();

            for (int k = 1; k < 64; k++)
            {
                status = ACTable.Decode(jpegStream);
                if (status.Status != Status.Success)
                {
                    return(status);
                }
                int s = status.Result;
                int r = s >> 4;
                s &= 15;

                if (s != 0)
                {
                    k     += r;
                    status = jpegStream.ReadBits(s);
                    if (status.Status != Status.Success)
                    {
                        return(status);
                    }
                    s     = HuffmanTable.Extend(status.Result, s);
                    zz[k] = s;
                }
                else
                {
                    if (r != 15)
                    {
                        //throw new JPEGMarkerFoundException();
                        return(status);
                    }
                    k += 15;
                }
            }
            return(status);
        }
示例#3
0
        public JpegReadStatusInt DecodeACRefine(JpegBinaryReader stream, float[] dest)
        {
            int p1 = 1 << successiveLow;
            int m1 = (-1) << successiveLow;

            int k = spectralStart;

            if (stream.eobRun == 0)
            {
                for (; k <= spectralEnd; k++)
                {
                    #region Decode and check S

                    var status = ACTable.Decode(stream);
                    if (status.Status != Status.Success)
                    {
                        return(status);
                    }
                    int s = status.Result;
                    int r = s >> 4;
                    s &= 15;

                    if (s != 0)
                    {
                        if (s != 1)
                        {
                            throw new Exception("Decode Error");
                        }

                        status = stream.ReadBits(1);
                        if (status.Status != Status.Success)
                        {
                            return(status);
                        }
                        s = status.Result == 1 ? p1 : m1;
                    }
                    else
                    {
                        if (r != 15)
                        {
                            stream.eobRun = 1 << r;

                            if (r > 0)
                            {
                                status = stream.ReadBits(r);
                                if (status.Status != Status.Success)
                                {
                                    return(status);
                                }
                                stream.eobRun += status.Result;
                            }
                            break;
                        }
                    }                     // if (s != 0)

                    #endregion

                    // Apply the update
                    do
                    {
                        if (dest[k] != 0)
                        {
                            status = stream.ReadBits(1);
                            if (status.Status != Status.Success)
                            {
                                return(status);
                            }
                            if (status.Result == 1)
                            {
                                if (((int)dest[k] & p1) == 0)
                                {
                                    if (dest[k] >= 0)
                                    {
                                        dest[k] += p1;
                                    }
                                    else
                                    {
                                        dest[k] += m1;
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (--r < 0)
                            {
                                break;
                            }
                        }

                        k++;
                    } while (k <= spectralEnd);

                    if ((s != 0) && k < 64)
                    {
                        dest[k] = s;
                    }
                }                 // for k = start ... end
            }
            if (stream.eobRun > 0)
            {
                for (; k <= spectralEnd; k++)
                {
                    if (dest[k] != 0)
                    {
                        var status = stream.ReadBits(1);
                        if (status.Status != Status.Success)
                        {
                            return(status);
                        }
                        if (status.Result == 1)
                        {
                            if (((int)dest[k] & p1) == 0)
                            {
                                if (dest[k] >= 0)
                                {
                                    dest[k] += p1;
                                }
                                else
                                {
                                    dest[k] += m1;
                                }
                            }
                        }
                    }
                }

                stream.eobRun--;
            }
            return(JpegReadStatusInt.GetSuccess());
        }