forked from ZoneMinder/zoneminder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzm_camera.h
136 lines (122 loc) · 4.53 KB
/
zm_camera.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//
// ZoneMinder Camera Class Interface, $Date$, $Revision$
// Copyright (C) 2001-2008 Philip Coombes
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
#ifndef ZM_CAMERA_H
#define ZM_CAMERA_H
#include "zm_image.h"
#include <sys/ioctl.h>
#include <sys/types.h>
#include <memory>
class Monitor;
class ZMPacket;
//
// Abstract base class for cameras. This is intended just to express
// common attributes
//
class Camera {
protected:
typedef enum { LOCAL_SRC, REMOTE_SRC, FILE_SRC, FFMPEG_SRC, LIBVLC_SRC, CURL_SRC, VNC_SRC } SourceType;
const Monitor *monitor;
SourceType type;
uint16_t width;
uint16_t height;
unsigned int linesize;
unsigned int colours;
unsigned int subpixelorder;
unsigned int pixels;
unsigned long long imagesize;
int brightness;
int hue;
int colour;
int contrast;
bool capture;
bool record_audio;
int mVideoStreamId;
int mAudioStreamId;
AVCodecContext *mVideoCodecContext;
AVCodecContext *mAudioCodecContext;
AVStream *mVideoStream;
AVStream *mAudioStream;
AVFormatContext *mFormatContext; // One for video, one for audio
AVFormatContext *mSecondFormatContext; // One for video, one for audio
int64_t mFirstVideoPTS;
int64_t mFirstAudioPTS;
int64_t mLastVideoPTS;
int64_t mLastAudioPTS;
unsigned int bytes;
public:
Camera(
const Monitor* monitor,
SourceType p_type,
unsigned int p_width,
unsigned int p_height,
int p_colours,
int p_subpixelorder,
int p_brightness,
int p_contrast,
int p_hue,
int p_colour,
bool p_capture,
bool p_record_audio
);
virtual ~Camera();
SourceType Type() const { return type; }
bool IsLocal() const { return type == LOCAL_SRC; }
bool IsRemote() const { return type == REMOTE_SRC; }
bool IsFile() const { return type == FILE_SRC; }
bool IsFfmpeg() const { return type == FFMPEG_SRC; }
bool IsLibvlc() const { return type == LIBVLC_SRC; }
bool IscURL() const { return type == CURL_SRC; }
bool IsVNC() const { return type == VNC_SRC; }
unsigned int Width() const { return width; }
unsigned int LineSize() const { return linesize; }
unsigned int Height() const { return height; }
unsigned int Colours() const { return colours; }
unsigned int SubpixelOrder() const { return subpixelorder; }
unsigned int Pixels() const { return pixels; }
unsigned long long ImageSize() const { return imagesize; }
unsigned int Bytes() const { return bytes; };
int getFrequency() { return mAudioStream ? mAudioStream->codecpar->sample_rate : -1; }
int getChannels() {
#if LIBAVUTIL_VERSION_CHECK(57, 28, 100, 28, 0)
return mAudioStream ? mAudioStream->codecpar->ch_layout.nb_channels : -1; }
#else
return mAudioStream ? mAudioStream->codecpar->channels : -1; }
#endif
virtual int Brightness( int/*p_brightness*/=-1 ) { return -1; }
virtual int Hue( int/*p_hue*/=-1 ) { return -1; }
virtual int Colour( int/*p_colour*/=-1 ) { return -1; }
virtual int Contrast( int/*p_contrast*/=-1 ) { return -1; }
bool CanCapture() const { return capture; }
bool SupportsNativeVideo() const {
return (type == FFMPEG_SRC);
//return (type == FFMPEG_SRC )||(type == REMOTE_SRC);
}
virtual AVStream *getVideoStream();
virtual AVStream *getAudioStream() { return mAudioStream; };
virtual AVCodecContext *getVideoCodecContext() { return mVideoCodecContext; };
virtual AVCodecContext *getAudioCodecContext() { return mAudioCodecContext; };
int getVideoStreamId() { return mVideoStreamId; };
int getAudioStreamId() { return mAudioStreamId; };
virtual int PrimeCapture() { return 0; }
virtual int PreCapture() = 0;
virtual int Capture(std::shared_ptr<ZMPacket> &p) = 0;
virtual int PostCapture() = 0;
virtual int Close() = 0;
};
#endif // ZM_CAMERA_H