1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00
ruby-opencv/ext/opencv/cvvideowriter.cpp
2011-06-11 02:46:52 +09:00

125 lines
3.1 KiB
C++

/************************************************************
cvvideowriter.cpp -
$Author: lsxi $
Copyright (C) 2005-2006 Masakazu Yonekura
************************************************************/
#include "cvvideowriter.h"
/*
* Document-class: OpenCV::CvVideoWriter
*
* Create video stream from images.
*
* C structure is "black box".
*/
__NAMESPACE_BEGIN_OPENCV
__NAMESPACE_BEGIN_CVVIDEOWRITER
VALUE rb_klass;
VALUE
rb_class()
{
return rb_klass;
}
void
define_ruby_class()
{
if (rb_klass)
return;
/*
* opencv = rb_define_module("OpenCV");
*
* note: this comment is used by rdoc.
*/
VALUE opencv = rb_module_opencv();
rb_klass = rb_define_class_under(opencv, "CvVideoWriter", rb_cObject);
rb_define_private_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
rb_define_method(rb_klass, "write", RUBY_METHOD_FUNC(rb_write), 1);
rb_define_method(rb_klass, "close", RUBY_METHOD_FUNC(rb_close), 0);
}
/*
* call-seq:
* CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>) -> cvvideowriter
* CvVideoWriter.new(<i>filname, fourcc, fps, size[, is_color]</i>){|vw| ... } -> nil
*
* Open new video writer. If block given, writer is closed automatically when end of block.
*
* note: if <i>fourcc</i> is nil, popup codec select dialog (Windows only).
*/
VALUE
rb_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE filename, fourcc, fps, size, is_color_val;
rb_scan_args(argc, argv, "41", &filename, &fourcc, &fps, &size, &is_color_val);
char codec[4] = {' ', ' ', ' ', ' '};
int codec_number;
Check_Type(filename, T_STRING);
if (RSTRING_LEN(filename) == 0)
rb_raise(rb_eArgError, "argument 1 (file name) dose not given");
if (NIL_P(fourcc))
codec_number = -1;
else {
Check_Type(fourcc, T_STRING);
if (RSTRING_LEN(fourcc) > 4)
rb_raise(rb_eStandardError, "argument 2 (fourcc) should be specific 4-character. (i.e \"PIM1\",\"MJPG\")");
else {
int len = RSTRING_LEN(fourcc);
for (int i = 0; i < len; ++i)
codec[i] = RSTRING_PTR(fourcc)[i];
codec_number = CV_FOURCC(codec[0], codec[1], codec[2], codec[3]);
}
}
int is_color;
if (NIL_P(is_color_val))
is_color = 1;
else
is_color = (is_color_val == Qtrue) ? 1 : 0;
DATA_PTR(self) = cvCreateVideoWriter(StringValueCStr(filename), codec_number,
NUM2DBL(fps), VALUE_TO_CVSIZE(size), is_color);
if (rb_block_given_p()) {
rb_yield(self);
rb_close(self);
return Qnil;
}
else
return self;
}
/*
* call-seq:
* write(<i>frame</i>)
*
* Write image as frame of video stream.
* <i>frame</i> should be CvMat or subclass.
*/
VALUE
rb_write(VALUE self, VALUE frame)
{
if (!rb_obj_is_kind_of(frame, cCvMat::rb_class()))
rb_raise(rb_eTypeError, "argument 1 (frame) should be %s or subclass", rb_class2name(cCvMat::rb_class()));
cvWriteFrame(CVVIDEOWRITER(self), IPLIMAGE(frame));
return self;
}
/*
* Close vidoe writer.
*/
VALUE
rb_close(VALUE self)
{
CvVideoWriter *writer = CVVIDEOWRITER(self);
if (writer)
cvReleaseVideoWriter(&writer);
return Qnil;
}
__NAMESPACE_END_CVVIDEOWRITER
__NAMESPACE_END_OPENCV