CSJ2K.j2k.util.CodestreamManipulator.writeNewCodestream C# (CSharp) Метод

writeNewCodestream() приватный Метод

This method writes the new codestream to the file.
If an I/O error ocurred. /// ///
private writeNewCodestream ( BufferedRandomAccessFile fi ) : void
fi CSJ2K.j2k.io.BufferedRandomAccessFile The file to write the new codestream to /// ///
Результат void
        private void writeNewCodestream(BufferedRandomAccessFile fi)
        {
            int t, p, tp; // i removed
            int numTiles = tileParts.Length;
            int[][] packetHeaderLengths = new int[numTiles][];
            for (int i2 = 0; i2 < numTiles; i2++)
            {
                packetHeaderLengths[i2] = new int[maxtp];
            }
            byte[] temp;
            int length;

            // Write main header up to SOT marker
            fi.write(mainHeader, 0, mainHeader.Length);

            // If PPM used write all packet headers in PPM markers
            if (ppmUsed)
            {
                System.IO.MemoryStream ppmMarkerSegment = new System.IO.MemoryStream();
                int numPackets;
                int totNumPackets;
                int ppmIndex = 0;
                int ppmLength;
                int pStart, pStop;
                int[] prem = new int[numTiles];

                // Set number of remaining packets
                for (t = 0; t < numTiles; t++)
                {
                    prem[t] = packetHeaders[t].Length;
                }

                // Calculate Nppm values
                for (tp = 0; tp < maxtp; tp++)
                {
                    for (t = 0; t < numTiles; t++)
                    {
                        if (tileParts[t].Length > tp)
                        {
                            totNumPackets = packetHeaders[t].Length;
                            // Calculate number of packets in this tilepart
                            numPackets = (tp == tileParts[t].Length - 1)?prem[t]:pptp;

                            pStart = totNumPackets - prem[t];
                            pStop = pStart + numPackets;

                            // Calculate number of packet header bytes for this
                            // tile part
                            for (p = pStart; p < pStop; p++)
                                packetHeaderLengths[t][tp] += packetHeaders[t][p].Length;

                            prem[t] -= numPackets;
                        }
                    }
                }

                // Write first PPM marker
                ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
                ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
                ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
                ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
                ppmMarkerSegment.WriteByte((System.Byte) 0); // zppm
                ppmLength = 3;
                ppmIndex++;

                // Set number of remaining packets
                for (t = 0; t < numTiles; t++)
                    prem[t] = packetHeaders[t].Length;

                // Write all PPM markers and information
                for (tp = 0; tp < maxtp; tp++)
                {
                    for (t = 0; t < numTiles; t++)
                    {

                        if (tileParts[t].Length > tp)
                        {
                            totNumPackets = packetHeaders[t].Length;

                            // Calculate number of packets in this tilepart
                            numPackets = (tp == tileParts[t].Length - 1)?prem[t]:pptp;

                            pStart = totNumPackets - prem[t];
                            pStop = pStart + numPackets;

                            // If Nppm value wont fit in current PPM marker segment
                            // write current PPM marker segment and start new
                            if (ppmLength + 4 > CSJ2K.j2k.codestream.Markers.MAX_LPPM)
                            {
                                // Write current PPM marker
                                temp = ppmMarkerSegment.ToArray();
                                length = temp.Length - 2;
                                temp[2] = (byte) (SupportClass.URShift(length, 8));
                                temp[3] = (byte) length;
                                fi.write(temp, 0, length + 2);

                                // Start new PPM marker segment
                                //UPGRADE_ISSUE: Method 'java.io.ByteArrayOutputStream.reset' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioByteArrayOutputStreamreset'"
                                //ppmMarkerSegment.reset();
                                ppmMarkerSegment.SetLength(0);
                                ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
                                ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
                                ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
                                ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
                                ppmMarkerSegment.WriteByte((System.Byte) ppmIndex++); // zppm
                                ppmLength = 3;
                            }

                            // Write Nppm value
                            length = packetHeaderLengths[t][tp];
                            ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 24));
                            ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 16));
                            ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 8));
                            ppmMarkerSegment.WriteByte((System.Byte) length);
                            ppmLength += 4;

                            // Write packet headers
                            for (p = pStart; p < pStop; p++)
                            {
                                length = packetHeaders[t][p].Length;

                                // If next packet header value wont fit in
                                // current PPM marker segment write current PPM
                                // marker segment and start new
                                if (ppmLength + length > CSJ2K.j2k.codestream.Markers.MAX_LPPM)
                                {
                                    // Write current PPM marker
                                    temp = ppmMarkerSegment.ToArray();
                                    length = temp.Length - 2;
                                    temp[2] = (byte) (SupportClass.URShift(length, 8));
                                    temp[3] = (byte) length;
                                    fi.write(temp, 0, length + 2);

                                    // Start new PPM marker segment
                                    //UPGRADE_ISSUE: Method 'java.io.ByteArrayOutputStream.reset' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioByteArrayOutputStreamreset'"
                                    //ppmMarkerSegment.reset();
                                    ppmMarkerSegment.SetLength(0);
                                    ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
                                    ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
                                    ppmMarkerSegment.WriteByte((System.Byte) 0); // Temp Lppm value
                                    ppmMarkerSegment.WriteByte((System.Byte) 0); // Temp Lppm value
                                    ppmMarkerSegment.WriteByte((System.Byte) ppmIndex++); // zppm
                                    ppmLength = 3;
                                }

                                // write packet header
                                ppmMarkerSegment.Write(packetHeaders[t][p], 0, packetHeaders[t][p].Length);
                                ppmLength += packetHeaders[t][p].Length;
                            }
                            prem[t] -= numPackets;
                        }
                    }
                }
                // Write last PPM marker segment
                temp = ppmMarkerSegment.ToArray();
                length = temp.Length - 2;
                temp[2] = (byte) (SupportClass.URShift(length, 8));
                temp[3] = (byte) length;
                fi.write(temp, 0, length + 2);
            }

            // Write tile parts interleaved
            for (tp = 0; tp < maxtp; tp++)
            {
                for (t = 0; t < nt; t++)
                {
                    if (tileParts[t].Length > tp)
                    {
                        temp = tileParts[t][tp];
                        length = temp.Length;
                        fi.write(temp, 0, length);
                    }
                }
            }
            fi.writeShort(CSJ2K.j2k.codestream.Markers.EOC);
        }