/* * @(#)ProjectFileDGI * * 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 ProjectFileDGI implements ProjectFileIF { /** * basic GOP line: * 7 file position vob cell flags flags ... */ private ArrayList fields = new ArrayList(); private final String version = "DGIndexProjectFile06"; private final String number_of_files = "_NumberOfFiles"; // placeholder private final String file_name_x = "_FileNameX"; // placeholder private final String aspect_ratio = "Aspect_Ratio="; // eg. 4:3 private final String picture_size = "Picture_Size="; // eg. 720x576 private final String frame_rate = "Frame_Rate="; // eg. 25000 private final String location = "Location="; // eg. 0,0,0,14AA00 private final String finish = "FINISHED 0.00% FILM"; private int framerate_index = -1; private int aspectratio_index = -1; private int horizontal_size = -1; private int vertical_size = -1; private int file_index = 0; private final String[] frame_type = { " 0", " 1", " 2", " 3" }; private final String end_of_stream = " 9"; private String dgi_file = ""; private ProjectFileDGI() {} public ProjectFileDGI(String str) { init(str); } private void init(String str) { dgi_file = str + ".dgi.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"); fields.add("iDCT_Algorithm=2 (1:MMX 2:SSEMMX 3:FPU 4:REF 5:SSE2MMX)"); fields.add("YUVRGB_Scale=1 (0:TVScale 1:PCScale)"); fields.add("Luminance_Filter=0,0 (Gamma, Offset)"); fields.add("Clipping=0,0,0,0 (ClipLeft, ClipRight, ClipTop, ClipBottom)"); fields.add(aspect_ratio); fields.add(picture_size); fields.add("Field_Operation=0 (0:None 1:ForcedFILM 2:RawFrames)"); 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) { if (framerate_index != -1) framerate_index = val1; if (aspectratio_index != -1) aspectratio_index = val2; if (horizontal_size != -1) horizontal_size = val3; if (vertical_size != -1) vertical_size = val4; } /** * frames decodable w/ a reference to a previous gop must be known here * frames w/ backward encoding to this gop first I-frame write w/ a leading "1" * 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 + " 0 0 "; fields.add(str); } public void addAudio(long startposition, byte[] frame) { // empty } public void finish(long _filesize) { /** * no GOP line was written */ if (fields.size() < 16) { 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)); /** * set frame_rate */ fields.set( fields.indexOf(frame_rate), frame_rate + Video.getFrameRate(framerate_index)); /** * set aspectratio */ fields.set( fields.indexOf(aspect_ratio), aspect_ratio + Video.getAspectRatio(aspectratio_index)); /** * set picture size */ fields.set( fields.indexOf(picture_size), picture_size + horizontal_size + "x" + vertical_size); /** * 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() + end_of_stream); fields.add(""); fields.add(finish); try { BufferedWriter output = new BufferedWriter(new FileWriter(dgi_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(); } }