v4l2rtspserver/inc/V4L2DeviceSource.h

119 lines
3.4 KiB
C
Raw Normal View History

2014-07-20 14:02:14 +00:00
/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** V4L2DeviceSource.h
2014-07-20 14:02:14 +00:00
**
2021-04-04 15:10:07 +00:00
** live555 source
2014-07-20 14:02:14 +00:00
**
** -------------------------------------------------------------------------*/
#pragma once
2014-07-20 14:02:14 +00:00
#include <string>
#include <list>
#include <iostream>
2015-03-01 22:28:17 +00:00
#include <iomanip>
2014-07-20 14:02:14 +00:00
#include <pthread.h>
2014-07-20 14:02:14 +00:00
// live555
#include <liveMedia.hh>
#include "DeviceInterface.h"
2021-04-04 15:10:07 +00:00
// -----------------------------------------
// Video Device Source
2021-04-04 15:10:07 +00:00
// -----------------------------------------
class V4L2DeviceSource: public FramedSource
2014-07-20 14:02:14 +00:00
{
public:
// ---------------------------------
// Captured frame
// ---------------------------------
struct Frame
{
2020-07-24 19:01:01 +00:00
Frame(char* buffer, int size, timeval timestamp, char * allocatedBuffer = NULL) : m_buffer(buffer), m_size(size), m_timestamp(timestamp), m_allocatedBuffer(allocatedBuffer) {};
2014-10-18 17:50:21 +00:00
Frame(const Frame&);
Frame& operator=(const Frame&);
2020-07-24 19:01:01 +00:00
~Frame() { delete [] m_allocatedBuffer; };
2014-07-20 14:02:14 +00:00
char* m_buffer;
2018-02-25 22:55:20 +00:00
unsigned int m_size;
2014-07-20 14:02:14 +00:00
timeval m_timestamp;
2020-07-24 19:01:01 +00:00
char* m_allocatedBuffer;
2014-07-20 14:02:14 +00:00
};
// ---------------------------------
2014-08-17 15:29:08 +00:00
// Compute simple stats
2014-07-20 14:02:14 +00:00
// ---------------------------------
2014-08-17 14:42:26 +00:00
class Stats
2014-07-20 14:02:14 +00:00
{
public:
2014-08-17 14:42:26 +00:00
Stats(const std::string & msg) : m_fps(0), m_fps_sec(0), m_size(0), m_msg(msg) {};
2014-07-20 14:02:14 +00:00
public:
int notify(int tv_sec, int framesize);
2014-07-20 14:02:14 +00:00
protected:
int m_fps;
int m_fps_sec;
2014-08-17 14:42:26 +00:00
int m_size;
2014-07-20 14:02:14 +00:00
const std::string m_msg;
};
2021-11-07 16:56:36 +00:00
// ---------------------------------
// Capture Mode
// ---------------------------------
enum CaptureMode
{
CAPTURE_LIVE555_THREAD = 0,
CAPTURE_INTERNAL_THREAD,
NOCAPTURE
};
2014-07-20 14:02:14 +00:00
public:
2021-11-07 16:56:36 +00:00
static V4L2DeviceSource* createNew(UsageEnvironment& env, DeviceInterface * device, int outputFd, unsigned int queueSize, CaptureMode captureMode) ;
2021-04-04 15:10:07 +00:00
std::string getAuxLine() { return m_auxLine; }
void setAuxLine(const std::string auxLine) { m_auxLine = auxLine; }
2021-11-07 16:56:36 +00:00
DeviceInterface* getDevice() { return m_device; }
void postFrame(char * frame, int frameSize, const timeval &ref);
2014-07-20 14:02:14 +00:00
protected:
2021-11-07 16:56:36 +00:00
V4L2DeviceSource(UsageEnvironment& env, DeviceInterface * device, int outputFd, unsigned int queueSize, CaptureMode captureMode);
2014-07-20 14:02:14 +00:00
virtual ~V4L2DeviceSource();
protected:
static void* threadStub(void* clientData) { return ((V4L2DeviceSource*) clientData)->thread();};
virtual void* thread();
2014-07-20 14:02:14 +00:00
static void deliverFrameStub(void* clientData) {((V4L2DeviceSource*) clientData)->deliverFrame();};
void deliverFrame();
static void incomingPacketHandlerStub(void* clientData, int mask) { ((V4L2DeviceSource*) clientData)->incomingPacketHandler(); };
void incomingPacketHandler();
int getNextFrame();
2015-03-01 22:28:17 +00:00
void processFrame(char * frame, int frameSize, const timeval &ref);
2020-07-24 19:01:01 +00:00
void queueFrame(char * frame, int frameSize, const timeval &tv, char * allocatedBuffer = NULL);
2014-08-16 21:37:40 +00:00
// split packet in frames
virtual std::list< std::pair<unsigned char*,size_t> > splitFrames(unsigned char* frame, unsigned frameSize);
2014-08-16 21:37:40 +00:00
// overide FramedSource
virtual void doGetNextFrame();
2014-08-16 21:37:40 +00:00
protected:
2014-07-20 14:02:14 +00:00
std::list<Frame*> m_captureQueue;
2014-08-17 14:42:26 +00:00
Stats m_in;
Stats m_out;
2014-07-20 14:02:14 +00:00
EventTriggerId m_eventTriggerId;
2015-01-17 15:51:47 +00:00
int m_outfd;
DeviceInterface * m_device;
2014-10-11 19:07:53 +00:00
unsigned int m_queueSize;
pthread_t m_thid;
2015-03-30 20:09:24 +00:00
pthread_mutex_t m_mutex;
std::string m_auxLine;
2014-07-20 14:02:14 +00:00
};