add_shortcut( "opencv_wrapper" );
set_callbacks( Create, Destroy );
add_float_with_range( "opencv-scale", 1.0, 0.1, 2.0, NULL,
- N_("Scale factor (0.1-2.0)"),
- N_("Ammount by which to scale the picture before sending it to the internal OpenCV filter"),
+ N_("Scale factor (0.1-2.0)"),
+ N_("Ammount by which to scale the picture before sending it to the internal OpenCV filter"),
VLC_FALSE );
add_string( "opencv-chroma", "input", NULL,
- N_("OpenCV filter chroma"),
+ N_("OpenCV filter chroma"),
N_("Chroma to convert picture to before sending it to the internal OpenCV filter"), VLC_FALSE);
change_string_list( chroma_list, chroma_list_text, 0);
add_string( "opencv-output", "input", NULL,
- N_("Wrapper filter output"),
+ N_("Wrapper filter output"),
N_("Determines what (if any) video is displayed by the wrapper filter"), VLC_FALSE);
change_string_list( output_list, output_list_text, 0);
add_string( "opencv-verbosity", "error", NULL,
- N_("Wrapper filter verbosity"),
+ N_("Wrapper filter verbosity"),
N_("Determines wrapper filter verbosity level"), VLC_FALSE);
change_string_list( verbosity_list, verbosity_list_text, 0);
add_string( "opencv-filter-name", "none", NULL,
- N_("OpenCV internal filter name"),
+ N_("OpenCV internal filter name"),
N_("Name of internal OpenCV plugin filter to use"), VLC_FALSE);
vlc_module_end();
};
/*****************************************************************************
- * verbosity_t:
+ * verbosity_t:
*****************************************************************************/
enum verbosity_t
{
VERB_WARN,
VERB_DEBUG
};
-
+
/*****************************************************************************
* vout_sys_t: opencv_wrapper video output method descriptor
*****************************************************************************
vout_thread_t *p_vout;
image_handler_t *p_image;
-
+
int i_cv_image_size;
-
+
picture_t *p_proc_image;
picture_t *p_to_be_freed;
-
+
float f_scale;
-
+
int i_wrapper_output;
int i_internal_chroma;
int i_verbosity;
IplImage *p_cv_image[VOUT_MAX_PLANES];
-
+
filter_t *p_opencv;
char* psz_inner_name;
-
+
picture_t hacked_pic;
};
p_vout->p_sys->psz_inner_name = config_GetPsz( p_vout, "opencv-filter-name" );
- p_vout->p_sys->f_scale =
+ p_vout->p_sys->f_scale =
config_GetFloat( p_vout, "opencv-scale" );
if (p_vout->p_sys->i_verbosity > VERB_WARN)
msg_Info(p_vout, "Configuration: opencv-scale: %f, opencv-chroma: %d, "
- "opencv-output: %d, opencv-verbosity %d, opencv-filter %s",
+ "opencv-output: %d, opencv-verbosity %d, opencv-filter %s",
p_vout->p_sys->f_scale,
p_vout->p_sys->i_internal_chroma,
p_vout->p_sys->i_wrapper_output,
p_vout->p_sys->i_verbosity,
p_vout->p_sys->psz_inner_name);
-
+
return VLC_SUCCESS;
}
p_vout->output.i_height = p_vout->render.i_height;
p_vout->output.i_aspect = p_vout->render.i_aspect;
p_vout->fmt_out = p_vout->fmt_in; //set to input video format
-
+
fmt = p_vout->fmt_out;
if (p_sys->i_wrapper_output == PROCESSED) //set to processed video format
{
fmt.i_visible_height = fmt.i_visible_height * p_sys->f_scale;
fmt.i_x_offset = fmt.i_x_offset * p_sys->f_scale;
fmt.i_y_offset = fmt.i_y_offset * p_sys->f_scale;
-
+
if (p_sys->i_internal_chroma == GREY)
fmt.i_chroma = VLC_FOURCC('I','4','2','0');
else if (p_sys->i_internal_chroma == RGB)
/* We don't need to set up video formats for this filter as it not actually using a picture_t */
p_sys->p_opencv = vlc_object_create( p_vout, sizeof(filter_t) );
vlc_object_attach( p_sys->p_opencv, p_vout );
-
+
if (p_vout->p_sys->psz_inner_name)
p_sys->p_opencv->p_module =
module_Need( p_sys->p_opencv, p_sys->psz_inner_name, 0, 0 );
-
+
if( !p_sys->p_opencv->p_module )
{
msg_Err( p_vout, "can't open internal opencv filter: %s", p_vout->p_sys->psz_inner_name );
i_index--;
free( PP_OUTPUTPICTURE[ i_index ]->p_data_orig );
}
-
+
if ( p_vout->p_sys->p_opencv )
{
//release the internal opencv filter
vlc_object_destroy( p_vout->p_sys->p_opencv );
p_vout->p_sys->p_opencv = NULL;
}
-
+
}
/*****************************************************************************
if( p_vout->p_sys->p_image )
image_HandlerDelete( p_vout->p_sys->p_image );
-
+
free( p_vout->p_sys );
}
}
}
p_vout->p_sys->i_cv_image_size = 0;
-
+
/* Release temp picture_t if it exists */
if (p_vout->p_sys->p_to_be_freed)
{
static void VlcPictureToIplImage( vout_thread_t *p_vout, picture_t *p_in )
{
int planes = p_in->i_planes; //num input video planes
- // input video size
+ // input video size
CvSize sz = cvSize(abs(p_in->format.i_width), abs(p_in->format.i_height));
video_format_t fmt_out = {0};
clock_t start, finish; //performance measures
double duration;
int i = 0;
vout_sys_t* p_sys = p_vout->p_sys;
-
+
start = clock();
//do scale / color conversion according to p_sys config
if ((p_sys->f_scale != 1) || (p_sys->i_internal_chroma != CINPUT))
{
fmt_out = p_in->format;
-
+
//calc the scaled video size
fmt_out.i_width = p_in->format.i_width * p_sys->f_scale;
- fmt_out.i_height = p_in->format.i_height * p_sys->f_scale;
+ fmt_out.i_height = p_in->format.i_height * p_sys->f_scale;
if (p_sys->i_internal_chroma == RGB)
{
//rgb2 gives 3 separate planes, this gives 1 interleaved plane
- //rv24 gives is about 20% faster but gives r&b the wrong way round
+ //rv24 gives is about 20% faster but gives r&b the wrong way round
//and I cant think of an easy way to fix this
- fmt_out.i_chroma = VLC_FOURCC('R','V','3','2');
+ fmt_out.i_chroma = VLC_FOURCC('R','V','3','2');
}
else if (p_sys->i_internal_chroma == GREY)
{
- //take the I (gray) plane (video seems to commonly be in this fmt so usually the
+ //take the I (gray) plane (video seems to commonly be in this fmt so usually the
//conversion does nothing)
- fmt_out.i_chroma = VLC_FOURCC('I','4','2','0');
+ fmt_out.i_chroma = VLC_FOURCC('I','4','2','0');
}
//convert from the input image
p_sys->p_proc_image = image_Convert( p_sys->p_image, p_in,
&(p_in->format), &fmt_out );
-
+
if (!p_sys->p_proc_image)
{
msg_Err(p_vout, "can't convert (unsupported formats?), aborting...");
return;
- }
+ }
p_sys->p_to_be_freed = p_sys->p_proc_image; //remember this so we can free it later
-
+
}
else //((p_sys->f_scale != 1) || (p_sys->i_internal_chroma != CINPUT))
{
//Convert to the IplImage array that is to be processed.
//If there are multiple planes in p_sys->p_proc_image, then 1 IplImage
//is created for each plane.
- planes = p_sys->p_proc_image->i_planes;
+ planes = p_sys->p_proc_image->i_planes;
p_sys->i_cv_image_size = planes;
for ( i = 0; i < planes; i++ )
{
- sz = cvSize(abs(p_sys->p_proc_image->p[i].i_visible_pitch /
- p_sys->p_proc_image->p[i].i_pixel_pitch),
+ sz = cvSize(abs(p_sys->p_proc_image->p[i].i_visible_pitch /
+ p_sys->p_proc_image->p[i].i_pixel_pitch),
abs(p_sys->p_proc_image->p[i].i_visible_lines));
- p_sys->p_cv_image[i] = cvCreateImageHeader(sz, IPL_DEPTH_8U,
+ p_sys->p_cv_image[i] = cvCreateImageHeader(sz, IPL_DEPTH_8U,
p_sys->p_proc_image->p[i].i_pixel_pitch);
- cvSetData( p_sys->p_cv_image[i],
+ cvSetData( p_sys->p_cv_image[i],
(char*)(p_sys->p_proc_image->p[i].p_pixels), p_sys->p_proc_image->p[i].i_pitch );
}
- //Hack the above opencv image array into a picture_t so that it can be sent to
+ //Hack the above opencv image array into a picture_t so that it can be sent to
//another video filter
p_sys->hacked_pic.p_data_orig = p_sys->p_cv_image;
p_sys->hacked_pic.i_planes = planes;
//copy the processed image into the output image
if ((p_vout->p_sys->p_proc_image) && (p_vout->p_sys->p_proc_image->p_data))
vout_CopyPicture( p_vout, p_outpic, p_vout->p_sys->p_proc_image );
- }
+ }
//calculate duration
finish = clock();