Author: sebawagner
Date: Sat Apr 14 15:42:07 2012
New Revision: 1326133

URL: http://svn.apache.org/viewvc?rev=1326133&view=rev
Log:
OPENMEETINGS-165 Video freezes as soon as two people have audio/video turned on 
and you start to record the meeting => Convert FLV writers to act async

Added:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamVideoListener.java
      - copied, changed from r1326094, 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamVideoWriter.java
Removed:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/FLVDebugWriter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java
Modified:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/FlvRecorderConverter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/BaseStreamListener.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
 Sat Apr 14 15:42:07 2012
@@ -157,10 +157,10 @@ public abstract class BaseConverter {
                        for (FlvRecordingMetaData flvRecordingMetaData : 
metaDataList) {
                                
                                if 
(flvRecordingMetaData.getStreamReaderThreadComplete() == null) {
-                                       throw new 
Exception("StreamReaderThreadComplete Bit is NULL, error in recording");
+                                       throw new 
IllegalStateException("StreamReaderThreadComplete Bit is NULL, error in 
recording");
                                }
                                
-                               if 
(flvRecordingMetaData.getStreamReaderThreadComplete()) {
+                               if 
(!flvRecordingMetaData.getStreamReaderThreadComplete()) {
                                        
                                        log.debug("### meta Stream not yet 
written to disk" + flvRecordingMetaData.getFlvRecordingMetaDataId());
                                        boolean doStop = true;
@@ -168,8 +168,6 @@ public abstract class BaseConverter {
                                                
                                                log.debug("### Stream not yet 
written Thread Sleep - " );
                                                
-                                               Thread.sleep(100L);
-                                               
                                                flvRecordingMetaData = 
flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataById(flvRecordingMetaData.getFlvRecordingMetaDataId());
                                                
                                                if 
(flvRecordingMetaData.getStreamReaderThreadComplete()) {
@@ -177,8 +175,8 @@ public abstract class BaseConverter {
                                                        doStop = false;
                                                }
                                                
+                                               Thread.sleep(100L);
                                        }
-                                       
                                }
        
                                String inputFlv = streamFolderName
@@ -191,6 +189,8 @@ public abstract class BaseConverter {
                                
flvRecordingMetaData.setWavAudioData(hashFileName);
        
                                File inputFlvFile = new File(inputFlv);
+                               
+                               log.debug("FLV File Name: {} Length: {} 
",inputFlvFile.getName(), inputFlvFile.length());
        
                                if (inputFlvFile.exists()) {
        

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/FlvRecorderConverter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/FlvRecorderConverter.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/FlvRecorderConverter.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/FlvRecorderConverter.java
 Sat Apr 14 15:42:07 2012
@@ -82,6 +82,31 @@ public class FlvRecorderConverter extend
                        FlvRecordingMetaData flvRecordingMetaDataOfScreen = 
this.flvRecordingMetaDataDaoImpl
                                        
.getFlvRecordingMetaDataScreenFlvByRecording(flvRecording
                                                        .getFlvRecordingId());
+                       
+                       if 
(flvRecordingMetaDataOfScreen.getStreamReaderThreadComplete() == null) {
+                               throw new Exception("StreamReaderThreadComplete 
Bit is NULL, error in recording");
+                       }
+                       
+                       if 
(!flvRecordingMetaDataOfScreen.getStreamReaderThreadComplete()) {
+                               
+                               log.debug("### meta ScreenStream not yet 
written to disk" + flvRecordingMetaDataOfScreen.getFlvRecordingMetaDataId());
+                               boolean doStop = true;
+                               while(doStop) {
+                                       
+                                       log.debug("### Stream not yet written 
Thread Sleep - " );
+                                       
+                                       Thread.sleep(100L);
+                                       
+                                       flvRecordingMetaDataOfScreen = 
flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataById(flvRecordingMetaDataOfScreen.getFlvRecordingMetaDataId());
+                                       
+                                       if 
(flvRecordingMetaDataOfScreen.getStreamReaderThreadComplete()) {
+                                               log.debug("### Screen Stream 
now written Thread continue - " );
+                                               doStop = false;
+                                       }
+                               }
+                       }
+                       
+                       
                        String hashFileFullName = flvRecordingMetaDataOfScreen
                                        .getStreamName() + "_FINAL_WAVE.wav";
                        String outputFullWav = streamFolderName + 
hashFileFullName;

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/BaseStreamListener.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/BaseStreamListener.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/BaseStreamListener.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/BaseStreamListener.java
 Sat Apr 14 15:42:07 2012
@@ -18,98 +18,10 @@
  */
 package org.openmeetings.app.data.flvrecord.listener;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaDelta;
-import org.red5.io.IStreamableFile;
-import org.red5.io.IStreamableFileFactory;
-import org.red5.io.IStreamableFileService;
-import org.red5.io.ITagWriter;
-import org.red5.io.StreamableFileFactory;
-import org.red5.server.api.IScope;
-import org.red5.server.api.ScopeUtils;
-import org.red5.server.api.stream.IBroadcastStream;
 import org.red5.server.api.stream.IStreamListener;
-import org.red5.server.api.stream.IStreamPacket;
 
 public abstract class BaseStreamListener implements IStreamListener {
        
-       protected ITagWriter writer = null;
-       
-       protected Long flvRecordingMetaDataId = null;
-       protected List<FlvRecordingMetaDelta> flvRecordingMetaDeltas;
-       
-       protected Date startedSessionTimeDate = null;
-       
-       protected File file;
-       
-       protected IScope scope;
-       
-       protected boolean isClosed = false;
-
-       protected boolean isScreenData = false;
-       
-       protected Long offset = 0L;
-       
-       protected String streamName = "";
-
-       protected boolean isInterview;
-       
-       public BaseStreamListener(String streamName, IScope scope, 
-                       Long flvRecordingMetaDataId, boolean isScreenData,
-                       boolean isInterview) {
-               super();
-               this.startedSessionTimeDate = new Date();
-               this.isScreenData  = isScreenData;
-               this.streamName  = streamName;
-               this.flvRecordingMetaDataId = flvRecordingMetaDataId;
-               this.flvRecordingMetaDeltas = new 
LinkedList<FlvRecordingMetaDelta>();
-               this.scope = scope;
-               this.isInterview = isInterview;
-       }
-
-       public Long getFlvRecordingMetaDataId() {
-               return flvRecordingMetaDataId;
-       }       
-       
        public abstract void closeStream();
-       
-       /**
-     * Initialization
-     *
-     * @throws IOException          I/O exception
-     */
-    protected void init() throws IOException {
-
-               IStreamableFileFactory factory = (IStreamableFileFactory) 
ScopeUtils
-                               .getScopeService(this.scope, 
IStreamableFileFactory.class,
-                                               StreamableFileFactory.class);
-               
-               File folder = file.getParentFile();
-
-               if (!folder.exists()) {
-                       if (!folder.mkdirs()) {
-                               throw new IOException("Could not create parent 
folder");
-                       }
-               }
-
-               if (!this.file.isFile()) {
-
-                       // Maybe the (previously existing) file has been deleted
-                       this.file.createNewFile();
-
-               } else if (!file.canWrite()) {
-                       throw new IOException("The file is read-only");
-               }
-
-               IStreamableFileService service = factory.getService(this.file);
-               IStreamableFile flv = service.getStreamableFile(this.file);
-               this.writer = flv.getWriter();
-
-       }
 
 }

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
 Sat Apr 14 15:42:07 2012
@@ -37,15 +37,12 @@ public class StreamAudioListener extends
                        StreamAudioListener.class, 
OpenmeetingsVariables.webAppRootKey);
 
        private final StreamAudioWriter streamAudioWriter;
-
+       
        public StreamAudioListener(String streamName, IScope scope,
                        Long flvRecordingMetaDataId, boolean isScreenData,
                        boolean isInterview,
                        FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
                        FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
-               // Auto-generated method stub
-               super(streamName, scope, flvRecordingMetaDataId, isScreenData,
-                               isInterview);
                streamAudioWriter = new StreamAudioWriter(streamName, scope,
                                flvRecordingMetaDataId, isScreenData, 
isInterview,
                                flvRecordingMetaDeltaDao, 
flvRecordingMetaDataDao);

Copied: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamVideoListener.java
 (from r1326094, 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java)
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamVideoListener.java?p2=incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamVideoListener.java&p1=incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java&r1=1326094&r2=1326133&rev=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamVideoListener.java
 Sat Apr 14 15:42:07 2012
@@ -18,144 +18,45 @@
  */
 package org.openmeetings.app.data.flvrecord.listener;
 
-import java.io.File;
-import java.io.IOException;
 import java.util.Date;
 
-import org.apache.mina.core.buffer.IoBuffer;
 import org.openmeetings.app.OpenmeetingsVariables;
 import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
-import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaData;
-import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
-import org.red5.io.ITag;
-import org.red5.io.flv.impl.Tag;
+import org.openmeetings.app.data.flvrecord.listener.async.CachedEvent;
+import org.openmeetings.app.data.flvrecord.listener.async.StreamVideoWriter;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IScope;
 import org.red5.server.api.stream.IBroadcastStream;
 import org.red5.server.api.stream.IStreamPacket;
 import org.slf4j.Logger;
 
-public class StreamScreenListener extends BaseStreamListener {
-
-       private int startTimeStamp = -1;
-
-       private Date startedSessionScreenTimeDate = null;
-
-       private long initialDelta = 0;
-
+public class StreamVideoListener extends BaseStreamListener {
+       
        private static final Logger log = Red5LoggerFactory.getLogger(
-                       StreamScreenListener.class, 
OpenmeetingsVariables.webAppRootKey);
+                       StreamVideoListener.class, 
OpenmeetingsVariables.webAppRootKey);
 
-       // Autowire is not possible
-       private final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
+       private final StreamVideoWriter streamVideoWriter;
 
-       public StreamScreenListener(String streamName, IScope scope,
+       public StreamVideoListener(String streamName, IScope scope,
                        Long flvRecordingMetaDataId, boolean isScreenData,
                        boolean isInterview,
                        FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
-               super(streamName, scope, flvRecordingMetaDataId, isScreenData,
-                               isInterview);
-               // Auto-generated constructor stub
-               this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
+               streamVideoWriter = new StreamVideoWriter(streamName, scope, 
flvRecordingMetaDataId, isScreenData,
+                               isInterview, flvRecordingMetaDataDao);
        }
 
        public void packetReceived(IBroadcastStream broadcastStream,
                        IStreamPacket streampacket) {
                try {
 
-                       // We only are concerned about video at this moment
-                       // if (streampacket.getDataType() == 9) {
-
-                       if (this.startedSessionScreenTimeDate == null) {
-
-                               this.startedSessionScreenTimeDate = new Date();
-
-                               // Calculate the delta between the initial 
start and the first
-                               // packet data
-
-                               this.initialDelta = 
this.startedSessionScreenTimeDate.getTime()
-                                               - 
this.startedSessionTimeDate.getTime();
-
-                               // This is important for the Interview Post 
Processing to get
-                               // the time between starting the stream and the 
actual Access to
-                               // the
-                               // webcam by the Flash Security Dialog
-                               
flvRecordingMetaDataDao.updateFlvRecordingMetaDataInitialGap(
-                                               flvRecordingMetaDataId, 
this.initialDelta);
-
-                       }
-
-                       if (this.isClosed) {
-                               // Already closed this One
-                               return;
-                       }
-
-                       if (streampacket.getTimestamp() <= 0) {
-                               log.warn("Negative TimeStamp");
-                               return;
-                       }
-
-                       IoBuffer data = 
streampacket.getData().asReadOnlyBuffer();
-
-                       if (data.limit() == 0) {
-                               return;
-                       }
-
-                       if (startTimeStamp == -1) {
-
-                               // That will be not bigger then long value
-                               startTimeStamp = streampacket.getTimestamp();
-                       }
-
-                       if (writer == null) {
-
-                               File folder = new 
File(ScopeApplicationAdapter.webAppPath
-                                               + File.separatorChar + 
"streams" + File.separatorChar
-                                               + this.scope.getName());
+                       CachedEvent cachedEvent = new CachedEvent();
+                       cachedEvent.setData(streampacket.getData().duplicate());
+                       cachedEvent.setDataType(streampacket.getDataType());
+                       cachedEvent.setTimestamp(streampacket.getTimestamp());
+                       cachedEvent.setCurrentTime(new Date());
 
-                               if (!folder.exists()) {
-                                       folder.mkdir();
-                               }
+                       streamVideoWriter.append(cachedEvent);
 
-                               String flvName = 
ScopeApplicationAdapter.webAppPath
-                                               + File.separatorChar + 
"streams" + File.separatorChar
-                                               + this.scope.getName() + 
File.separatorChar
-                                               + this.streamName + ".flv";
-
-                               file = new File(flvName);
-                               init();
-                       }
-
-                       int timeStamp = streampacket.getTimestamp();
-
-                       timeStamp -= startTimeStamp;
-
-                       ITag tag = new Tag();
-                       tag.setDataType(streampacket.getDataType());
-
-                       // log.debug("data.limit() :: "+data.limit());
-                       tag.setBodySize(data.limit());
-                       tag.setTimestamp(timeStamp);
-                       tag.setBody(data);
-
-                       if (this.isInterview) {
-                               if (timeStamp <= 500) {
-                                       // We will cut the first 0.5 seconds
-                                       // The First seconds seem to break the 
Recording Video often
-                                       return;
-                               }
-                       }
-                       
-                       if (this.isClosed) {
-                               throw new Exception("Stream was already 
closed");
-                       }
-
-                       writer.writeTag(tag);
-
-                       // }
-
-               } catch (IOException e) {
-                       log.error("[packetReceived]", e);
                } catch (Exception e) {
                        log.error("[packetReceived]", e);
                }
@@ -163,30 +64,7 @@ public class StreamScreenListener extend
 
        @Override
        public void closeStream() {
-               if (writer != null && !this.isClosed) {
-                       try {
-
-                               // Add Delta in the beginning, this Delta is 
the Gap between the
-                               // device chosen and when the User hits the 
button in the Flash
-                               // Security Warning
-                               FlvRecordingMetaData flvRecordingMetaData = 
flvRecordingMetaDataDao
-                                               
.getFlvRecordingMetaDataById(this.flvRecordingMetaDataId);
-
-                               flvRecordingMetaData.setRecordStart(new Date(
-                                               
flvRecordingMetaData.getRecordStart().getTime()
-                                                               + 
this.initialDelta));
-
-                               flvRecordingMetaDataDao
-                                               
.updateFlvRecordingMetaData(flvRecordingMetaData);
-
-                               writer.close();
-
-                               this.isClosed = true;
-
-                       } catch (Exception err) {
-                               log.error("[closeStream]", err);
-                       }
-               }
+               streamVideoWriter.stop();
        }
-
+       
 }

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
 Sat Apr 14 15:42:07 2012
@@ -3,16 +3,11 @@ package org.openmeetings.app.data.flvrec
 import java.io.File;
 import java.io.IOException;
 import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 import org.openmeetings.app.OpenmeetingsVariables;
-import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
-import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDeltaDaoImpl;
-import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaDelta;
 import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
 import org.red5.io.IStreamableFile;
 import org.red5.io.IStreamableFileFactory;
@@ -39,7 +34,6 @@ public abstract class BaseStreamWriter i
        protected ITagWriter writer = null;
 
        protected Long flvRecordingMetaDataId = null;
-       protected List<FlvRecordingMetaDelta> flvRecordingMetaDeltas;
 
        protected Date startedSessionTimeDate = null;
 
@@ -55,24 +49,15 @@ public abstract class BaseStreamWriter i
 
        private final BlockingQueue<CachedEvent> queue = new 
LinkedBlockingQueue<CachedEvent>();
 
-       // Autowire is not possible
-       protected final FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao;
-       protected final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
-
        public BaseStreamWriter(String streamName, IScope scope,
                        Long flvRecordingMetaDataId, boolean isScreenData,
-                       boolean isInterview,
-                       FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
-                       FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
+                       boolean isInterview) {
                this.startedSessionTimeDate = new Date();
                this.isScreenData = isScreenData;
                this.streamName = streamName;
                this.flvRecordingMetaDataId = flvRecordingMetaDataId;
-               this.flvRecordingMetaDeltas = new 
LinkedList<FlvRecordingMetaDelta>();
                this.scope = scope;
                this.isInterview = isInterview;
-               this.flvRecordingMetaDeltaDao = flvRecordingMetaDeltaDao;
-               this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
                try {
                        init();
                } catch (IOException ex) {

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
 Sat Apr 14 15:42:07 2012
@@ -33,13 +33,19 @@ public class StreamAudioWriter extends B
 
        private long byteCount = 0;
        
+       // Autowire is not possible
+       protected final FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao;
+       protected final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
+       
        public StreamAudioWriter(String streamName, IScope scope,
                        Long flvRecordingMetaDataId, boolean isScreenData,
                        boolean isInterview,
                        FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
                        FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
-               super(streamName, scope, flvRecordingMetaDataId, isScreenData, 
isInterview,
-                               flvRecordingMetaDeltaDao, 
flvRecordingMetaDataDao);
+               super(streamName, scope, flvRecordingMetaDataId, isScreenData, 
isInterview);
+               
+               this.flvRecordingMetaDeltaDao = flvRecordingMetaDeltaDao;
+               this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
                
                FlvRecordingMetaData flvRecordingMetaData = 
flvRecordingMetaDataDao.
                                                                
getFlvRecordingMetaDataById(flvRecordingMetaDataId);
@@ -112,8 +118,6 @@ public class StreamAudioWriter extends B
                                        
flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
                                        
flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
 
-                                       
this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
                                        flvRecordingMetaDeltaDao
                                                        
.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
 
@@ -179,8 +183,6 @@ public class StreamAudioWriter extends B
                                        
flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
                                        
flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
 
-                                       
this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
                                        flvRecordingMetaDeltaDao
                                                        
.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
 
@@ -242,8 +244,6 @@ public class StreamAudioWriter extends B
                        
flvRecordingMetaDelta.setStartTime(this.startedSessionTimeDate);
                        flvRecordingMetaDelta.setCurrentTime(new Date());
 
-                       this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
                        flvRecordingMetaDeltaDao
                                        
.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
                        

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamVideoWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamVideoWriter.java?rev=1326133&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamVideoWriter.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamVideoWriter.java
 Sat Apr 14 15:42:07 2012
@@ -0,0 +1,144 @@
+package org.openmeetings.app.data.flvrecord.listener.async;
+
+import java.io.IOException;
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.openmeetings.app.OpenmeetingsVariables;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
+import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaData;
+import org.red5.io.ITag;
+import org.red5.io.flv.impl.Tag;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.IScope;
+import org.slf4j.Logger;
+
+public class StreamVideoWriter extends BaseStreamWriter {
+       
+       private int startTimeStamp = -1;
+
+       private Date startedSessionScreenTimeDate = null;
+
+       private long initialDelta = 0;
+       
+       private final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
+
+       private static final Logger log = Red5LoggerFactory.getLogger(
+                       StreamVideoWriter.class, 
OpenmeetingsVariables.webAppRootKey);
+       
+       public StreamVideoWriter(String streamName, IScope scope,
+                       Long flvRecordingMetaDataId, boolean isScreenData,
+                       boolean isInterview,
+                       FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
+               
+               super(streamName, scope, flvRecordingMetaDataId, isScreenData, 
isInterview);
+               
+               this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
+               
+               FlvRecordingMetaData flvRecordingMetaData = 
flvRecordingMetaDataDao.
+                               
getFlvRecordingMetaDataById(flvRecordingMetaDataId);
+               flvRecordingMetaData.setStreamReaderThreadComplete(false);
+               
flvRecordingMetaDataDao.updateFlvRecordingMetaData(flvRecordingMetaData);
+       }
+       
+       @Override
+       public void packetReceived(CachedEvent streampacket) {
+               try {
+
+                       // We only are concerned about video at this moment
+                       // if (streampacket.getDataType() == 9) {
+                       
+                       int timeStamp = streampacket.getTimestamp();
+                       Date virtualTime = streampacket.getCurrentTime();
+
+                       if (this.startedSessionScreenTimeDate == null) {
+
+                               this.startedSessionScreenTimeDate = virtualTime;
+
+                               // Calculate the delta between the initial 
start and the first
+                               // packet data
+
+                               this.initialDelta = 
this.startedSessionScreenTimeDate.getTime()
+                                               - 
this.startedSessionTimeDate.getTime();
+
+                               // This is important for the Interview Post 
Processing to get
+                               // the time between starting the stream and the 
actual Access to
+                               // the
+                               // webcam by the Flash Security Dialog
+                               
flvRecordingMetaDataDao.updateFlvRecordingMetaDataInitialGap(
+                                               flvRecordingMetaDataId, 
this.initialDelta);
+
+                       }
+
+                       if (streampacket.getTimestamp() <= 0) {
+                               log.warn("Negative TimeStamp");
+                               return;
+                       }
+
+                       IoBuffer data = 
streampacket.getData().asReadOnlyBuffer();
+
+                       if (data.limit() == 0) {
+                               return;
+                       }
+
+                       if (startTimeStamp == -1) {
+                               // That will be not bigger then long value
+                               startTimeStamp = streampacket.getTimestamp();
+                       }
+
+                       timeStamp -= startTimeStamp;
+
+                       ITag tag = new Tag();
+                       tag.setDataType(streampacket.getDataType());
+
+                       // log.debug("data.limit() :: "+data.limit());
+                       tag.setBodySize(data.limit());
+                       tag.setTimestamp(timeStamp);
+                       tag.setBody(data);
+
+                       if (this.isInterview) {
+                               if (timeStamp <= 500) {
+                                       // We will cut the first 0.5 seconds
+                                       // The First seconds seem to break the 
Recording Video often
+                                       return;
+                               }
+                       }
+                       
+                       writer.writeTag(tag);
+
+               } catch (IOException e) {
+                       log.error("[packetReceived]", e);
+               } catch (Exception e) {
+                       log.error("[packetReceived]", e);
+               }
+       }
+
+       @Override
+       public void closeStream() {
+               try {
+                       
+                       writer.close();
+
+                       // Add Delta in the beginning, this Delta is the Gap 
between the
+                       // device chosen and when the User hits the button in 
the Flash
+                       // Security Warning
+                       FlvRecordingMetaData flvRecordingMetaData = 
flvRecordingMetaDataDao
+                                       
.getFlvRecordingMetaDataById(this.flvRecordingMetaDataId);
+
+                       flvRecordingMetaData.setRecordStart(new Date(
+                                       
flvRecordingMetaData.getRecordStart().getTime()
+                                                       + this.initialDelta));
+                       
+                       
flvRecordingMetaData.setStreamReaderThreadComplete(true);
+                       
+                       flvRecordingMetaDataDao
+                                       
.updateFlvRecordingMetaData(flvRecordingMetaData);
+                       
+                       
+
+               } catch (Exception err) {
+                       log.error("[closeStream]", err);
+               }
+       }
+
+}

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java?rev=1326133&r1=1326132&r2=1326133&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java
 Sat Apr 14 15:42:07 2012
@@ -42,7 +42,7 @@ import org.openmeetings.app.data.flvreco
 import org.openmeetings.app.data.flvrecord.converter.FlvRecorderConverterTask;
 import org.openmeetings.app.data.flvrecord.listener.BaseStreamListener;
 import org.openmeetings.app.data.flvrecord.listener.StreamAudioListener;
-import org.openmeetings.app.data.flvrecord.listener.StreamScreenListener;
+import org.openmeetings.app.data.flvrecord.listener.StreamVideoListener;
 import org.openmeetings.app.data.user.Usermanagement;
 import org.openmeetings.app.data.user.dao.UsersDaoImpl;
 import org.openmeetings.app.persistence.beans.flvrecord.FlvRecording;
@@ -324,7 +324,7 @@ public class FLVRecorderService implemen
                        // Save the stream to disk.
                        if (isScreenData) {
                                
-                               StreamScreenListener streamScreenListener = new 
StreamScreenListener(streamName,
+                               StreamVideoListener streamScreenListener = new 
StreamVideoListener(streamName,
                                                                                
                                                                
conn.getScope(), flvRecordingMetaDataId, isScreenData,
                                                                                
                                                                isInterview, 
flvRecordingMetaDataDao);
                                
@@ -343,7 +343,7 @@ public class FLVRecorderService implemen
 
                                if (isInterview) {
                                        
-                                       StreamScreenListener 
streamScreenListener = new StreamScreenListener("AV_"
+                                       StreamVideoListener 
streamScreenListener = new StreamVideoListener("AV_"
                                                                                
                                                                + streamName, 
conn.getScope(),
                                                                                
                                                                
flvRecordingMetaDataId, isScreenData, isInterview,
                                                                                
                                                                
flvRecordingMetaDataDao);


Reply via email to