gephex--main--0.4--patch-1793

[email protected]
Newsgroups gmane.comp.video.gephex.devel
Message-ID <[email protected]>
Archive: [email protected]
New revision: gephex--main--0.4--patch-1793

--
Revision: gephex--main--0.4--patch-1793
Archive: [email protected]
Creator: GePhex <[email protected]>
Date: Wed Sep 29 00:09:54 CEST 2004
Standard-date: 2004-09-28 22:09:54 GMT
Modified-files: modules/src/yuv4mpeg2module/y4moutputmodule.cpp
New-patches: [email protected]/gephex--main--0.4--patch-1793
    [email protected]/gephex--yuv4mpeg2--0.4--patch-5
Summary: share yuv4mpeg streams between graphs
Keywords: 

Patches applied:

 * [email protected]/gephex--yuv4mpeg2--0.4--patch-5
   share streams between module instances

* added files

    {arch}/gephex/gephex--main/gephex--main--0.4/[email protected]/patch-log/patch-1793
    {arch}/gephex/gephex--yuv4mpeg2/gephex--yuv4mpeg2--0.4/[email protected]/patch-log/patch-5

* modified files

--- orig/modules/src/yuv4mpeg2module/y4moutputmodule.cpp
+++ mod/modules/src/yuv4mpeg2module/y4moutputmodule.cpp
@@ -8,19 +8,23 @@
 #include <string>
 #include <vector>
 #include <sstream>
+#include <map>
+#include <stdexcept>
+
 #include "libcolorconv.h"
 
 static logT s_log;
 
