gephex--main--0.4--patch-1793
[email protected] Thu, 30 Sep 2004 11:11:31 +0200 (CEST)
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);
+ }
+ }
+
}