From: jreichen <jre...@us...> - 2011-01-15 21:15:25
|
Update of /cvsroot/sageplugins/MediaStreaming/src/sagex/streaming/servlet In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv20907/src/sagex/streaming/servlet Modified Files: HTTPLiveStreamingSegmentServlet.java Log Message: - Added a URL to allow clients to kill transcoding processes on the server - Added more logging detail - Refactored playlist generation code Index: HTTPLiveStreamingSegmentServlet.java =================================================================== RCS file: /cvsroot/sageplugins/MediaStreaming/src/sagex/streaming/servlet/HTTPLiveStreamingSegmentServlet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** HTTPLiveStreamingSegmentServlet.java 5 Nov 2010 02:58:36 -0000 1.2 --- HTTPLiveStreamingSegmentServlet.java 15 Jan 2011 21:15:15 -0000 1.3 *************** *** 1,5 **** package sagex.streaming.servlet; - import java.io.IOException; import java.util.Enumeration; --- 1,4 ---- *************** *** 21,24 **** --- 20,28 ---- throws Exception { + // remove servlet URL from thread name so the SageTV log is easier to read + String threadName = Thread.currentThread().getName(); + int i = threadName.indexOf("/stream"); + Thread.currentThread().setName(threadName.substring(0, i)); + Log.debug("HTTPLiveStreamingSegmentServlet: Request started"); Object mediaFile = super.getMediaFile(req); *************** *** 48,66 **** if (range != null && range.equals("bytes=0-1".trim())) { - // System.out.println("Writing 2 bytessss"); - // resp.setStatus(416); // Range not satisfiable resp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); - // resp.sendRedirect("/sagem/m/TranscodedMediaFile"); - // resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); - // resp.setHeader("location", "http://friesen.homelinux.com:8080/sagem/m/TranscodedMediaFile"); - // resp.setHeader("Location", "http://friesen.homelinux.com:8080/sagem/m/TranscodedMediaFile"); - // resp.setHeader("Content-Location", "http://friesen.homelinux.com:8080/sagem/m/TranscodedMediaFile"); - // resp.setHeader("Content-Type", "text/html"); - // resp.setContentType(getServletContext().getMimeType(file.getAbsolutePath())); - // resp.setHeader("Content-Length", "0"); - // resp.setHeader("Content-Range", "0-1/*"); - // resp.setHeader("Content-Range", "bytes 0-1/2"); resp.setHeader("Content-Range", "bytes 0-1/2000000"); - // resp.setHeader("Content-Range", "bytes 0-1/" + sp.getNextSegmentLength()); resp.setHeader("Content-Length", "2"); resp.getOutputStream().write(0); --- 52,57 ---- *************** *** 77,81 **** return; } ! String sequenceString = req.getParameter("Sequence"); String qualityString = req.getParameter("Quality"); --- 68,104 ---- return; } ! ! // look for command to stop transcoder and segmenter ! String commandString = req.getParameter("Command"); ! if (commandString != null) ! { ! if (commandString.toLowerCase().equals("stop")) ! { ! ServletContext sc = getServletContext(); ! SegmentManager sm = (SegmentManager) sc.getAttribute(AppContextListener.SEGMENT_MANAGER_ATTRIBUTE_NAME); ! SegmentProducer segmentProducer = null; ! ! synchronized (sm) ! { ! segmentProducer = sm.removeSegmentProducer(conversionId); ! ! if (segmentProducer != null) ! { ! synchronized (segmentProducer) ! { ! Log.debug("Client has sent a command to stop the transcoding for conversion id " + conversionId); ! segmentProducer.stop(); ! } ! } ! } ! } ! else ! { ! Log.info("Invalid command request parameter"); ! resp.setStatus(HttpServletResponse.SC_BAD_REQUEST); ! } ! return; // don't go any further if a command string was sent ! } ! String sequenceString = req.getParameter("Sequence"); String qualityString = req.getParameter("Quality"); *************** *** 133,141 **** resp.setStatus(HttpServletResponse.SC_OK); - // resp.setContentType(getServletContext().getMimeType(file.getAbsolutePath())); - // resp.setContentType("video/mp4"); resp.setContentType("video/MP2T"); - - // resp.setHeader("Content-Length", String.valueOf(sp.getNextSegmentLength()/*file.length()*/)); // TODO get from SegmentGobbler ServletContext sc = getServletContext(); --- 156,160 ---- *************** *** 156,190 **** synchronized (segmentProducer) { ! // TODO only call stream next segment, encapsulate the rest ! if (!segmentProducer.nextState(sequence, qualityString, mediaFileId, mediaFileSegment) /*|| (sp == null)*/) { ! try { segmentProducer.reset(); } ! catch (IOException e) ! { ! Log.info(e.getMessage()); ! Log.ignore(e); ! resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); ! return; ! } ! ! // System.out.println("HTTPLiveStreamingSegmentServlet: mime type " + getServletContext().getMimeType(f.getAbsolutePath())); } - - long len = segmentProducer.getNextSegmentLength(); - Log.debug("Content-Length: " + len); - resp.setHeader("Content-Length", Long.toString(len)); - segmentProducer.streamNextSegment(resp.getOutputStream()); } } resp.flushBuffer(); Log.debug("Request ended"); } // choose transcoder // transcode file // use time range - // return mime type video/MP2T - } --- 175,207 ---- synchronized (segmentProducer) { ! try { ! // TODO only call stream next segment, encapsulate the rest ! if (!segmentProducer.nextState(sequence, qualityString, mediaFileId, mediaFileSegment) /*|| (sp == null)*/) { segmentProducer.reset(); } ! ! long len = segmentProducer.getNextSegmentLength(); ! Log.debug("Content-Length: " + len); ! resp.setHeader("Content-Length", Long.toString(len)); ! segmentProducer.streamNextSegment(resp.getOutputStream()); ! } ! catch (Throwable t) ! { ! // explicitly print the stack trace here at any log level to try to help fix bugs ! Log.warn(t.getMessage(), t); ! // Error on the following line: Response already committed ! //resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); ! return; } } } resp.flushBuffer(); Log.debug("Request ended"); + Thread.currentThread().setName(threadName); } // choose transcoder // transcode file // use time range } |