framework2
372 строки · 9.8 Кб
1#include "ofVideoGrabber.h"
2#include "ofVideoBaseTypes.h"
3#include "ofGLUtils.h"
4#include "ofAppRunner.h"
5#include "ofConstants.h"
6#include "ofPixels.h"
7
8#ifdef OF_VIDEO_CAPTURE_IOS
9#include "ofxiOSVideoGrabber.h"
10#define OF_VID_GRABBER_TYPE ofxiOSVideoGrabber
11#endif
12
13#ifdef OF_VIDEO_CAPTURE_QUICKTIME
14#include "ofQuickTimeGrabber.h"
15#define OF_VID_GRABBER_TYPE ofQuickTimeGrabber
16#endif
17
18#ifdef OF_VIDEO_CAPTURE_QTKIT
19#include "ofQTKitGrabber.h"
20#define OF_VID_GRABBER_TYPE ofQTKitGrabber
21#endif
22
23#ifdef OF_VIDEO_CAPTURE_AVF
24#include "ofAVFoundationGrabber.h"
25#define OF_VID_GRABBER_TYPE ofAVFoundationGrabber
26#endif
27
28#ifdef OF_VIDEO_CAPTURE_DIRECTSHOW
29#include "ofDirectShowGrabber.h"
30#define OF_VID_GRABBER_TYPE ofDirectShowGrabber
31#endif
32
33#ifdef OF_VIDEO_CAPTURE_GSTREAMER
34#include "ofGstVideoGrabber.h"
35#define OF_VID_GRABBER_TYPE ofGstVideoGrabber
36#endif
37
38#ifdef OF_VIDEO_CAPTURE_ANDROID
39#include "ofxAndroidVideoGrabber.h"
40#define OF_VID_GRABBER_TYPE ofxAndroidVideoGrabber
41#endif
42
43#ifdef OF_VIDEO_CAPTURE_EMSCRIPTEN
44#include "ofxEmscriptenVideoGrabber.h"
45#define OF_VID_GRABBER_TYPE ofxEmscriptenVideoGrabber
46#endif
47
48using std::shared_ptr;
49using std::vector;
50
51//--------------------------------------------------------------------
52ofVideoGrabber::ofVideoGrabber(){
53bUseTexture = true;
54requestedDeviceID = -1;
55internalPixelFormat = OF_PIXELS_RGB;
56desiredFramerate = -1;
57tex.resize(1);
58}
59
60//--------------------------------------------------------------------
61ofVideoGrabber::~ofVideoGrabber(){
62}
63
64//--------------------------------------------------------------------
65void ofVideoGrabber::setGrabber(shared_ptr<ofBaseVideoGrabber> newGrabber){
66grabber = std::move(newGrabber);
67}
68
69//--------------------------------------------------------------------
70shared_ptr<ofBaseVideoGrabber> ofVideoGrabber::getGrabber(){
71if(!grabber){
72setGrabber(std::make_shared<OF_VID_GRABBER_TYPE>());
73}
74return grabber;
75}
76
77const shared_ptr<ofBaseVideoGrabber> ofVideoGrabber::getGrabber() const{
78return grabber;
79}
80
81//--------------------------------------------------------------------
82bool ofVideoGrabber::setup(int w, int h, bool setUseTexture){
83
84#ifndef OF_VID_GRABBER_TYPE
85#error OF_VID_GRABBER_TYPE is not #defined!
86#endif
87
88if(!grabber){
89setGrabber(std::make_shared<OF_VID_GRABBER_TYPE>());
90}
91
92bUseTexture = setUseTexture;
93
94if( requestedDeviceID >= 0 ){
95grabber->setDeviceID(requestedDeviceID);
96}
97
98setPixelFormat(internalPixelFormat); //this safely handles checks for supported format
99
100if( desiredFramerate!=-1 ){
101grabber->setDesiredFrameRate(desiredFramerate);
102}
103
104grabber->setup(w, h);
105
106if( grabber->isInitialized() && bUseTexture ){
107if(!grabber->getTexturePtr()){
108for(std::size_t i=0;i<grabber->getPixels().getNumPlanes();i++){
109ofPixels plane = grabber->getPixels().getPlane(i);
110tex.push_back(ofTexture());
111tex[i].allocate(plane);
112}
113}
114}
115
116return grabber->isInitialized();
117}
118
119//--------------------------------------------------------------------
120bool ofVideoGrabber::initGrabber(int w, int h, bool setUseTexture){
121return setup(w,h,setUseTexture);
122}
123
124//--------------------------------------------------------------------
125bool ofVideoGrabber::setPixelFormat(ofPixelFormat pixelFormat) {
126if(grabber){
127if( grabber->isInitialized() ){
128ofLogWarning("ofVideoGrabber") << "setPixelFormat(): can't set pixel format while grabber is running";
129internalPixelFormat = grabber->getPixelFormat();
130return false;
131}else{
132if( grabber->setPixelFormat(pixelFormat) ){
133internalPixelFormat = grabber->getPixelFormat(); //we do this as either way we want the grabbers format
134}else{
135internalPixelFormat = grabber->getPixelFormat(); //we do this as either way we want the grabbers format
136return false;
137}
138}
139}else{
140internalPixelFormat = pixelFormat;
141}
142return true;
143}
144
145//---------------------------------------------------------------------------
146ofPixelFormat ofVideoGrabber::getPixelFormat() const{
147if(grabber){
148internalPixelFormat = grabber->getPixelFormat();
149}
150return internalPixelFormat;
151}
152
153//--------------------------------------------------------------------
154vector<ofVideoDevice> ofVideoGrabber::listDevices() const{
155if(!grabber){
156ofVideoGrabber * mutThis = const_cast<ofVideoGrabber*>(this);
157mutThis->setGrabber(std::make_shared<OF_VID_GRABBER_TYPE>());
158}
159return grabber->listDevices();
160}
161
162//--------------------------------------------------------------------
163void ofVideoGrabber::setVerbose(bool bTalkToMe){
164if(grabber){
165grabber->setVerbose(bTalkToMe);
166}
167}
168
169//--------------------------------------------------------------------
170void ofVideoGrabber::setDeviceID(int _deviceID){
171requestedDeviceID = _deviceID;
172if( grabber && grabber->isInitialized() ){
173ofLogWarning("ofVideoGrabber") << "setDeviceID(): can't set device while grabber is running.";
174}
175}
176
177//--------------------------------------------------------------------
178void ofVideoGrabber::setDesiredFrameRate(int framerate){
179desiredFramerate = framerate;
180if(grabber){
181grabber->setDesiredFrameRate(framerate);
182}
183}
184
185//---------------------------------------------------------------------------
186ofPixels & ofVideoGrabber::getPixels(){
187return getGrabber()->getPixels();
188}
189
190//---------------------------------------------------------------------------
191const ofPixels & ofVideoGrabber::getPixels() const{
192return getGrabber()->getPixels();
193}
194
195//---------------------------------------------------------------------------
196ofPixels& ofVideoGrabber::getPixelsRef(){
197return getGrabber()->getPixels();
198}
199
200//---------------------------------------------------------------------------
201const ofPixels& ofVideoGrabber::getPixelsRef() const{
202return getGrabber()->getPixels();
203}
204
205//------------------------------------
206ofTexture & ofVideoGrabber::getTexture(){
207if(grabber->getTexturePtr() == nullptr){
208return tex[0];
209}
210else{
211return *grabber->getTexturePtr();
212}
213}
214
215//------------------------------------
216const ofTexture & ofVideoGrabber::getTexture() const{
217if(grabber->getTexturePtr() == nullptr){
218return tex[0];
219}
220else{
221return *grabber->getTexturePtr();
222}
223}
224
225//------------------------------------
226ofTexture & ofVideoGrabber::getTextureReference(){
227return getTexture();
228}
229
230//------------------------------------
231const ofTexture & ofVideoGrabber::getTextureReference() const{
232return getTexture();
233}
234
235//------------------------------------
236vector<ofTexture> & ofVideoGrabber::getTexturePlanes(){
237if(grabber->getTexturePtr() != nullptr){
238tex.clear();
239tex.push_back(*grabber->getTexturePtr());
240}
241return tex;
242}
243
244//------------------------------------
245const vector<ofTexture> & ofVideoGrabber::getTexturePlanes() const{
246if(grabber->getTexturePtr() != nullptr){
247ofVideoGrabber* mutThis = const_cast<ofVideoGrabber*>(this);
248mutThis->tex.clear();
249mutThis->tex.push_back(*grabber->getTexturePtr());
250}
251return tex;
252}
253
254//---------------------------------------------------------------------------
255bool ofVideoGrabber::isFrameNew() const{
256if(grabber){
257return grabber->isFrameNew();
258}
259return false;
260}
261
262//--------------------------------------------------------------------
263void ofVideoGrabber::update(){
264if(grabber){
265grabber->update();
266if( bUseTexture && !grabber->getTexturePtr() && grabber->isFrameNew() ){
267if(tex.size()!=grabber->getPixels().getNumPlanes()){
268tex.resize(grabber->getPixels().getNumPlanes());
269}
270for(std::size_t i=0;i<grabber->getPixels().getNumPlanes();i++){
271ofPixels plane = grabber->getPixels().getPlane(i);
272bool bDiffPixFormat = ( tex[i].isAllocated() && tex[i].texData.glInternalFormat != ofGetGLInternalFormatFromPixelFormat(plane.getPixelFormat()) );
273if(bDiffPixFormat || !tex[i].isAllocated() ){
274tex[i].allocate(plane);
275}else{
276tex[i].loadData(plane);
277}
278}
279}
280}
281}
282
283//--------------------------------------------------------------------
284void ofVideoGrabber::close(){
285if(grabber){
286grabber->close();
287}
288tex.clear();
289}
290
291//--------------------------------------------------------------------
292void ofVideoGrabber::videoSettings(void){
293if(grabber){
294grabber->videoSettings();
295}
296}
297
298//------------------------------------
299void ofVideoGrabber::setUseTexture(bool bUse){
300bUseTexture = bUse;
301}
302
303//------------------------------------
304bool ofVideoGrabber::isUsingTexture() const{
305return bUseTexture;
306}
307
308
309//----------------------------------------------------------
310void ofVideoGrabber::setAnchorPercent(float xPct, float yPct){
311getTexture().setAnchorPercent(xPct, yPct);
312}
313
314//----------------------------------------------------------
315void ofVideoGrabber::setAnchorPoint(float x, float y){
316getTexture().setAnchorPoint(x, y);
317}
318
319//----------------------------------------------------------
320void ofVideoGrabber::resetAnchor(){
321getTexture().resetAnchor();
322}
323
324//------------------------------------
325void ofVideoGrabber::draw(float _x, float _y, float _w, float _h) const{
326ofGetCurrentRenderer()->draw(*this,_x,_y,_w,_h);
327}
328
329//------------------------------------
330void ofVideoGrabber::draw(float _x, float _y) const{
331draw(_x, _y,getWidth(),getHeight());
332}
333
334
335//------------------------------------
336void ofVideoGrabber::bind() const{
337shared_ptr<ofBaseGLRenderer> renderer = ofGetGLRenderer();
338if(renderer){
339renderer->bind(*this);
340}
341}
342
343//------------------------------------
344void ofVideoGrabber::unbind() const{
345shared_ptr<ofBaseGLRenderer> renderer = ofGetGLRenderer();
346if(renderer){
347renderer->unbind(*this);
348}
349}
350
351//----------------------------------------------------------
352float ofVideoGrabber::getHeight() const{
353if(grabber){
354return grabber->getHeight();
355}else{
356return 0;
357}
358}
359
360//----------------------------------------------------------
361float ofVideoGrabber::getWidth() const{
362if(grabber){
363return grabber->getWidth();
364}else{
365return 0;
366}
367}
368
369//----------------------------------------------------------
370bool ofVideoGrabber::isInitialized() const{
371return grabber && grabber->isInitialized() && (!bUseTexture || tex[0].isAllocated() || grabber->getTexturePtr());
372}
373