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 RGB24 to YUV444 because it is the only planar
52 // format with comparable bit depth.
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 to planar
83 *vs_img = mlt_pool_alloc( width * height * 2 );
84 uint8_t* yp = *vs_img;
85 uint8_t* up = yp + ( width * height );
86 uint8_t* vp = up + ( width * height / 2 );
87 int total = ( width * height / 2 ) + 1;
104 /** Convert a VS image back to the MLT image it originally came from in mltimage_to_vsimage().
107 void vsimage_to_mltimage( uint8_t* vs_img, uint8_t* mlt_img, mlt_image_format mlt_format, int width, int height )
111 case mlt_image_rgb24:
112 // Convert YUV444 to RGB24.
114 int y, u, v, r, g, b;
115 int total = width * height + 1;
116 uint8_t* yp = vs_img;
117 uint8_t* up = yp + ( width * height );
118 uint8_t* vp = up + ( width * height );
125 YUV2RGB_601_SCALED( y, u, v, r, g, b );
132 case mlt_image_yuv420p:
133 // This format was never converted
135 case mlt_image_yuv422:
136 // Convert planar to packed
138 uint8_t* yp = vs_img;
139 uint8_t* up = yp + ( width * height );
140 uint8_t* vp = up + ( width * height / 2 );
141 int total = ( width * height / 2 ) + 1;
157 /** Free an image allocated by mltimage_to_vsimage().
160 void free_vsimage( uint8_t* vs_img, VSPixelFormat format )
162 if( format != PF_YUV420P )
164 mlt_pool_release( vs_img );
168 /** Compare two VSMotionDetectConfig structures.
169 * Return 1 if they are different. 0 if they are the same.
172 int compare_motion_config( VSMotionDetectConfig* a, VSMotionDetectConfig* b )
174 if( a->shakiness != b->shakiness ||
175 a->accuracy != b->accuracy ||
176 a->stepSize != b->stepSize ||
178 // a->algo != b->algo ||
179 a->virtualTripod != b->virtualTripod ||
180 a->show != b->show ||
181 // Skip: inconsequential?
182 // a->modName != b->modName ||
183 a->contrastThreshold != b->contrastThreshold )
190 /** Compare two VSTransformConfig structures.
191 * Return 1 if they are different. 0 if they are the same.
194 int compare_transform_config( VSTransformConfig* a, VSTransformConfig* b )
196 if( a->relative != b->relative ||
197 a->smoothing != b->smoothing ||
198 a->crop != b->crop ||
199 a->invert != b->invert ||
200 a->zoom != b->zoom ||
201 a->optZoom != b->optZoom ||
202 a->zoomSpeed != b->zoomSpeed ||
203 a->interpolType != b->interpolType ||
204 a->maxShift != b->maxShift ||
205 a->maxAngle != b->maxAngle ||
206 // Skip: inconsequential?
207 // a->modName != b->modName ||
209 // a->verbose != b->verbose ||
210 a->simpleMotionCalculation != b->simpleMotionCalculation ||
212 // a->storeTransforms != b->storeTransforms ||
213 a->smoothZoom != b->smoothZoom ||
214 a->camPathAlgo != b->camPathAlgo )