1/* ---------------------------------------------------------------------------
2** This software is in the public domain, furnished "as is", without technical
3** support, and with no warranty, express or implied, as to its usefulness for
4** any purpose.
5**
6** V4l2DeviceSource.h
7**
8** V4L2 live555 source
9**
10** -------------------------------------------------------------------------*/
11
12
13#ifndef DEVICE_SOURCE
14#define DEVICE_SOURCE
15
16#include <string>
17#include <list>
18#include <iostream>
19#include <iomanip>
20
21#include <pthread.h>
22
23// live555
24#include <liveMedia.hh>
25
26#include "DeviceInterface.h"
27
28class V4L2DeviceSource: public FramedSource
29{
30 public:
31 // ---------------------------------
32 // Captured frame
33 // ---------------------------------
34 struct Frame
35 {
36 Frame(char* buffer, int size, timeval timestamp) : m_buffer(buffer), m_size(size), m_timestamp(timestamp) {};
37 Frame(const Frame&);
38 Frame& operator=(const Frame&);
39 ~Frame() { delete [] m_buffer; };
40
41 char* m_buffer;
42 unsigned int m_size;
43 timeval m_timestamp;
44 };
45
46 // ---------------------------------
47 // Compute simple stats
48 // ---------------------------------
49 class Stats
50 {
51 public:
52 Stats(const std::string & msg) : m_fps(0), m_fps_sec(0), m_size(0), m_msg(msg) {};
53
54 public:
55 int notify(int tv_sec, int framesize);
56
57 protected:
58 int m_fps;
59 int m_fps_sec;
60 int m_size;
61 const std::string m_msg;
62 };
63
64 public:
65 static V4L2DeviceSource* createNew(UsageEnvironment& env, DeviceInterface * device, int outputFd, unsigned int queueSize, bool useThread) ;
66 std::string getAuxLine() { return m_auxLine; };
67 void setAuxLine(const std::string auxLine) { m_auxLine = auxLine; };
68 int getWidth() { return m_device->getWidth(); };
69 int getHeight() { return m_device->getHeight(); };
70 int getCaptureFormat() { return m_device->getCaptureFormat(); };
71
72 protected:
73 V4L2DeviceSource(UsageEnvironment& env, DeviceInterface * device, int outputFd, unsigned int queueSize, bool useThread);
74 virtual ~V4L2DeviceSource();
75
76 protected:
77 static void* threadStub(void* clientData) { return ((V4L2DeviceSource*) clientData)->thread();};
78 void* thread();
79 static void deliverFrameStub(void* clientData) {((V4L2DeviceSource*) clientData)->deliverFrame();};
80 void deliverFrame();
81 static void incomingPacketHandlerStub(void* clientData, int mask) { ((V4L2DeviceSource*) clientData)->incomingPacketHandler(); };
82 void incomingPacketHandler();
83 int getNextFrame();
84 void processFrame(char * frame, int frameSize, const timeval &ref);
85 void queueFrame(char * frame, int frameSize, const timeval &tv);
86
87 // split packet in frames
88 virtual std::list< std::pair<unsigned char*,size_t> > splitFrames(unsigned char* frame, unsigned frameSize);
89
90 // overide FramedSource
91 virtual void doGetNextFrame();
92 virtual void doStopGettingFrames();
93
94 protected:
95 std::list<Frame*> m_captureQueue;
96 Stats m_in;
97 Stats m_out;
98 EventTriggerId m_eventTriggerId;
99 int m_outfd;
100 DeviceInterface * m_device;
101 unsigned int m_queueSize;
102 pthread_t m_thid;
103 pthread_mutex_t m_mutex;
104 std::string m_auxLine;
105};
106
107#endif
108