Package bdsup2sub.core

Examples of bdsup2sub.core.CoreException


    public SupHD(String supFile) throws CoreException {
        try {
            buffer = new FileBuffer(supFile);
        } catch (FileBufferException ex) {
            throw new CoreException(ex.getMessage());
        }
        int bufsize = (int)buffer.getSize();

        SubPictureHD pic;
        int index = 0;
        try {
            while (index < bufsize) {
                if (Core.isCanceled()) {
                    throw new CoreException("Canceled by user!");
                }
                Core.setProgress(index);

                if (buffer.getWord(index) != 0x5350) {
                    throw new CoreException("ID 'SP' missing at index " + ToolBox.toHexLeftZeroPadded(index, 8) + "\n");
                }
                int masterIndex = index + 10; //end of header
                pic = new SubPictureHD();
                // hard code size since it's not part of the format???
                pic.setWidth(1920);
                pic.setHeight(1080);
                logger.info("#" + (subPictures.size() + 1) + "\n");
                pic.setStartTime(buffer.getDWordLE(index+=2)); // read PTS
                int packetSize = buffer.getDWord(index+=10);
                // offset to command buffer
                int ofsCmd = buffer.getDWord(index+=4) + masterIndex;
                pic.setImageBufferSize(ofsCmd - (index + 4));
                index  = ofsCmd;
                int dcsq = buffer.getWord(index);
                pic.setStartTime(pic.getStartTime() + (dcsq * 1024));
                logger.info("DCSQ start    ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "  (" + ptsToTimeStr(pic.getStartTime()) + ")\n");
                index += 2; // 2 bytes: dcsq
                int nextIndex = buffer.getDWord(index) + masterIndex; // offset to next dcsq
                index += 5// 4 bytes: offset, 1 byte: start
                int cmd;
                boolean stopDisplay = false;
                boolean stopCommand = false;
                int alphaSum;
                int minAlphaSum = 256 * 256; // 256 fully transparent entries
                while(!stopDisplay) {
                    cmd = buffer.getByte(index++);
                    switch (cmd) {
                        case 0x01:
                            logger.info("DCSQ start    ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "  (" + ptsToTimeStr(pic.getStartTime() + (dcsq * 1024)) + ")\n");
                            logger.warn("DCSQ start ignored due to missing DCSQ stop\n");
                            break;
                        case 0x02:
                            stopDisplay = true;
                            pic.setEndTime(pic.getStartTime() +(dcsq*1024));
                            logger.info("DCSQ stop     ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "  (" + ptsToTimeStr(pic.getEndTime()) + ")\n");
                            break;
                        case 0x83: // palette
                            logger.trace("Palette info  ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "\n");
                            pic.setPaletteOffset(index);
                            index += 0x300;
                            break;
                        case 0x84: // alpha
                            logger.trace("Alpha info    ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "\n");
                            alphaSum = 0;
                            for (int i=index; i < index+0x100; i++) {
                                alphaSum += buffer.getByte(i);
                            }
                            if (alphaSum < minAlphaSum) {
                                pic.setAlphaOffset(index);
                                minAlphaSum = alphaSum;
                            } else {
                                logger.warn("Found faded alpha buffer -> alpha buffer skipped\n");
                            }

                            index += 0x100;
                            break;
                        case 0x85: // area
                            pic.setOfsX((buffer.getByte(index)<<4) | (buffer.getByte(index+1)>>4));
                            pic.setImageWidth((((buffer.getByte(index+1)&0xf)<<8) | (buffer.getByte(index+2))) - pic.getXOffset() + 1);
                            pic.setOfsY((buffer.getByte(index+3)<<4) | (buffer.getByte(index+4)>>4));
                            pic.setImageHeight((((buffer.getByte(index+4)&0xf)<<8) | (buffer.getByte(index+5))) - pic.getYOffset() + 1);
                            logger.trace("Area info     ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "  ("
                                    + pic.getXOffset() + ", " + pic.getYOffset() + ") - (" + (pic.getXOffset() + pic.getImageWidth()) + ", "
                                    + (pic.getYOffset() + pic.getImageHeight()) + ")\n");
                            index += 6;
                            break;
                        case 0x86: // even/odd offsets
                            pic.setImageBufferOffsetEven(buffer.getDWord(index) + masterIndex);
                            pic.setImageBufferOffsetOdd(buffer.getDWord(index+4) + masterIndex);
                            logger.trace("RLE buffers   ofs: " + ToolBox.toHexLeftZeroPadded(index, 8)
                                    + "  (even: " + ToolBox.toHexLeftZeroPadded(pic.getImageBufferOffsetEven(), 8)
                                    + ", odd: " + ToolBox.toHexLeftZeroPadded(pic.getImageBufferOffsetOdd(), 8) + "\n");
                            index += 8;
                            break;
                        case 0xff:
                            if (stopCommand) {
                                logger.warn("DCSQ stop missing.\n");
                                for (++index; index < bufsize; index++)
                                    if (buffer.getByte(index++) != 0xff) {
                                        index--;
                                        break;
                                    }
                                stopDisplay = true;
                            } else {
                                index = nextIndex;
                                // add to display time
                                int d = buffer.getWord(index);
                                dcsq = d;
                                nextIndex = buffer.getDWord(index+2) + masterIndex;
                                stopCommand = (index == nextIndex);
                                logger.trace("DCSQ          ofs: " + ToolBox.toHexLeftZeroPadded(index, 8) + "  (" + (d * 1024 / 90)
                                        + "ms),    next DCSQ at ofs: " + ToolBox.toHexLeftZeroPadded(nextIndex, 8) + "\n");
                                index += 6;
                            }
                            break;
                        default:
                            throw new CoreException("Unexpected command " + cmd + " at index " + ToolBox.toHexLeftZeroPadded(index, 8));
                    }
                }
                index = masterIndex + packetSize;
                subPictures.add(pic);
            }
        } catch (CoreException ex) {
            if (subPictures.size() == 0) {
                throw ex;
            }
            logger.error(ex.getMessage() + "\n");
            logger.trace("Probably not all caption imported due to error.\n");
        } catch (FileBufferException ex) {
            if (subPictures.size() == 0) {
                throw new CoreException (ex.getMessage());
            }
            logger.error(ex.getMessage() + "\n");
            logger.trace("Probably not all caption imported due to error.\n");
        }
    }
View Full Code Here


        int w = pic.getImageWidth();
        int h = pic.getImageHeight();
        int warnings = 0;

        if (w > pic.getWidth() || h > pic.getHeight()) {
            throw new CoreException("Subpicture too large: " + w + "x" + h + " at offset " + ToolBox.toHexLeftZeroPadded(pic.getImageBufferOffsetEven(), 8));
        }

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

        int sizeEven = pic.getImageBufferOffsetOdd() - pic.getImageBufferOffsetEven();
        int sizeOdd = pic.getImageBufferSize() + pic.getImageBufferOffsetEven() - pic.getImageBufferOffsetOdd();

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

        byte evenBuf[] = new byte[sizeEven];
        byte oddBuf[]  = new byte[sizeOdd];

        try {
            // copy buffers
            try {
                for (int i=0; i < evenBuf.length; i++) {
                    evenBuf[i] = (byte)buffer.getByte(pic.getImageBufferOffsetEven() + i);
                }
            } catch (ArrayIndexOutOfBoundsException ex) {
                warnings++;
            }
            try {
                for (int i=0; i < oddBuf.length; i++) {
                    oddBuf[i= (byte)buffer.getByte(pic.getImageBufferOffsetOdd() +i);
                }
            } catch (ArrayIndexOutOfBoundsException ex) {
                warnings++;
            }
            // decode even lines
            try {
                BitStream even = new BitStream(evenBuf);
                decodeLine(bm.getInternalBuffer(), 0, w, w*(h/2+(h&1)), even);
            } catch (ArrayIndexOutOfBoundsException ex) {
                warnings++;
            }
            // decode odd lines
            try {
                BitStream odd  = new BitStream(oddBuf);
                decodeLine(bm.getInternalBuffer(), w, w, (h/2)*w, odd);
            } catch (ArrayIndexOutOfBoundsException ex) {
                warnings++;
            }

            if (warnings > 0) {
                logger.warn("problems during RLE decoding of picture at offset " + ToolBox.toHexLeftZeroPadded(pic.getImageBufferOffsetEven(), 8) + "\n");
            }

            return bm;
        } catch (FileBufferException ex) {
            throw new CoreException (ex.getMessage());
        }
    }
View Full Code Here

                }
                palette.setAlpha(i, alpha);
            }
            return palette;
        } catch (FileBufferException ex) {
            throw new CoreException (ex.getMessage());
        }
    }
View Full Code Here

    public void decode(int index) throws CoreException {
        if (index < subPictures.size()) {
            decode(subPictures.get(index));
        } else {
            throw new CoreException("Index " + index + " out of bounds\n");
        }
    }
View Full Code Here

    public IfoParser(String filename) throws CoreException {
        try {
            this.fileBuffer = new FileBuffer(filename);
            processIFO();
        } catch (FileBufferException e) {
            throw new CoreException(e.getMessage());
        }
    }
View Full Code Here

            validateIfoHeader();
            readVideoAttributes();
            readFirstLanguageIndex();
            readFirstPalette();
        } catch (FileBufferException e) {
            throw new CoreException(e.getMessage());
        }
    }
