/*
* @(#)ProjectFileD2A
*
* Copyright (c) 2005 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.thirdparty;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;
import net.sourceforge.dvb.projectx.common.Resource;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.video.Video;
import net.sourceforge.dvb.projectx.parser.Gop;
public class ProjectFileD2A implements ProjectFileIF
{
/**
* basic GOP line:
* 7 file position/2048 flags flags ...
*/
private ArrayList fields = new ArrayList();
private final String version = "DVD2AVIProjectFile";
private final String number_of_files = "_NumberOfFiles"; // placeholder
private final String file_name_x = "_FileNameX"; // placeholder
private final String frame_rate = "Frame_Rate="; // eg. 25000
private final String location = "Location="; // eg. 0,0,0,14AA00
private final String finish = "FINISHED";
private int file_index = 0;
private final String[] frame_type = { " 0", " 1", " 2", " 3" };
private final String end_of_stream = " 9";
private String d2v_file = "";
private ProjectFileD2A()
{}
public ProjectFileD2A(String str)
{
init(str);
}
private void init(String str)
{
d2v_file = str + ".d2v";
reset();
addBasicFields();
}
private void reset()
{
file_index = 0;
fields.clear();
}
private void addBasicFields()
{
fields.add(version);
fields.add(number_of_files);
fields.add(file_name_x);
fields.add("");
fields.add("Stream_Type=0,0,0");
fields.add("iDCT_Algorithm=2");
fields.add("YUVRGB_Scale=1");
fields.add("Luminance=128,0");
fields.add("Picture_Size=0,0,0,0,0,0");
fields.add("Field_Operation=0");
fields.add(frame_rate);
fields.add(location);
fields.add("");
}
public int getPart()
{
return file_index;
}
/**
* set new file segment before placeholder
*/
public void addFileSegment(String str)
{
fields.add( fields.indexOf(file_name_x), "" + str.length() + " " + str);
file_index++;
}
/**
* sets video_data
*/
public void setVideoFormat(int val1, int val2, int val3, int val4)
{
// empty
}
/**
* long _position is of picture header start code of first I-frame!
*/
public void addGop(long _position, Gop gop)
{
String str = "7 " + file_index + " " + (_position / 2048L) + " ";
fields.add(str);
}
public void addAudio(long startposition, byte[] frame)
{
// empty
}
public void finish(long _filesize)
{
/**
* no GOP line was written
*/
if (fields.size() < 14)
{
reset();
return;
}
/**
* remove placeholder
*/
fields.remove( fields.indexOf(file_name_x));
/**
* remove placeholder and set number of files
*/
fields.set( fields.indexOf(number_of_files), String.valueOf(file_index + 1));
/**
* get placeholder and add file_index + size
* "0,0," means: start at file = 0, position = 0
*/
fields.set( fields.indexOf(location), location + "0,0," + file_index + "," + Long.toHexString(_filesize / 2048L).toUpperCase());
/**
* finish last gop_line
*/
fields.set( fields.size() - 1, fields.get(fields.size() - 1).toString() + frame_type[2] + frame_type[2] + end_of_stream);
fields.add("");
fields.add(finish);
try {
BufferedWriter output = new BufferedWriter(new FileWriter(d2v_file));
for (int i = 0; i < fields.size(); i++)
{
output.write(fields.get(i).toString());
output.newLine();
}
output.flush();
output.close();
} catch (IOException e) {
Common.setExceptionMessage(e);
}
reset();
}
}