Author: seba.wagner
Date: Mon Dec 29 07:15:25 2008
New Revision: 1741
Modified:
trunk/webapp/filetest.keystore
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java
Log:
Try to workaround SWFTools 1024 Problem with SWFCOMBINE
Modified: trunk/webapp/filetest.keystore
==============================================================================
Binary files. No diff available.
Modified:
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
(original)
+++
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
Mon Dec 29 07:15:25 2008
@@ -7,6 +7,7 @@
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Iterator;
import java.util.Map;
import org.apache.batik.dom.GenericDOMImplementation;
@@ -223,11 +224,12 @@
} else {
- log.debug("THIS FILE IS
PROCESSED: "+recordingConversionJob.getRecordingConversionJobId());
+ log.debug("THIS FILE IS
PROCESSED
UPDATE: "+recordingConversionJob.getRecordingConversionJobId());
//FIXME: this should happen
only one time per conversion Job
recordingConversionJob.setEnded(new Date());
+
recordingConversionJob.setStartedPngConverted(new Date());
recordingConversionJob.setBatchProcessCounter(0L);
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
@@ -274,16 +276,21 @@
660, 580, depth);
//Add Count For next Round
-
recordingConversionJob.setBatchProcessCounter(recordingConversionJob.getBatchProcessCounter()+1);
-
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobUpdate.setBatchProcessCounter(recordingConversionJob.getBatchProcessCounter()+1);
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
} else {
log.debug("Batch Processing Done");
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
-
recordingConversionJob.setEndPngConverted(new Date());
-
recordingConversionJob.setStartedSWFConverted(new Date());
-
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
recordingConversionJobUpdate.setEndPngConverted(new Date());
+
recordingConversionJobUpdate.setStartedSWFConverted(new Date());
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
}
@@ -316,6 +323,10 @@
for (int
k=0;k<maxNumberOfBatchFolderSize;k++) {
+ //three times to simulate a FPS
of 30 while we only generate
+ //an image every 200
milliseconds (would be fps of 10)
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
images.add(folderName+k+".png");
}
@@ -331,18 +342,69 @@
String folderName =
this.getBatchFileFolder(recordingConversionJob.getRecordingConversionJobId(),
maxFolder);
+ //three times to simulate a FPS of 30
while we only generate
+ //an image every 200 milliseconds
(would be fps of 10)
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
images.add(folderName+k+".png");
}
log.debug("images: "+images);
+ log.debug("images: "+images.size());
String output =
this.getSWFFileForResult(recordingConversionJob.getRecordingConversionJobId());
-
GenerateSWF.getInstance().generateSWFByImages(images, output, 10);
+ String outputFolder =
this.getSWFFolderForResult(recordingConversionJob.getRecordingConversionJobId());
+
+ //Generate that SWF only by 1000 Files as
png2swf.c has a
MAX_INPUT_FILE of 1024
+
+ //This workaround is just to workaround the
1024 File LIMIT of
SWFTools!!!
+
+ List<String> outputfiles = new
LinkedList<String>();
+
+ int maxnumber =
Double.valueOf(Math.floor(images.size() /
1000)).intValue();
+
+ log.debug("maxnumber: "+maxnumber);
- recordingConversionJob.setEndSWFConverted(new
Date());
-
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+ if (maxnumber > 0) {
+ for (int i=0;i<=maxnumber;i++) {
+
+ log.debug("Generate SWF for
Items: "+i+" TO : "+(i*1000));
+ String fileName = outputFolder
+ File.separatorChar
+ "whiteboard"+i+".swf";
+ outputfiles.add(fileName);
+
+ List<String> imageForConvert =
new LinkedList<String>();
+ for (int k=0;k<1000;k++) {
+ int index = k+(i*1000);
+ log.debug("index Number
"+index+" size: "+images.size());
+ if (index <
images.size()) {
+
imageForConvert.add(images.get(index));
+ } else {
+ break;
+ }
+ }
+
+
GenerateSWF.getInstance().generateSWFByImages(imageForConvert,
fileName, 30);
+ }
+
+ //Combine Resulting SWFs to one SWF
+
+ //FIXME: IT SEEMS LIKE SWFCOMBINE DOES
PRODUCE INVALID Files!!
+
GenerateSWF.getInstance().generateSWFByCombine(outputfiles, output,
30);
+
+ } else {
+
+ //Directly write to SWF
+
GenerateSWF.getInstance().generateSWFByImages(images, output, 30);
+
+
+ }
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobUpdate.setEndSWFConverted(new Date());
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
}
@@ -413,11 +475,16 @@
FileWriter fileWriter = new FileWriter(firstImageName);
svgGenerator.stream(fileWriter, useCSS);
+
+ RecordingConversionJob recordingConversionJobToStore =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionJobsByRecordingConversionJobsId(
+
recordingConversionJob.getRecordingConversionJobId());
-
recordingConversionJob.setEndTimeInMilliSeconds(recordingConversionJob.getEndTimeInMilliSeconds()
+ numberOfMilliseconds);
-
recordingConversionJob.setCurrentWhiteBoardAsXml(roomRecordingInXML);
-
recordingConversionJob.setImageNumber(recordingConversionJob.getImageNumber()+1);
-
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
recordingConversionJobToStore.setEndTimeInMilliSeconds(recordingConversionJob.getEndTimeInMilliSeconds()
+ numberOfMilliseconds);
+
recordingConversionJobToStore.setCurrentWhiteBoardAsXml(roomRecordingInXML);
+
recordingConversionJobToStore.setImageNumber(recordingConversionJob.getImageNumber()+1);
+
+ log.debug("updateRecordingConversionJobs: generateFileAsSVG");
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobToStore);
}
@@ -547,6 +614,21 @@
File f = new File(batchFilePNGDir);
return f.getAbsolutePath() + File.separatorChar;
+ }
+
+ private String getSWFFolderForResult(Long conversionJobId) throws
Exception {
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ String recordingFileDirAbsolute = (new
File(recordingFileDir)).getAbsolutePath();
+
+ return recordingFileDirAbsolute + File.separatorChar;
}
private String getSWFFileForResult(Long conversionJobId) throws
Exception
{
Modified:
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
(original)
+++
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
Mon Dec 29 07:15:25 2008
@@ -34,14 +34,14 @@
public SVGGraphics2D convertMapToSVG(SVGGraphics2D svgGenerator, Map
whiteBoardMap) throws Exception {
- log.debug("convertMapToSVG: "+whiteBoardMap.size());
+ //log.debug("convertMapToSVG: "+whiteBoardMap.size());
for (Iterator iter =
whiteBoardMap.keySet().iterator();iter.hasNext();) {
Map graphObject = (Map) whiteBoardMap.get(iter.next());
String graphType = graphObject.get(0).toString();
- log.debug("graphType: "+graphType);
+ //log.debug("graphType: "+graphType);
if (graphType.equals("paint")) {
Modified:
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
(original)
+++
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
Mon Dec 29 07:15:25 2008
@@ -52,6 +52,31 @@
}
return null;
}
+
+ public RecordingConversionJob
getRecordingConversionJobsByRecordingConversionJobsId(long
recordingConversionJobId) {
+ try {
+
+ String hql = "select c from RecordingConversionJob as c
" +
+ "where
c.recordingConversionJobId = :recordingConversionJobId ";
+
+ Object idf = HibernateUtil.createSession();
+ Session session = HibernateUtil.getSession();
+ Transaction tx = session.beginTransaction();
+ Query query = session.createQuery(hql);
+ query.setLong("recordingConversionJobId",
recordingConversionJobId);
+ RecordingConversionJob recordingConversionJob =
(RecordingConversionJob) query.uniqueResult();
+ tx.commit();
+ HibernateUtil.closeSession(idf);
+
+ return recordingConversionJob;
+
+ } catch (HibernateException ex) {
+
log.error("[getRecordingConversionJobsByRecordingConversionJobsId]: " ,
ex);
+ } catch (Exception ex2) {
+
log.error("[getRecordingConversionJobsByRecordingConversionJobsId]: " ,
ex2);
+ }
+ return null;
+ }
public RecordingConversionJob
getRecordingConversionJobsByRecording(long
recording_id) {
try {
@@ -176,6 +201,7 @@
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.update(recordingConversionJob);
+
tx.commit();
HibernateUtil.closeSession(idf);
Modified:
trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java
==============================================================================
--- trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java
(original)
+++ trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java
Mon Dec 29 07:15:25 2008
@@ -113,8 +113,7 @@
}
/**
- * This Function generate a SWF but 3 times faster then the input fps
- * as the resulting SWF has to have a FPS of 30
+ * This Function generate a SWF
* @param images
* @param outputfile
* @param fps
@@ -159,13 +158,105 @@
//Create the Content of the Converter Script (.bat or
.sh File)
String fileContent = pathToSWFTools + "png2swf"
+ " -o " + "\"" + outputfile + "\""
- + " -r " + (fps*3)
+ + " -r " + fps
+ " -z ";
for (Iterator<String> iter =
images.iterator();iter.hasNext();) {
String fileName = iter.next();
fileContent += " " + "\"" + fileName +"\"";
- fileContent += " " + "\"" + fileName +"\"";
+ }
+
+ fileContent += Application.lineSeperator + "exit";
+
+ //execute the Script
+ FileOutputStream fos = new
FileOutputStream(executable_fileName);
+ fos.write(fileContent.getBytes());
+ fos.close();
+
+ //make new shell script executable
+ //in JAVA6 this can be done directly through the api
+ if
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") ==
-1) {
+
MakeExectuable.getInstance().setExecutable(executable_fileName);
+ }
+
+ Runtime rt = Runtime.getRuntime();
+
+ for (int i=0;i<cmd.length;i++){
+ log.debug("cmd: "+cmd[i]);
+ }
+
+ returnMap.put("command", cmd.toString());
+ Process proc = rt.exec(cmd);
+ InputStream stderr = proc.getErrorStream();
+ InputStreamReader isr = new InputStreamReader(stderr);
+ BufferedReader br = new BufferedReader(isr);
+ String line = null;
+ String error = "";
+ while ((line = br.readLine()) != null)
+ error += line;
+ returnMap.put("error", error);
+ int exitVal = proc.waitFor();
+ returnMap.put("exitValue", exitVal);
+ return returnMap;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ returnMap.put("error", t.getMessage());
+ returnMap.put("exitValue", -1);
+ return returnMap;
+ }
+ }
+
+ /**
+ * Combines a bunch of SWFs to one swf by concatenate
+ * @param swfs
+ * @param outputswf
+ * @param fps
+ * @return
+ */
+ public HashMap<String,Object> generateSWFByCombine(List<String> swfs,
String outputswf, int fps) {
+ HashMap<String,Object> returnMap = new HashMap<String,Object>();
+ returnMap.put("process", "generateSWFByImages");
+ try {
+
+ //Init variables
+ String[] cmd;
+ String executable_fileName = "";
+ String pathToSWFTools =
Configurationmanagement.getInstance().getConfKey(3,"swftools_path").getConf_value();
+ //If SWFTools Path is not blank a File.seperator at the
end of the path
is needed
+ if(!pathToSWFTools.equals("")
&& !pathToSWFTools.endsWith(File.separator)){
+ pathToSWFTools = pathToSWFTools +
File.separator;
+ }
+
+
+ //If no Windows Platform
+ if
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") ==
-1) {
+ String runtimeFile = "swfconverter.sh";
+ executable_fileName =
Application.batchFileFir+"SWFCOMBINE_"
+ +
CalendarPatterns.getTimeForStreamId(new Date()) +"_"+ runtimeFile;
+
+ cmd = new String[1];
+ cmd[0] = executable_fileName;
+ } else {
+ String runtimeFile = "swfconverter.bat";
+ executable_fileName =
Application.batchFileFir+"SWFIMAGECONVERT_"
+ +
CalendarPatterns.getTimeForStreamId(new Date()) +"_"+ runtimeFile;
+
+ cmd = new String[4];
+ cmd[0] = "cmd.exe";
+ cmd[1] = "/C";
+ cmd[2] = "start";
+ cmd[3] = executable_fileName;
+ }
+ log.debug("executable_fileName: "+executable_fileName);
+
+ //Create the Content of the Converter Script (.bat or
.sh File)
+ String fileContent = pathToSWFTools + "swfcombine"
+ + " -o " + "\"" + outputswf + "\""
+ + " -r " + fps
+ + " -z -a ";
+
+ for (Iterator<String> iter =
swfs.iterator();iter.hasNext();) {
+ String fileName = iter.next();
fileContent += " " + "\"" + fileName +"\"";
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"OpenMeetings developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/openmeetings-dev?hl=en
-~----------~----~----~----~------~----~------~--~---