View Full Code Here

    private void validateIfoHeader() throws FileBufferException, CoreException {
        byte header[] = new byte[IFO_HEADER.length];
        fileBuffer.getBytes(0, header, IFO_HEADER.length);
        if (!Arrays.equals(header, IFO_HEADER)) {
            throw new CoreException("Not a valid IFO file.");
        }
    }
View Full Code Here

        BufferedOutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(fname));
            out.write(buf);
        } catch (IOException ex) {
            throw new CoreException(ex.getMessage());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
View Full Code Here

                Core.setProgress(offset);
                logger.trace("Offset: " + ToolBox.toHexLeftZeroPadded(offset, 8) + "\n");
                offset = readSupFrame(offset, fileBuffer);
            } while (offset < size);
        } catch (FileBufferException e) {
            throw new CoreException(e.getMessage());
        }
        logger.info("\nDetected " + numForcedFrames + " forced captions.\n");
    }
View Full Code Here

        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]);
            int alphaSum = 0;
            int[] alphaUpdate = new int[4];
            int alphaUpdateSum;
            int delay = -1;
            boolean colorAlphaUpdate = false;

            logger.trace("SP_DCSQT at ofs: " + ToolBox.toHexLeftZeroPadded(ctrlOffset, 8) + "\n");

            // copy control header in buffer (to be more compatible with VobSub)
            ctrlHeader = new byte[ctrlSize];
            for (int i=0; i < ctrlSize; i++) {
                ctrlHeader[i] = (byte)buffer.getByte(ctrlOffset + i);
            }

            try {
                // parse control header
                int b;
                int index = 0;
                int endSeqOfs = getWord(ctrlHeader, index) - ctrlOfsRel - 2;
                if (endSeqOfs < 0 || endSeqOfs > ctrlSize) {
                    logger.warn("Invalid end sequence offset -> no end time\n");
                    endSeqOfs = ctrlSize;
                }
                index += 2;
                parse_ctrl:
                while (index < endSeqOfs) {
                    int cmd = getByte(ctrlHeader, index++);
                    switch (cmd) {
                        case 0: // forced (?)
                            pic.setForced(true);
                            numForcedFrames++;
                            break;
                        case 1: // start display
                            break;
                        case 3: // palette info
                            b = getByte(ctrlHeader, index++);
                            pic.getPal()[3] = (b >> 4);
                            pic.getPal()[2] = b & 0x0f;
                            b = getByte(ctrlHeader, index++);
                            pic.getPal()[1] = (b >> 4);
                            pic.getPal()[0] = b & 0x0f;
                            logger.trace("Palette:   " + pic.getPal()[0] + ", " + pic.getPal()[1] + ", " + pic.getPal()[2] + ", " + pic.getPal()[3] + "\n");
                            break;
                        case 4: // alpha info
                            b = getByte(ctrlHeader, index++);
                            pic.getAlpha()[3] = (b >> 4);
                            pic.getAlpha()[2] = b & 0x0f;
                            b = getByte(ctrlHeader, index++);
                            pic.getAlpha()[1] = (b >> 4);
                            pic.getAlpha()[0] = b & 0x0f;
                            for (int i = 0; i < 4; i++) {
                                alphaSum += pic.getAlpha()[i] & 0xff;
                            }
                            logger.trace("Alpha:     " + pic.getAlpha()[0] + ", " + pic.getAlpha()[1] + ", " + pic.getAlpha()[2] + ", " + pic.getAlpha()[3] + "\n");
                            break;
                        case 5: // coordinates
                            int xOfs = (getByte(ctrlHeader, index) << 4) | (getByte(ctrlHeader, index+1) >> 4);
                            pic.setOfsX(xOfs);
                            pic.setImageWidth((((getByte(ctrlHeader, index + 1) & 0xf) << 8) | (getByte(ctrlHeader, index + 2))) - xOfs + 1);
                            int yOfs = (getByte(ctrlHeader, index + 3) << 4) | (getByte(ctrlHeader, index + 4) >> 4);
                            pic.setOfsY(yOfs);
                            pic.setImageHeight((((getByte(ctrlHeader, index + 4) & 0xf) << 8) | (getByte(ctrlHeader, index + 5))) - yOfs + 1);
                            logger.trace("Area info:" + " ("
                                    + pic.getXOffset() + ", " + pic.getYOffset() + ") - (" + (pic.getXOffset() + pic.getImageWidth() - 1) + ", "
                                    + (pic.getYOffset() + pic.getImageHeight() - 1) + ")\n");
                            index += 6;
                            break;
                        case 6: // offset to RLE buffer
                            pic.setEvenOffset(getWord(ctrlHeader, index) - 4);
                            pic.setOddOffset(getWord(ctrlHeader, index + 2) - 4);
                            index += 4;
                            logger.trace("RLE ofs:   " + ToolBox.toHexLeftZeroPadded(pic.getEvenOffset(), 4) + ", " + ToolBox.toHexLeftZeroPadded(pic.getOddOffset(), 4) + "\n");
                            break;
                        case 7: // color/alpha update
                            colorAlphaUpdate = true;
                            //int len = ToolBox.getWord(ctrlHeader, index);
                            // ignore the details for now, but just get alpha and palette info
                            alphaUpdateSum = 0;
                            b = getByte(ctrlHeader, index + 10);
                            alphaUpdate[3] = (b >> 4);
                            alphaUpdate[2] = b & 0x0f;
                            b = getByte(ctrlHeader, index + 11);
                            alphaUpdate[1] = (b >> 4);
                            alphaUpdate[0] = b & 0x0f;
                            for (int i = 0; i < 4; i++) {
                                alphaUpdateSum += alphaUpdate[i] & 0xff;
                            }
                            // only use more opaque colors
                            if (alphaUpdateSum > alphaSum) {
                                alphaSum = alphaUpdateSum;
                                System.arraycopy(alphaUpdate, 0, pic.getAlpha(), 0, 4);
                                // take over frame palette
                                b = getByte(ctrlHeader, index+8);
                                pic.getPal()[3] = (b >> 4);
                                pic.getPal()[2] = b & 0x0f;
                                b = getByte(ctrlHeader, index+9);
                                pic.getPal()[1] = (b >> 4);
                                pic.getPal()[0] = b & 0x0f;
                            }
                            // search end sequence
                            index = endSeqOfs;
                            delay = getWord(ctrlHeader, index) * 1024;
                            endSeqOfs = getWord(ctrlHeader, index + 2)-ctrlOfsRel - 2;
                            if (endSeqOfs < 0 || endSeqOfs > ctrlSize) {
                                logger.warn("Invalid end sequence offset -> no end time\n");
                                endSeqOfs = ctrlSize;
                            }
                            index += 4;
                            break;
                        case 0xff: // end sequence
                            break parse_ctrl;
                        default:
                            logger.warn("Unknown control sequence " + toHexLeftZeroPadded(cmd, 2) + " skipped\n");
                            break;
                    }
                }

                if (endSeqOfs != ctrlSize) {
                    int ctrlSeqCount = 1;
                    index = -1;
                    int nextIndex = endSeqOfs;
                    while (nextIndex != index) {
                        index = nextIndex;
                        delay = getWord(ctrlHeader, index) * 1024;
                        nextIndex = getWord(ctrlHeader, index + 2) - ctrlOfsRel - 2;
                        ctrlSeqCount++;
                    }
                    if (ctrlSeqCount > 2) {
                        logger.warn("Control sequence(s) ignored - result may be erratic.");
                    }
                    pic.setEndTime(pic.getStartTime() + delay);
                } else {
                    pic.setEndTime(pic.getStartTime());
                }

                pic.storeOriginal();

                if (colorAlphaUpdate) {
                    logger.warn("Palette update/alpha fading detected - result may be erratic.\n");
                }

                if (alphaSum == 0) {
                    if (configuration.getFixZeroAlpha()) {
                        System.arraycopy(lastAlpha, 0, pic.getAlpha(), 0, 4);
                        logger.warn("Invisible caption due to zero alpha - used alpha info of last caption.\n");
                    } else {
                        logger.warn("Invisible caption due to zero alpha (not fixed due to user setting).\n");
                    }
                }
                lastAlpha = pic.getAlpha();
            } catch (IndexOutOfBoundsException ex) {
                throw new CoreException("Index " + ex.getMessage() + " out of bounds in control header.");
            }

            subPictures.add(pic);
            return startOffset + length + 0x0a;
        } catch (FileBufferException ex) {
            throw new CoreException(ex.getMessage());
        }
    }
View Full Code Here

TOP

Related Classes of bdsup2sub.core.CoreException

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.