-struct _MyInstance
+
+struct stream_dsc
 {
-  _MyInstance()
+  stream_dsc()
     : fd(0)
   {
     scaledFb=framebuffer_newInstance();
   }
 
-  ~_MyInstance()
+  ~stream_dsc()
   {
     if (fd) close(fd);
     
@@ -38,6 +42,13 @@
   FrameBufferType* scaledFb;
 };
 
+static std::map<std::string,stream_dsc*> stream_registry;
+
+struct _MyInstance
+{
+  //std::map<std::string,stream_dsc> dsc;
+};
+
 typedef _MyInstance MyInstance;
 typedef _MyInstance* MyInstancePtr;
 
@@ -67,6 +78,16 @@
   InstancePtr inst = (InstancePtr) instance;
   MyInstance& my = *inst->my;
 
+  std::string filename(inst->in_filename->text);
+  std::map<std::string,stream_dsc*>::iterator it;
+  it=stream_registry.find(filename);
+  if (it == stream_registry.end())
+    stream_registry.insert(std::make_pair(filename,new stream_dsc()));
+
+  stream_dsc& stream=*stream_registry[filename];
+
+  try
+    {
   int xsize = trim_int(inst->in_xsize->number, 1, 1400);
   int ysize = trim_int(inst->in_ysize->number, 1, 1080);
 
@@ -78,73 +99,74 @@
   assert(xsize%4==0);
   assert(ysize%4==0);
 
-  std::string filename(inst->in_filename->text);
-  
   // new stream?
-  if (my.fd == 0 || 
-      filename != my.filename ||
-      xsize != my.x_res || 
-      ysize != my.y_res)
+  if (stream.fd == 0 || 
+      filename != stream.filename ||
+      xsize != stream.x_res || 
+      ysize != stream.y_res)
     {
-      if (my.fd != 0)
+      if (stream.fd != 0)
 	{
-	  close(my.fd);
+	  close(stream.fd);
 	}
       
       // new stream
-      my.x_res=xsize;
-      my.y_res=ysize;
-      my.filename=filename;
+      stream.x_res=xsize;
+      stream.y_res=ysize;
+      stream.filename=filename;
       
       // open new file
       
-      // TODO append or new
-      my.fd= open(filename.c_str(),O_RDWR|O_CREAT,00666);
-      // TODO errorcheck
+      stream.fd= open(filename.c_str(),O_RDWR|O_CREAT|O_TRUNC,00666);
+      if (stream.fd == -1)
+	{
+	  stream.fd = 0;
+	  throw std::runtime_error("could not open stream");
+	}
       
       std::ostringstream stream_header_str;
       stream_header_str << "YUV4MPEG2 ";
-      stream_header_str << "W" << my.x_res << " ";
-      stream_header_str << "H" << my.y_res << " ";
+      stream_header_str << "W" << stream.x_res << " ";
+      stream_header_str << "H" << stream.y_res << " ";
       stream_header_str << "F30:1 I? A0:0
";
       
       std::string stream_header(stream_header_str.str());
-      my.stream_header_size=stream_header.length();
+      stream.stream_header_size=stream_header.length();
       
       std::string frame_header("FRAME
");
-      my.frame_header_size=frame_header.length();
+      stream.frame_header_size=frame_header.length();
       
-      my.yuv_buf.resize(my.stream_header_size +
-			my.frame_header_size + 
-			(my.x_res*my.y_res*6)/4);
+      stream.yuv_buf.resize(stream.stream_header_size +
+			stream.frame_header_size + 
+			(stream.x_res*stream.y_res*6)/4);
       
       // stream_header
       std::copy(stream_header.begin(),
 		stream_header.end(),
-		my.yuv_buf.begin());
+		stream.yuv_buf.begin());
       
       // frame_header
       std::copy(frame_header.begin(),
 		frame_header.end(),
-		my.yuv_buf.begin() + my.stream_header_size);
+		stream.yuv_buf.begin() + stream.stream_header_size);
       
       // write header next time
-      my.wrote_header=false;
+      stream.wrote_header=false;
     }
 
   // the framebuffer
   uint32_t* fb;
 
-  if (inst->in_in->xsize != my.x_res || inst->in_in->ysize != my.y_res)
+  if (inst->in_in->xsize != stream.x_res || inst->in_in->ysize != stream.y_res)
     {
       FrameBufferAttributes  in_attr;
       framebuffer_getAttributes(inst->in_in, &in_attr);
-      in_attr.xsize=my.x_res;
-      in_attr.ysize=my.y_res;
-      framebuffer_convertType(my.scaledFb, inst->in_in , &in_attr);
+      in_attr.xsize=stream.x_res;
+      in_attr.ysize=stream.y_res;
+      framebuffer_convertType(stream.scaledFb, inst->in_in , &in_attr);
       
       // use the scaled one
-      fb=my.scaledFb->framebuffer;
+      fb=stream.scaledFb->framebuffer;
     }
   else
     {
@@ -154,12 +176,12 @@
 
   // convert
   {
-    int pitches[3] ={ my.x_res, my.x_res/2, my.x_res/2 };
-    int offsets[3] ={0, my.x_res*my.y_res, 5*(my.x_res*my.y_res)/4};
+    int pitches[3] ={ stream.x_res, stream.x_res/2, stream.x_res/2 };
+    int offsets[3] ={0, stream.x_res*stream.y_res, 5*(stream.x_res*stream.y_res)/4};
 
-    cvt_rgb32_to_i420(&my.yuv_buf[my.stream_header_size +my.frame_header_size],
+    cvt_rgb32_to_i420(&stream.yuv_buf[stream.stream_header_size +stream.frame_header_size],
 		      fb,
-		      my.x_res, my.y_res,
+		      stream.x_res, stream.y_res,
 		      pitches, offsets);
     
   }
@@ -169,22 +191,36 @@
     uint8_t* start;
     size_t length;
   
-    if ( my.wrote_header )
+    if ( stream.wrote_header )
       {
-	start= &my.yuv_buf[my.stream_header_size];
-	length= my.yuv_buf.size()-my.stream_header_size;
+	start= &stream.yuv_buf[stream.stream_header_size];
+	length= stream.yuv_buf.size()-stream.stream_header_size;
       }
     else
       {
-	start= &my.yuv_buf[0];
-	length= my.yuv_buf.size();
-	my.wrote_header=true;
+	start= &stream.yuv_buf[0];
+	length= stream.yuv_buf.size();
+	stream.wrote_header=true;
       }
 
     // TODO select    
-    write(my.fd,start,length);
-    // TODO errorcheck
+    size_t wlen = write(stream.fd,start,length);
+    if (wlen == -1)
+      throw std::runtime_error("could not write to stream");
+    
+    if (wlen != length)
+      throw std::runtime_error("could not write full frame to stream");
+
     // TODO partial writes
   }
+    } 
+  catch (std::runtime_error& e)
+    {
+      if (stream.fd != 0)
+	{
+	  close(stream.fd);
+	}
+    }
+
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.