diff --git a/src/VideoCaptureWrap.cc b/src/VideoCaptureWrap.cc index 6ccfaa3..a512cf9 100755 --- a/src/VideoCaptureWrap.cc +++ b/src/VideoCaptureWrap.cc @@ -37,6 +37,8 @@ VideoCaptureWrap::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(ctor, "setPosition", SetPosition); NODE_SET_PROTOTYPE_METHOD(ctor, "close", Close); NODE_SET_PROTOTYPE_METHOD(ctor, "ReadSync", ReadSync); + NODE_SET_PROTOTYPE_METHOD(ctor, "grab", Grab); + NODE_SET_PROTOTYPE_METHOD(ctor, "retrieve", Retrieve); target->Set(NanNew("VideoCapture"), ctor->GetFunction()); }; @@ -141,8 +143,10 @@ NAN_METHOD(VideoCaptureWrap::Close){ class AsyncVCWorker : public NanAsyncWorker { public: - AsyncVCWorker(NanCallback *callback, VideoCaptureWrap* vc, Matrix* matrix) - : NanAsyncWorker(callback), vc(vc), matrix(matrix) {} + AsyncVCWorker(NanCallback *callback, VideoCaptureWrap* vc, Matrix* matrix, + bool retrieve = false, int channel = 0) + : NanAsyncWorker(callback), vc(vc), matrix(matrix), + retrieve(retrieve), channel(channel) {} ~AsyncVCWorker() {} // Executed inside the worker-thread. @@ -150,7 +154,13 @@ class AsyncVCWorker : public NanAsyncWorker { // here, so everything we need for input and output // should go on `this`. void Execute () { - this->vc->cap.read(matrix->mat); + if (retrieve) { + if (!this->vc->cap.retrieve(matrix->mat, channel)) { + SetErrorMessage("retrieve failed"); + } + return; + } + this->vc->cap.read(matrix->mat); } // Executed when the async work is complete @@ -180,6 +190,8 @@ class AsyncVCWorker : public NanAsyncWorker { private: VideoCaptureWrap *vc; Matrix* matrix; + bool retrieve; + int channel; }; @@ -210,3 +222,49 @@ NAN_METHOD(VideoCaptureWrap::ReadSync) { NanReturnValue(im_to_return); } + + +class AsyncGrabWorker : public NanAsyncWorker { + public: + AsyncGrabWorker(NanCallback *callback, VideoCaptureWrap* vc) + : NanAsyncWorker(callback), vc(vc) {} + ~AsyncGrabWorker() {} + + void Execute () { + if (!this->vc->cap.grab()) { + SetErrorMessage("grab failed"); + } + } + + private: + VideoCaptureWrap *vc; +}; + +NAN_METHOD(VideoCaptureWrap::Grab) { + + NanScope(); + VideoCaptureWrap *v = ObjectWrap::Unwrap(args.This()); + + REQ_FUN_ARG(0, cb); + + NanCallback *callback = new NanCallback(cb.As()); + NanAsyncQueueWorker(new AsyncGrabWorker(callback, v)); + + NanReturnUndefined(); +} + +NAN_METHOD(VideoCaptureWrap::Retrieve) { + + NanScope(); + VideoCaptureWrap *v = ObjectWrap::Unwrap(args.This()); + + int channel = 0; + REQ_FUN_ARG(0, cb); + INT_FROM_ARGS(channel, 1); + + NanCallback *callback = new NanCallback(cb.As()); + NanAsyncQueueWorker(new AsyncVCWorker(callback, v, new Matrix(), true, channel)); + + NanReturnUndefined(); +} + diff --git a/src/VideoCaptureWrap.h b/src/VideoCaptureWrap.h index 02c2cf8..3b61e0a 100755 --- a/src/VideoCaptureWrap.h +++ b/src/VideoCaptureWrap.h @@ -14,6 +14,9 @@ class VideoCaptureWrap: public node::ObjectWrap { static NAN_METHOD(Read); static NAN_METHOD(ReadSync); + static NAN_METHOD(Grab); + static NAN_METHOD(Retrieve); + //(Optional) For setting width and height of the input video stream static NAN_METHOD(SetWidth); static NAN_METHOD(SetHeight);