/*
* @(#)StripRelook
*
* Copyright (c) 2005-2007 by dvb.matt, All rights reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.parser;
import java.io.PushbackInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
import net.sourceforge.dvb.projectx.xinput.XInputFile;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.common.Keys;
import net.sourceforge.dvb.projectx.parser.CommonParsing;
public class StripRelook extends Object {
private boolean debug = false;
private int type = 0;
/**
*
*/
public StripRelook(int value)
{
debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog);
type = value;
}
/**
*
*/
public XInputFile[] process(XInputFile xInputFile, String output)
{
if (output.startsWith("[res]"))
output = xInputFile.getParent();
String parent = output + System.getProperty("file.separator") + xInputFile.getName();
String strippedfile_video = parent + "[stripped].vpes";
String strippedfile_audio = parent + "[stripped].apes";
String strippedfile_teletext = parent + "[stripped].tpes";
try {
PushbackInputStream in = new PushbackInputStream(xInputFile.getInputStream());
BufferedOutputStream out_1 = new BufferedOutputStream( new FileOutputStream(strippedfile_video), 5120000);
BufferedOutputStream out_2 = new BufferedOutputStream( new FileOutputStream(strippedfile_audio), 4096000);
BufferedOutputStream out_3 = new BufferedOutputStream( new FileOutputStream(strippedfile_teletext), 4096000);
int count = 0;
int[] buffersize = { 0xC000, 0xE800 };
long pos = 0;
long len = xInputFile.length();
byte[] array = new byte[buffersize[type]];
int ret, seqhead, audiolength, videolength, seqoffs, frameoffs, audiooffs, teletextlength;
while (pos < len)
{
ret = in.read(array);
if (ret < array.length)
in.read(array, ret, array.length - ret);
seqhead = getValue(array, 0);
audiolength = getValue(array, 4);
videolength = getValue(array, 8);
seqoffs = getValue(array, 12);
frameoffs = getValue(array, 16);
audiooffs = getValue(array, 20); //?
teletextlength = type == 0 ? 0 : getValue(array, 32);
if (debug)
System.out.println("rl pos + " + pos + " /v " + videolength + " /a " + audiolength + " /t " + teletextlength);
if (videolength > 0)
out_1.write(array, 0x200, videolength);
if (audiolength > 0)
out_2.write(array, 0x9200, audiolength);
if (teletextlength > 0)
out_3.write(array, 0xC000, teletextlength);
count++;
pos += array.length;
}
out_1.flush();
out_1.close();
out_2.flush();
out_2.close();
out_3.flush();
out_3.close();
in.close();
} catch (Exception e) {
Common.setExceptionMessage(e);
return null;
}
XInputFile[] xif = new XInputFile[3];
xif = finishFile(strippedfile_video, xif, 0);
xif = finishFile(strippedfile_audio, xif, 1);
xif = finishFile(strippedfile_teletext, xif, 2);
return xif;
}
/**
*
*/
private int getValue(byte[] array, int offset)
{
int value = 0;
for (int i = 0; i < 4; i++)
value |= (0xFF & array[offset + i])<<((3 - i) * 8);
return value;
}
/**
*
*/
private XInputFile[] finishFile(String strippedfile, XInputFile[] xif, int index)
{
File file = new File(strippedfile);
if (debug)
System.out.println("rl file + " + index + " /l " + file.length());
if (file.length() > 100)
xif[index] = new XInputFile(file);
else
file.delete();
return xif;
}
}