start writing to output V4L2 device

pull/33/head
Michel Promonet 10 years ago
parent 165f8359c3
commit fd84f3d494

@ -64,11 +64,11 @@ class V4L2DeviceSource: public FramedSource
};
public:
static V4L2DeviceSource* createNew(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, const std::string &outputFIle, unsigned int queueSize, int verbose) ;
static V4L2DeviceSource* createNew(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, int verbose) ;
std::string getAuxLine() { return m_auxLine; };
protected:
V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, const std::string &outputFIle, unsigned int queueSize, int verbose);
V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, int verbose);
virtual ~V4L2DeviceSource();
protected:
@ -90,10 +90,9 @@ class V4L2DeviceSource: public FramedSource
Stats m_in;
Stats m_out;
EventTriggerId m_eventTriggerId;
FILE* m_outfile;
int m_outfd;
std::string m_auxLine;
V4l2Capture * m_device;
std::string m_outputFIle;
unsigned int m_queueSize;
int m_verbose;
};

@ -48,25 +48,24 @@ int V4L2DeviceSource::Stats::notify(int tv_sec, int framesize, int verbose)
// ---------------------------------
// V4L2 FramedSource
// ---------------------------------
V4L2DeviceSource* V4L2DeviceSource::createNew(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, const std::string &outputFIle, unsigned int queueSize, int verbose)
V4L2DeviceSource* V4L2DeviceSource::createNew(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, int verbose)
{
V4L2DeviceSource* source = NULL;
if (device)
{
source = new V4L2DeviceSource(env, params, device, outputFIle, queueSize, verbose);
source = new V4L2DeviceSource(env, params, device, outputFd, queueSize, verbose);
}
return source;
}
// Constructor
V4L2DeviceSource::V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, const std::string &outputFIle, unsigned int queueSize, int verbose)
V4L2DeviceSource::V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters params, V4l2Capture * device, int outputFd, unsigned int queueSize, int verbose)
: FramedSource(env),
m_params(params),
m_in("in"),
m_out("out") ,
m_outfile(NULL),
m_outfd(outputFd),
m_device(device),
m_outputFIle(outputFIle),
m_queueSize(queueSize),
m_verbose(verbose)
{
@ -75,18 +74,12 @@ V4L2DeviceSource::V4L2DeviceSource(UsageEnvironment& env, V4L2DeviceParameters p
{
envir().taskScheduler().turnOnBackgroundReadHandling( m_device->getFd(), V4L2DeviceSource::incomingPacketHandlerStub, this);
}
if (!m_outputFIle.empty())
{
fprintf(stderr, "OutputFile:%s\n", m_outputFIle.c_str());
m_outfile = fopen(m_outputFIle.c_str(),"w");
}
}
// Destructor
V4L2DeviceSource::~V4L2DeviceSource()
{
envir().taskScheduler().deleteEventTrigger(m_eventTriggerId);
if (m_outfile) fclose(m_outfile);
m_device->captureStop();
}
@ -284,7 +277,7 @@ void V4L2DeviceSource::processFrame(char * frame, int &frameSize, const timeval
{
printf ("queueFrame\ttimestamp:%ld.%06ld\tsize:%d diff:%d ms queue:%d data:%02X%02X%02X%02X%02X...\n", ref.tv_sec, ref.tv_usec, frameSize, (int)(diff.tv_sec*1000+diff.tv_usec/1000), m_captureQueue.size(), frame[0], frame[1], frame[2], frame[3], frame[4]);
}
if (m_outfile) fwrite(frame, frameSize,1, m_outfile);
if (m_outfd != -1) write(m_outfd, frame, frameSize);
}
void V4L2DeviceSource::queueFrame(char * frame, int frameSize, const timeval &tv)

@ -18,6 +18,7 @@
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sstream>
@ -50,7 +51,7 @@ void sighandler(int n)
}
// -----------------------------------------
// signal handler
// add an RTSP session
// -----------------------------------------
void addSession(RTSPServer* rtspServer, const char* sessionName, ServerMediaSubsession *subSession)
{
@ -64,6 +65,47 @@ void addSession(RTSPServer* rtspServer, const char* sessionName, ServerMediaSubs
delete[] url;
}
// -----------------------------------------
// create video capture interface
// -----------------------------------------
V4l2Capture* createVideoCapure(const V4L2DeviceParameters & param, bool useMmap)
{
V4l2Capture* videoCapture = NULL;
if (useMmap)
{
videoCapture = V4l2MmapCapture::createNew(param);
}
else
{
videoCapture = V4l2ReadCapture::createNew(param);
}
return videoCapture;
}
// -----------------------------------------
// create output
// -----------------------------------------
int createOutput(const std::string & outputFile)
{
int outputFd = -1;
if (!outputFile.empty())
{
outputFd = open(outputFile.c_str(), O_WRONLY | O_CREAT);
struct v4l2_capability cap;
memset(&(cap), 0, sizeof(cap));
if (0 == ioctl(outputFd, VIDIOC_QUERYCAP, &cap))
{
LOG(INFO) << "Output device " << cap.driver << std::hex << cap.capabilities << "\n";
if (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)
{
LOG(INFO) << "Output device support OUTPUT\n";
}
}
}
return outputFd;
}
// -----------------------------------------
// entry point
// -----------------------------------------
@ -152,20 +194,13 @@ int main(int argc, char** argv)
// Init capture
LOG(NOTICE) << "Create V4L2 Source..." << dev_name << "\n";
V4L2DeviceParameters param(dev_name,format,width,height,fps,verbose);
V4l2Capture* videoCapture = NULL;
if (useMmap)
{
videoCapture = V4l2MmapCapture::createNew(param);
}
else
{
videoCapture = V4l2ReadCapture::createNew(param);
}
V4l2Capture* videoCapture = createVideoCapure(param, useMmap);
if (videoCapture)
{
LOG(NOTICE) << "Start V4L2 Capture..." << dev_name << "\n";
videoCapture->captureStart();
V4L2DeviceSource* videoES = V4L2DeviceSource::createNew(*env, param, videoCapture, outputFile, queueSize, verbose);
int outputFd = createOutput(outputFile);
V4L2DeviceSource* videoES = V4L2DeviceSource::createNew(*env, param, videoCapture, outputFd, queueSize, verbose);
if (videoES == NULL)
{
LOG(FATAL) << "Unable to create source for device " << dev_name << "\n";
@ -193,6 +228,10 @@ int main(int argc, char** argv)
}
videoCapture->captureStop();
delete videoCapture;
if (outputFd != -1)
{
close(outputFd);
}
}
Medium::close(rtspServer);
}

Loading…
Cancel
Save