3 * Copyright (C) 2014 Brian Matherly <pez4brian@yahoo.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 #include <framework/mlt.h>
20 #include <vid.stab/libvidstab.h>
23 mlt_image_format validate_format( mlt_image_format format )
27 case mlt_image_rgb24a:
29 return mlt_image_rgb24;
30 case mlt_image_yuv420p:
31 return mlt_image_yuv420p;
34 case mlt_image_yuv422:
35 case mlt_image_opengl:
37 case mlt_image_glsl_texture:
38 return mlt_image_yuv422;
42 /** Convert an MLT image to one that can be used by VS.
43 * Use free_vsimage() when done with the resulting image.
46 VSPixelFormat mltimage_to_vsimage( mlt_image_format mlt_format, int width, int height, uint8_t* mlt_img, uint8_t** vs_img )
51 // Convert packed RGB24 to planar YUV444
52 // Note: vid.stab 0.98 does not seem to support PF_RGB24
54 *vs_img = mlt_pool_alloc( width * height * 3 );
56 int total = width * height + 1;
57 uint8_t* yp = *vs_img;
58 uint8_t* up = yp + ( width * height );
59 uint8_t* vp = up + ( width * height );
66 RGB2YUV_601_SCALED(r, g, b, y, u, v);
74 case mlt_image_yuv420p:
75 // This format maps with no conversion
80 case mlt_image_yuv422:
81 // Convert packed YUV422 to planar YUV444
82 // Note: vid.stab 0.98 seems to suffer chroma bleeding
83 // when using PF_YUV422P - which is why PF_YUV444P is used.
85 *vs_img = mlt_pool_alloc( width * height * 3 );
86 uint8_t* yp = *vs_img;
87 uint8_t* up = yp + ( width * height );
88 uint8_t* vp = up + ( width * height );
89 int i, j, n = width / 2 + 1;
91 for ( i = 0; i < height; i++ )
108 *vp++ = (mlt_img - 4)[3];
120 /** Convert a VS image back to the MLT image it originally came from in mltimage_to_vsimage().
123 void vsimage_to_mltimage( uint8_t* vs_img, uint8_t* mlt_img, mlt_image_format mlt_format, int width, int height )
127 case mlt_image_rgb24:
128 // Convert packet YUV444 to packed RGB24.
130 int y, u, v, r, g, b;
131 int total = width * height + 1;
132 uint8_t* yp = vs_img;
133 uint8_t* up = yp + ( width * height );
134 uint8_t* vp = up + ( width * height );
141 YUV2RGB_601_SCALED( y, u, v, r, g, b );
148 case mlt_image_yuv420p:
149 // This format was never converted
151 case mlt_image_yuv422:
152 // Convert planar YUV444 to packed YUV422
154 uint8_t* yp = vs_img;
155 uint8_t* up = yp + ( width * height );
156 uint8_t* vp = up + ( width * height );
157 int i, j, n = width / 2 + 1;
159 for ( i = 0; i < height; i++ )
165 *mlt_img++ = ( up[0] + up[1] ) >> 1;
167 *mlt_img++ = ( vp[0] + vp[1] ) >> 1;
188 /** Free an image allocated by mltimage_to_vsimage().
191 void free_vsimage( uint8_t* vs_img, VSPixelFormat format )
193 if( format != PF_YUV420P )
195 mlt_pool_release( vs_img );
199 /** Compare two VSMotionDetectConfig structures.
200 * Return 1 if they are different. 0 if they are the same.
203 int compare_motion_config( VSMotionDetectConfig* a, VSMotionDetectConfig* b )
205 if( a->shakiness != b->shakiness ||
206 a->accuracy != b->accuracy ||
207 a->stepSize != b->stepSize ||
209 // a->algo != b->algo ||
210 a->virtualTripod != b->virtualTripod ||
211 a->show != b->show ||
212 // Skip: inconsequential?
213 // a->modName != b->modName ||
214 a->contrastThreshold != b->contrastThreshold )
221 /** Compare two VSTransformConfig structures.
222 * Return 1 if they are different. 0 if they are the same.
225 int compare_transform_config( VSTransformConfig* a, VSTransformConfig* b )
227 if( a->relative != b->relative ||
228 a->smoothing != b->smoothing ||
229 a->crop != b->crop ||
230 a->invert != b->invert ||
231 a->zoom != b->zoom ||
232 a->optZoom != b->optZoom ||
233 a->zoomSpeed != b->zoomSpeed ||
234 a->interpolType != b->interpolType ||
235 a->maxShift != b->maxShift ||
236 a->maxAngle != b->maxAngle ||
237 // Skip: inconsequential?
238 // a->modName != b->modName ||
240 // a->verbose != b->verbose ||
241 a->simpleMotionCalculation != b->simpleMotionCalculation ||
243 // a->storeTransforms != b->storeTransforms ||
244 a->smoothZoom != b->smoothZoom ||
245 a->camPathAlgo != b->camPathAlgo )
252 static int vs_log_wrapper( int type, const char *tag, const char *format, ... )
256 if ( type > mlt_log_get_level() )
259 va_start( vl, format );
260 fprintf( stderr, "[%s] ", tag );
261 vfprintf( stderr, format, vl );
269 VS_ERROR_TYPE = MLT_LOG_ERROR;
270 VS_WARN_TYPE = MLT_LOG_WARNING;
271 VS_INFO_TYPE = MLT_LOG_INFO;
272 VS_MSG_TYPE = MLT_LOG_VERBOSE;
273 vs_log = vs_log_wrapper;