Package bdsup2sub.supstream

Examples of bdsup2sub.supstream.ImageObjectFragment


        imageObject.setBufferSize(28390);
        imageObject.setWidth(1920);
        imageObject.setHeight(125);
        imageObject.setXOffset(0);
        imageObject.setYOffset(931);
        ImageObjectFragment imageObjectFragment = new ImageObjectFragment(174, 28390);
        imageObject.getFragmentList().add(imageObjectFragment);
        imageObjectList.add(imageObject);
    }
View Full Code Here


        int rleSize = 0;
        int rleBufferFound = 0;
        int ctrlSize = -1;
        int ctrlHeaderCopied = 0;
        byte ctrlHeader[] = null;
        ImageObjectFragment rleFrag;
        int length;
        int packHeaderSize;
        boolean firstPackFound = false;

        try {
            do {
                // 4 bytes:  packet identifier 0x000001ba
                long startOfs = ofs;
                if (buffer.getDWord(ofs) != 0x000001ba) {
                    throw new CoreException("Missing packet identifier at ofs " + ToolBox.toHexLeftZeroPadded(ofs,8));
                }
                // 6 bytes:  system clock reference
                // 3 bytes:  multiplexer rate
                // 1 byte:   stuffing info
                int stuffOfs = buffer.getByte(ofs+=13) & 7;
                // 4 bytes:  sub packet ID 0x000001bd
                if (buffer.getDWord(ofs += (1+stuffOfs)) != 0x000001bd) {
                    throw new CoreException("Missing packet identifier at ofs " + ToolBox.toHexLeftZeroPadded(ofs,8));
                }
                // 2 bytes:  packet length (number of bytes after this entry)
                length = buffer.getWord(ofs+=4);
                nextOfs = ofs+2+length;
                // 2 bytes:  packet type
                ofs += 2;
                packHeaderSize = (int)(ofs-startOfs);
                boolean firstPack = ((buffer.getByte(++ofs) & 0x80) == 0x80);
                // 1 byte    pts length
                int ptsLength = buffer.getByte(ofs+=1);
                ofs += 1 + ptsLength; // skip PTS and stream ID
                int packetStreamID = buffer.getByte(ofs++) - 0x20;
                if (packetStreamID != streamID) {
                    // packet doesn't belong to stream -> skip
                    if (nextOfs % 0x800 != 0) {
                        ofs = (nextOfs/0x800 + 1)*0x800;
                        logger.warn("Offset to next fragment is invalid. Fixed to:" + ToolBox.toHexLeftZeroPadded(ofs, 8) + "\n");
                    } else {
                        ofs = nextOfs;
                    }
                    ctrlOfs += 0x800;
                    continue;
                }
                int headerSize = (int)(ofs-startOfs); // only valid for additional packets
                if (firstPack && ptsLength >= 5) {
                    int size = buffer.getWord(ofs);
                    ofs += 2;
                    ctrlOfsRel = buffer.getWord(ofs);
                    rleSize = ctrlOfsRel-2;             // calculate size of RLE buffer
                    ctrlSize = size-ctrlOfsRel-2;       // calculate size of control header
                    if (ctrlSize < 0) {
                        throw new CoreException("Invalid control buffer size");
                    }
                    ctrlHeader = new byte[ctrlSize];
                    ctrlOfs = ctrlOfsRel + ofs; // might have to be corrected for multiple packets
                    ofs += 2;
                    headerSize = (int)(ofs-startOfs);
                    pic.setRleFragments(new ArrayList<ImageObjectFragment>());
                    firstPackFound = true;
                } else {
                    if (firstPackFound) {
                        ctrlOfs += headerSize; // fix absolute offset by adding header bytes
                    } else {
                        logger.warn("Invalid fragment skipped at ofs " + ToolBox.toHexLeftZeroPadded(startOfs, 8) + "\n");
                    }
                }

                // check if control header is (partly) in this packet
                int diff = (int)(nextOfs - ctrlOfs - ctrlHeaderCopied);
                if (diff<0) {
                    diff = 0;
                }
                int copied = ctrlHeaderCopied;
                try {
                    for (int i=0; (i < diff) && (ctrlHeaderCopied<ctrlSize); i++) {
                        ctrlHeader[ctrlHeaderCopied] = (byte)buffer.getByte(ctrlOfs + i + copied);
                        ctrlHeaderCopied++;
                    }
                } catch (ArrayIndexOutOfBoundsException ex) {
                    throw new CoreException("Inconsistent control buffer access (" + ex.getMessage() + ")");
                }
                rleFrag = new ImageObjectFragment(ofs, length - headerSize - diff + packHeaderSize);
                pic.getRleFragments().add(rleFrag);

                rleBufferFound += rleFrag.getImagePacketSize();

                if (ctrlHeaderCopied != ctrlSize && (nextOfs % 0x800 != 0)) {
                    ofs = (nextOfs/0x800 + 1) * 0x800;
                    logger.warn("Offset to next fragment is invalid. Fixed to:" + ToolBox.toHexLeftZeroPadded(ofs, 8) + "\n");
                    rleBufferFound += ofs-nextOfs;
View Full Code Here

    private long readSupFrame(long offset, FileBuffer buffer) throws CoreException  {
        long ctrlOffset;
        int  ctrlOfsRel;
        int  rleSize;
        int  ctrlSize;
        ImageObjectFragment rleFrag;
        int  length;
        byte[] ctrlHeader;

        try {
            // 2 bytes:  packet identifier 0x5350
            long startOffset = offset;
            if (buffer.getWord(offset) != 0x5350) {
                throw new CoreException("Missing packet identifier at offset " + ToolBox.toHexLeftZeroPadded(offset, 8));
            }
            // 8 bytes PTS:  system clock reference, but use only the first 4
            SubPictureDVD pic = new SubPictureDVD();
            pic.setOffset(offset);
            pic.setWidth(screenWidth);
            pic.setHeight(screenHeight);

            int pts = buffer.getDWordLE(offset += 2);
            pic.setStartTime(pts);
            // 2 bytes:  packet length (number of bytes after this entry)
            length = buffer.getWord(offset += 8);
            // 2 bytes: offset to control buffer
            ctrlOfsRel = buffer.getWord(offset += 2);
            rleSize = ctrlOfsRel - 2;           // calculate size of RLE buffer
            ctrlSize = length - ctrlOfsRel - 2; // calculate size of control header
            if (ctrlSize < 0) {
                throw new CoreException("Invalid control buffer size");
            }
            ctrlOffset = ctrlOfsRel + offset;   // absolute offset of control header
            offset += 2;
            pic.setRleFragments(new ArrayList<ImageObjectFragment>(1));
            rleFrag = new ImageObjectFragment(offset, rleSize);
            pic.getRleFragments().add(rleFrag);
            pic.setRleSize(rleSize);

            pic.setPal(new int[4]);
            pic.setAlpha(new int[4]);
View Full Code Here

            subPictureBD.getImageObjectList().add(imageObject);
        } else {
            imageObject = subPictureBD.getImageObject(objectID);
        }

        ImageObjectFragment imageObjectFragment;
        if (imageObject.getFragmentList().isEmpty() || first) {  // 8bit  object_version_number
            // skipped:
            // 24bit object_data_length - full RLE buffer length (including 4 bytes size info)
            int width  = buffer.getWord(index + 7);       // object_width
            int height = buffer.getWord(index + 9);       // object_height

            if (width <= subPictureBD.getWidth() && height <= subPictureBD.getHeight()) {
                imageObjectFragment = new ImageObjectFragment(index + 11, pcsSegment.size - (index + 11 - pcsSegment.offset));
                imageObject.getFragmentList().add(imageObjectFragment);
                imageObject.setBufferSize(imageObjectFragment.getImagePacketSize());
                imageObject.setHeight(height);
                imageObject.setWidth(width);
                message.append("ID: ").append(objectID).append(", update: ").append(objectVersion).append(", seq: ").append((first ? "first" : "")).append(((first && last) ? "/" : "")).append((last ? "" + "last" : ""));
                return true;
            } else {
                logger.warn("Invalid image size - ignored\n");
                return false;
            }
        } else {
            // object_data_fragment
            // skipped:
            //  16bit object_id
            //  8bit  object_version_number
            //  8bit  first_in_sequence (0x80), last_in_sequence (0x40), 6bits reserved
            imageObjectFragment = new ImageObjectFragment(index + 4, pcsSegment.size - (index + 4 - pcsSegment.offset));
            imageObject.getFragmentList().add(imageObjectFragment);
            imageObject.setBufferSize(imageObject.getBufferSize() + imageObjectFragment.getImagePacketSize());
            message.append("ID: ").append(objectID).append(", update: ").append(objectVersion).append(", seq: ").append((first ? "first" : "")).append(((first && last) ? "/" : "")).append((last ? "" + "last" : ""));
            return false;
        }
    }
View Full Code Here

    public static Bitmap decodeImage(final SubPictureDVD pic, final FileBuffer fBuf, final int transIdx) throws CoreException {
        int w = pic.getOriginalWidth();
        int h = pic.getOriginalHeight();
        int warnings = 0;

        ImageObjectFragment info = pic.getRleFragments().get(0);
        long startOfs = info.getImageBufferOfs();

        if (w > pic.getWidth() || h > pic.getHeight()) {
            logger.warn("Subpicture too large: " + w + "x" + h
                    + " at offset " + ToolBox.toHexLeftZeroPadded(startOfs, 8) + "\n");
        }

        Bitmap bm = new Bitmap(w, h, (byte)transIdx);

        // copy buffer(s)
        byte buf[] = new byte[pic.getRleSize()];
        int index = 0;

        int sizeEven;
        int sizeOdd;

        if (pic.getOddOffset() > pic.getEvenOffset()) {
            sizeEven = pic.getOddOffset() - pic.getEvenOffset();
            sizeOdd = pic.getRleSize() - pic.getOddOffset();
        } else {
            sizeOdd = pic.getEvenOffset() - pic.getOddOffset();
            sizeEven = pic.getRleSize() - pic.getEvenOffset();
        }

        if (sizeEven <= 0 || sizeOdd <= 0)
            throw new CoreException("Corrupt buffer offset information");

        try {
            // copy buffers
            try {
                for (int p = 0; p < pic.getRleFragments().size(); p++) {
                    // copy data of all packet to one common buffer
                    info = pic.getRleFragments().get(p);
                    for (int i=0; i < info.getImagePacketSize(); i++) {
                        buf[index+i] = (byte)fBuf.getByte(info.getImageBufferOfs() + i);
                    }
                    index += info.getImagePacketSize();
                }
            } catch (ArrayIndexOutOfBoundsException ex) {
                warnings++;
            }
            // decode even lines
View Full Code Here

TOP

Related Classes of bdsup2sub.supstream.ImageObjectFragment

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.