/*
* @(#)StreamParser
*
* Copyright (c) 2005-2006 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.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.PushbackInputStream;
import java.util.Arrays;
import java.util.List;
//import java.util.Hashtable;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.common.Resource;
import net.sourceforge.dvb.projectx.common.Keys;
import net.sourceforge.dvb.projectx.common.JobCollection;
import net.sourceforge.dvb.projectx.common.JobProcessing;
import net.sourceforge.dvb.projectx.io.RawFile;
import net.sourceforge.dvb.projectx.xinput.XInputFile;
import net.sourceforge.dvb.projectx.parser.CommonParsing;
import net.sourceforge.dvb.projectx.parser.StreamConverter;
import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer;
import net.sourceforge.dvb.projectx.parser.StreamParserBase;
/**
* main thread
*/
public class StreamParserPVA extends StreamParserBase {
/**
*
*/
public StreamParserPVA()
{
super();
}
/**
* read bytes for overlap pva check
*/
private byte[] overlapPVA(JobCollection collection, byte[] overlapnext)
{
JobProcessing job_processing = collection.getJobProcessing();
if (job_processing.getFileNumber() < collection.getPrimaryInputFileSegments() - 1)
{
try {
((XInputFile) collection.getInputFile(job_processing.getFileNumber() + 1)).randomAccessSingleRead(overlapnext, 0);
} catch (IOException e) {
Common.setExceptionMessage(e);
}
}
return overlapnext;
}
/**
* PVA/PSV/PSA Parser
*/
public String parseStream(JobCollection collection, XInputFile aXInputFile, int pes_streamtype, int action, String vptslog)
{
JobProcessing job_processing = collection.getJobProcessing();
setFileName(collection, job_processing, aXInputFile);
boolean Message_1 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg1);
boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2);
boolean ConformAudioCheck = collection.getSettings().getBooleanProperty(Keys.KEY_PVA_Audio);
boolean Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog);
boolean OverlapCheck = collection.getSettings().getBooleanProperty(Keys.KEY_PVA_FileOverlap);
boolean Concatenate = collection.getSettings().getBooleanProperty(Keys.KEY_Input_concatenateForeignRecords);
CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex);
SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile);
setOverheadSize(collection);
boolean Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap);
boolean containsPts = false;
boolean ende = false;
boolean missing_syncword = false;
boolean usePidfilter = false;
boolean isTeletext;
boolean foundObject;
int pva_buffersize = 0x10006;
byte[] pva_packet = new byte[pva_buffersize]; // packets usually up to 6kB
byte[] overlapnext = new byte[0x100];
byte[] new_pes_packet = new byte[pva_buffersize];
byte[] new_pes_packetheader = { 0, 0, 1, (byte)0xE0, 0, 0, (byte)0x80, 0, 0 };
byte[] new_pes_packetheader_and_pts = { 0, 0, 1, (byte)0xE0, 0, 0, (byte)0x80, (byte)0x80, 5, 0, 0, 0, 0, 0 };
int Infoscan_Value = Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_ExportPanel_Infoscan_Value));
int CutMode = collection.getSettings().getIntProperty(Keys.KEY_CutMode);
int pva_pid;
int ptsflag;
int pva_packetoffset;
int pva_payloadlength;
int pva_headerlength = 8;
int pva_ptslength = 4;
int pva_counter;
int pre_bytes;
int post_bytes;
int[] newID = { 0x80, 0x90, 0xC0, 0xE0, 0xA0, 0x20 };
job_processing.clearStatusVariables();
int[] clv = job_processing.getStatusVariables();
long pts = 0;
long lastpts = 0;
long ptsoffset = 0;
long packet = 0;
long count = 0;
long size = 0;
long base;
long startPoint = 0;
long starts[] = new long[collection.getPrimaryInputFileSegments()];
long Overlap_Value = 1048576L * (collection.getSettings().getIntProperty(Keys.KEY_ExportPanel_Overlap_Value) + 1);
long qexit;
String file_id = aXInputFile.getFileID();
String[] streamtypes = {
Resource.getString("parsePVA.streamtype.ac3"),
Resource.getString("parsePVA.streamtype.ttx"),
Resource.getString("parsePVA.streamtype.mpeg.audio"),
Resource.getString("parsePVA.streamtype.mpeg.video")
};
RawFile rawfile = null;
StreamBuffer streambuffer = null;
streamconverter = new StreamConverter();
demuxList = job_processing.getPVADemuxList();
List PVAPidlist = job_processing.getPVAPidList();
//
streamobjects = getStreamObjects(job_processing);
//
/**
* re-read old streams, for next split part
*/
if (job_processing.getSplitPart() == 0)
{
PVAPidlist.clear();
demuxList.clear();
}
else
{
for (int i = 0; i < PVAPidlist.size(); i++)
{
streambuffer = (StreamBuffer) PVAPidlist.get(i);
streambuffer.reset();
streambuffer.setStarted(true);
}
for (int i = 0; i < demuxList.size(); i++)
{
streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i);
Common.setMessage(">>3 " + streamdemultiplexer);
Common.setMessage(">>4 " + streamdemultiplexer.hashCode());
if (streamdemultiplexer.getnewID() != 0)
newID[streamdemultiplexer.getType()]++;
if (streamdemultiplexer.getNum() == -1)
continue;
if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO)
streamdemultiplexer.initVideo2(collection, fparent);
else
streamdemultiplexer.init2(collection, fparent);
}
}
/**
* init conversions
*/
initConversion(collection, fparent, action, CommonParsing.ACTION_TO_PVA, job_processing.getSplitPart());
/**
* d2v project
*/
if (CreateD2vIndex || SplitProjectFile)
job_processing.getProjectFileD2V().Init(fparent);
job_processing.setMinBitrate(CommonParsing.MAX_BITRATE_VALUE);
job_processing.setMaxBitrate(0);
job_processing.setExportedVideoFrameNumber(0);
job_processing.setEndPtsOfGop(-10000);
job_processing.setSequenceHeader(true);
job_processing.setAllMediaFilesExportLength(0);
job_processing.setProjectFileExportLength(0);
job_processing.setCutByteposition(0);
/**
* pid inclusion
*/
Object[] predefined_Pids = collection.getPIDs();
int[] include = new int[predefined_Pids.length];
for (int i = 0; i < include.length; i++)
include[i] = 0xFF & Integer.parseInt(predefined_Pids[i].toString().substring(2), 16);
if (include.length > 0)
{
Arrays.sort(include);
String str = " ";
for (int i = 0; i < include.length; i++)
str += "0x" + Integer.toHexString(include[i]).toUpperCase() + " ";
Common.setMessage(Resource.getString("parsePVA.special.pids") + ": {" + str + "}");
usePidfilter = true;
}
try {
/**
* determine start & end byte pos. of each file segment
*/
for (int i = 0; i < starts.length; i++)
{
aXInputFile = (XInputFile) collection.getInputFile(i);
starts[i] = size;
size += aXInputFile.length();
}
aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber());
/**
* set start & end byte pos. of first file segment
*/
count = starts[job_processing.getFileNumber()];
size = count + aXInputFile.length();
if (CommonParsing.getPvaPidExtraction())
rawfile = new RawFile(fparent, CommonParsing.getPvaPidToExtract(), MainBufferSize);
/**
* split skipping first, for next split part
*/
if (job_processing.getSplitSize() > 0)
{
startPoint = job_processing.getLastHeaderBytePosition();
startPoint -= !Overlap ? 0 : Overlap_Value;
job_processing.setLastGopTimecode(0);
job_processing.setLastGopPts(0);
job_processing.setLastSimplifiedPts(0);
}
List CutpointList = collection.getCutpointList();
List ChapterpointList = collection.getChapterpointList();
/**
* jump near to first cut-in point to collect more audio
*/
if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0 && CommonParsing.getCutCounter() == 0)
startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? OverheadSize : 0);
if (startPoint < 0)
startPoint = count;
else if (startPoint < count)
{
for (int i = starts.length; i > 0; i--)
if (starts[i - 1] > startPoint)
job_processing.countFileNumber(-1);
}
else if (startPoint > count)
{
for (int i = job_processing.getFileNumber() + 1; i < starts.length; i++)
{
if (starts[i] > startPoint)
break;
else
job_processing.countFileNumber(+1);
}
}
aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber());
count = starts[job_processing.getFileNumber()];
if (job_processing.getFileNumber() > 0)
Common.setMessage(Resource.getString("parsePVA.continue") + " " + aXInputFile);
base = count;
size = count + aXInputFile.length();
PushbackInputStream in = new PushbackInputStream(aXInputFile.getInputStream(startPoint - base), pva_buffersize);
count += (startPoint - base);
overlapPVA(collection, overlapnext);
Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parsePVA.demuxing") : Resource.getString("parsePVA.converting")) + " " + Resource.getString("parsePVA.pvafile") + " " + aXInputFile.getName(), (count - base), (size - base));
qexit = count + (0x100000L * Infoscan_Value);
bigloop:
while (true)
{
loop:
while (count < size)
{
while (pause())
{}
if (CommonParsing.isProcessCancelled() || (CommonParsing.isInfoScan() && count > qexit))
{
CommonParsing.setProcessCancelled(false);
job_processing.setSplitSize(0);
break bigloop;
}
/**
* cut end reached
*/
if (job_processing.getCutComparePoint() + 20 < job_processing.getSourceVideoFrameNumber())
{
ende = true;
break bigloop;
}
/**
* cut end reached
*/
if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0)
{
if (CommonParsing.getCutCounter() == CutpointList.size() && (CommonParsing.getCutCounter() & 1) == 0)
{
if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + OverheadSize)
{
ende = true;
break bigloop;
}
}
}
in.read(pva_packet, 0, pva_headerlength);
/**
* check 0x4156__55 is PVA (ascii AV)
*/
if (pva_packet[0] != 0x41 || pva_packet[1] != 0x56 || pva_packet[4] != 0x55)
{
if (Message_2 && !missing_syncword)
Common.setMessage(Resource.getString("parsePVA.missing.sync") + " " + count);
// fill complete buffer...
in.read(pva_packet, pva_headerlength, pva_buffersize - pva_headerlength);
// ... and search next startcode
for (int i = pva_headerlength; i < pva_buffersize - 4; i++)
{
if (pva_packet[i] == 0x41 && pva_packet[i + 1] == 0x56 && pva_packet[i + 4] == 0x55)
{
in.unread(pva_packet, i, pva_buffersize - i);
count += i;
missing_syncword = true;
Common.updateProgressBar((count - base), (size - base));
continue loop;
}
}
count += pva_buffersize;
missing_syncword = true;
continue loop;
}
if (Message_2 && missing_syncword)
Common.setMessage(Resource.getString("parsePVA.found.sync") + " " + count);
missing_syncword = false;
/**
* overlapcheck
*/
if (OverlapCheck && job_processing.getFileNumber() < collection.getPrimaryInputFileSegments() - 1)
{
in.read(pva_packet, pva_headerlength, overlapnext.length - pva_headerlength);
for (int i = 255; i >= 0; i--)
{
if (pva_packet[i] != overlapnext[i])
break;
if (i == 0)
{
Common.setMessage(Resource.getString("parsePVA.file.overlap") + " " + count);
break loop;
}
}
in.unread(pva_packet, pva_headerlength, overlapnext.length - pva_headerlength);
}
/**
* mark for split
*/
job_processing.setLastHeaderBytePosition(count);
job_processing.setCutByteposition(count);
packet++;
pva_pid = 0xFF & pva_packet[2];
pva_counter = 0xFF & pva_packet[3];
ptsflag = 0xFF & pva_packet[5];
containsPts = (0x10 & ptsflag) != 0;
pre_bytes = 3 & ptsflag>>>2;
post_bytes = 3 & ptsflag;
pva_payloadlength = (0xFF & pva_packet[6])<<8 | (0xFF & pva_packet[7]);
pva_packetoffset = pva_headerlength;
Common.updateProgressBar((count - base), (size - base));
//yield();
clv[5]++;
if (Debug)
System.out.println(Resource.getString("parsePVA.packs") + clv[5] + " /pid " + pva_pid + " @ " + ((count * 100 / size)) + "% " + count);
count += pva_headerlength;
/**
* pid inclusion
*/
if (usePidfilter && Arrays.binarySearch(include, pva_pid) < 0)
{
in.skip(pva_payloadlength);
count += pva_payloadlength;
continue loop;
}
/**
* read pts of video pid
*/
if (pva_pid == 1 && containsPts)
{
in.read(pva_packet, pva_headerlength, pva_ptslength);
pts = CommonParsing.readPTS(pva_packet, pva_headerlength, pva_ptslength, !CommonParsing.BYTEREORDERING, true);
job_processing.setPvaVideoPts(pts);
count += pva_ptslength;
pva_packetoffset += pva_ptslength;
pva_payloadlength -= pva_ptslength;
}
else
job_processing.setPvaVideoPts(-1);
/**
* re-formatted PES data extraction
*/
if (CommonParsing.getPvaPidExtraction())
{
if (pva_pid != CommonParsing.getPvaPidToExtract())
in.skip(pva_payloadlength);
else
{
if (pva_pid == 1)
{
if (containsPts)
{
CommonParsing.setPES_LengthField(new_pes_packetheader_and_pts, 0, 8 + pva_payloadlength);
CommonParsing.setPES_PTSField(new_pes_packetheader_and_pts, 0, pts);
rawfile.write(new_pes_packetheader_and_pts);
}
else
{
CommonParsing.setPES_LengthField(new_pes_packetheader, 0, 3 + pva_payloadlength);
rawfile.write(new_pes_packetheader);
}
}
in.read(pva_packet, pva_packetoffset, pva_payloadlength);
rawfile.write(pva_packet, pva_packetoffset, pva_payloadlength);
job_processing.countMediaFilesExportLength(pva_payloadlength);
}
count += pva_payloadlength;
continue loop;
}
in.read(pva_packet, pva_packetoffset, pva_payloadlength);
count += pva_payloadlength;
/**
* raw pid filter extraction
*/
if (action == CommonParsing.ACTION_FILTER)
{
streamconverter.write(job_processing, pva_packet, 0, pva_packetoffset + pva_payloadlength, null, job_processing.getCutByteposition(), CommonParsing.isInfoScan(), CutpointList);
continue loop;
}
foundObject = false;
for (int i = 0; i < PVAPidlist.size(); i++)
{
streambuffer = (StreamBuffer)PVAPidlist.get(i);
foundObject = pva_pid == streambuffer.getPID();
if (foundObject)
break;
}
/**
* create new PID object
*/
if (!foundObject)
{
streambuffer = new StreamBuffer();
streambuffer.setPID(pva_pid);
Common.setMessage(Resource.getString("parsePVA.found.id") + Integer.toHexString(pva_pid).toUpperCase() + " @ " + job_processing.getCutByteposition());
Common.getGuiInterface().addPidToExtract(Integer.toHexString(pva_pid));
PVAPidlist.add(streambuffer);
}
/**
* out of sequence?
*/
if (Message_1)
{
if (streambuffer.getCounter() != -1)
{
if (pva_counter != streambuffer.getCounter())
{
Common.setMessage(Resource.getString("parsePVA.outof.sequence", Integer.toHexString(pva_pid).toUpperCase(), "" + packet, "" + (count-8-pva_payloadlength), "" + pva_counter, "" + streambuffer.getCounter()) + " (~" + Common.formatTime_1( (long)((CommonParsing.getVideoFramerate() / 90.0f) * job_processing.getExportedVideoFrameNumber())) + ")");
streambuffer.setCounter(pva_counter);
}
streambuffer.countPVA();
}
else
{
streambuffer.setCounter(pva_counter);
streambuffer.countPVA();
}
}
if (pva_pid != 1 && !containsPts && !ConformAudioCheck && pva_payloadlength > post_bytes + 3)
{
int p = pva_packetoffset + post_bytes;
if (pva_packet[p] == 0 && pva_packet[p + 1] == 0 && pva_packet[p + 2] == 1 && (pva_packet[p + 3] == (byte)CommonParsing.PRIVATE_STREAM_1_CODE || (0xE0 & pva_packet[p + 3]) == 0xC0))
containsPts = true;
}
if (!containsPts)
post_bytes = 0;
if (streambuffer.isStarted())
streamdemultiplexer = (StreamDemultiplexer) demuxList.get(streambuffer.getID());
else
{ // create new ID object
String IDtype = "";
switch (pva_pid)
{
case 1:
IDtype=Resource.getString("idtype.video");
streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset);
streambuffer.setStarted(true);
streamdemultiplexer.setID(0xE0);
streamdemultiplexer.setType(CommonParsing.MPEG_VIDEO);
streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_VIDEO]++);
streamdemultiplexer.setPID(pva_pid);
streamdemultiplexer.setsubID(0);
streamdemultiplexer.setStreamType(pes_streamtype);
// streambuffer.setID(streamdemultiplexer.hashCode());
streambuffer.setID(demuxList.size());
demuxList.add(streamdemultiplexer);
if (action == CommonParsing.ACTION_DEMUX)
streamdemultiplexer.initVideo(collection, fparent, MainBufferSize, demuxList.size(), CommonParsing.PVA_PARSER);
else
IDtype += " " + Resource.getString("idtype.mapped.to.e0") + " " + streamtypes[3];
break;
case 2:
IDtype = Resource.getString("idtype.main.audio");
//do not break
default:
IDtype = Resource.getString("idtype.additional");
if (!containsPts)
continue loop;
int streamID = 0xFF & pva_packet[pva_packetoffset + post_bytes + 3];
if ((0xE0 & streamID) != 0xC0 && streamID != CommonParsing.PRIVATE_STREAM_1_CODE)
{
streambuffer.setneeded(false);
break;
}
streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset);
streambuffer.setStarted(true);
streamdemultiplexer.setPID(pva_pid);
streamdemultiplexer.setType(streamID != CommonParsing.PRIVATE_STREAM_1_CODE ? CommonParsing.MPEG_AUDIO : CommonParsing.AC3_AUDIO); // MPA?
streamdemultiplexer.setID(streamID);
streamdemultiplexer.setsubID(0);
isTeletext = (0xFF & pva_packet[pva_packetoffset + post_bytes + 8]) == 0x24;
streamdemultiplexer.setnewID((streamID == CommonParsing.PRIVATE_STREAM_1_CODE ? (isTeletext ? newID[CommonParsing.TELETEXT]++ : newID[CommonParsing.AC3_AUDIO]++) : newID[CommonParsing.MPEG_AUDIO]++));
streamdemultiplexer.setTTX(isTeletext);
streamdemultiplexer.setStreamType(pes_streamtype);
// streambuffer.setID(streamdemultiplexer.hashCode());
streambuffer.setID(demuxList.size());
demuxList.add(streamdemultiplexer);
IDtype += " " + Resource.getString("idtype.has.pesid") + Integer.toHexString(streamID).toUpperCase() + " " + streamtypes[streamdemultiplexer.getType()];
if (action == CommonParsing.ACTION_DEMUX)
streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PVA_PARSER);
else
IDtype += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(streamdemultiplexer.getnewID()).toUpperCase();
break;
}
Common.setMessage(Resource.getString("parsePVA.id.0x") + Integer.toHexString(pva_pid).toUpperCase() + " " + IDtype);
}
if (!streamdemultiplexer.StreamEnabled())
continue loop;
/**
* packet to streamdemultiplexer
*/
if (action == CommonParsing.ACTION_DEMUX)
{
if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO)
streamdemultiplexer.writeVideo(job_processing, pva_packet, pva_packetoffset, pva_payloadlength, false, CutpointList, ChapterpointList);
else
{
if (containsPts)
{
if (post_bytes > 0)
{
streamdemultiplexer.write(job_processing, pva_packet, pva_packetoffset, post_bytes, false);
pva_packetoffset += post_bytes;
pva_payloadlength -= post_bytes;
}
CommonParsing.setPES_LengthField(pva_packet, pva_packetoffset, pva_payloadlength - 6);
}
streamdemultiplexer.write(job_processing, pva_packet, pva_packetoffset, pva_payloadlength, containsPts);
}
if (streamdemultiplexer.getPTS() > lastpts)
lastpts = streamdemultiplexer.getPTS();
/**
* split size reached
*/
if (job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength())
break loop;
continue loop;
}
/**
* packet to streamconverter
* create new pes_header + pts of video
*/
if (pva_pid == 1)
{
if (containsPts)
{
System.arraycopy(new_pes_packetheader_and_pts, 0, new_pes_packet, 0, new_pes_packetheader_and_pts.length);
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, new_pes_packetheader_and_pts.length, pva_payloadlength);
CommonParsing.setPES_LengthField(new_pes_packet, 0, new_pes_packetheader_and_pts.length - 6 + pva_payloadlength);
CommonParsing.setPES_PTSField(new_pes_packet, 0, pts);
}
else
{
System.arraycopy(new_pes_packetheader, 0, new_pes_packet, 0, new_pes_packetheader.length);
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, new_pes_packetheader.length, pva_payloadlength);
CommonParsing.setPES_LengthField(new_pes_packet, 0, new_pes_packetheader.length - 6 + pva_payloadlength);
}
}
/**
* create new pes_header + pts of others
*/
else
{
/**
* flag defines existence of an own pes_header, immediately following the pva_header
* but is misused by several app's to include up to 3 alignment bytes (to DWORD) <- only allowed for video
*/
if (containsPts)
{
if (post_bytes > 0)
{
System.arraycopy(new_pes_packetheader, 0, new_pes_packet, 0, new_pes_packetheader.length);
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, new_pes_packetheader.length, post_bytes);
CommonParsing.setPES_LengthField(new_pes_packetheader, 0, 3 + post_bytes);
CommonParsing.setPES_IdField(new_pes_packetheader, 0, streamdemultiplexer.getID());
streamconverter.write(job_processing, new_pes_packet, streamdemultiplexer, job_processing.getCutByteposition(), CommonParsing.isInfoScan(), CutpointList);
pva_packetoffset += post_bytes;
pva_payloadlength -= post_bytes;
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, new_pes_packetheader.length, pva_payloadlength);
}
else
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, 0, pva_payloadlength);
CommonParsing.setPES_LengthField(new_pes_packet, 0, pva_payloadlength - 6);
}
else
{
System.arraycopy(new_pes_packetheader, 0, new_pes_packet, 0, new_pes_packetheader.length);
System.arraycopy(pva_packet, pva_packetoffset, new_pes_packet, new_pes_packetheader.length, pva_payloadlength);
CommonParsing.setPES_LengthField(new_pes_packet, 0, new_pes_packetheader.length - 6 + pva_payloadlength);
}
}
CommonParsing.setPES_IdField(new_pes_packet, 0, streamdemultiplexer.getID());
streamconverter.write(job_processing, new_pes_packet, streamdemultiplexer, job_processing.getCutByteposition(), CommonParsing.isInfoScan(), CutpointList);
job_processing.setLastHeaderBytePosition(count);
/**
* split size reached
**/
if ( job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength())
break loop;
} // end while loop
if ( job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength())
break bigloop;
if (job_processing.getFileNumber() < collection.getPrimaryInputFileSegments() - 1)
{
in.close();
//System.gc();
if (Concatenate && action == CommonParsing.ACTION_DEMUX)
{
ptsoffset = nextFilePTS(collection, CommonParsing.PVA_PARSER, 0, lastpts, job_processing.getFileNumber() + 1);
if (ptsoffset == -1)
ptsoffset = 0;
else
{
for (int i = 0; i < demuxList.size(); i++)
{
streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i);
streamdemultiplexer.PTSOffset(ptsoffset);
if (streamdemultiplexer.getPID() == 1)
streamdemultiplexer.resetVideo();
}
job_processing.setSequenceHeader(true);
job_processing.setNewVideoStream(true);
}
// job_processing.addCellTime(String.valueOf(job_processing.getExportedVideoFrameNumber()));
}
XInputFile nextXInputFile = (XInputFile) collection.getInputFile(job_processing.countFileNumber(+1));
count = size;
in = new PushbackInputStream(nextXInputFile.getInputStream(), pva_buffersize);
size += nextXInputFile.length();
base = count;
Common.setMessage(Resource.getString("parsePVA.actual.vframes") + " " + job_processing.getExportedVideoFrameNumber());
Common.setMessage(Resource.getString("parsePVA.continue") + " " + nextXInputFile + " (" + Common.formatNumber(nextXInputFile.length()) + " bytes) @ " + base);
Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parsePVA.demuxing") : Resource.getString("parsePVA.converting")) + " " + Resource.getString("parsePVA.pvafile") + " " + nextXInputFile.getName());
overlapPVA(collection, overlapnext);
}
else
break bigloop;
}
/**
* file end reached for split
*/
if ( (count >= size || ende) && job_processing.getSplitSize() > 0 )
job_processing.setSplitLoopActive(false);
in.close();
vptslog = processElementaryStreams(vptslog, action, clv, collection, job_processing);
if (job_processing.getSplitSize() == 0)
{
demuxList.clear();
PVAPidlist.clear();
}
if (CommonParsing.getPvaPidExtraction())
rawfile.close();
} catch (IOException e2) {
Common.setExceptionMessage(e2);
}
return vptslog;
}
}