42 typedef enum PixelFormat swpixfmt;
44 typedef enum AVPixelFormat swpixfmt;
50 volatile boolean in_use;
61 int iclamping, oclamp_hint;
64 #define MAX_SWS_BLOCKS 8192
65 #define MAX_SWS_CTX 65536
67 static volatile int nb = 0;
68 static volatile int swctx_count = 0;
69 static swsctx_block bloxx[MAX_SWS_BLOCKS];
70 static struct SwsContext *swscalep[MAX_SWS_CTX];
71 static pthread_mutex_t ctxcnt_mutex = PTHREAD_MUTEX_INITIALIZER;
73 static swsctx_block *sws_getblock(
int nreq,
int iwidth,
int iheight,
int *irow, swpixfmt ipixfmt,
int width,
int height,
74 int *orow, swpixfmt opixfmt,
int flags,
int subspace,
int iclamping,
int oclamp_hint) {
75 swsctx_block *block, *bestblock;
76 int max =
MAX_THREADS + 1, minbnum = max, mingnum = minbnum, minanum = mingnum, num;
77 int i = -1, lastblock =
THREADVAR(last_sws_block), j = 0, bestidx = -1;
79 if (lastblock >= 0) j = lastblock;
82 pthread_mutex_lock(&ctxcnt_mutex);
84 for (; i < nb; j = ++i) {
86 if (!block->in_use && (num = block->num) >= nreq) {
87 if (iwidth == block->iwidth
88 && iheight == block->iheight
89 && ipixfmt == block->ipixfmt
90 && width == block->width
91 && height == block->height
92 && opixfmt == block->opixfmt
93 && flags == block->flags) {
94 if (subspace == block->subspace
95 && iclamping == block->iclamping
96 && oclamp_hint == block->oclamp_hint
97 && irow[0] == block->irow[0]
98 && irow[1] == block->irow[1]
99 && irow[2] == block->irow[2]
100 && irow[3] == block->irow[3]
101 && orow[0] == block->orow[0]
102 && orow[1] == block->orow[1]
103 && orow[2] == block->orow[2]
104 && orow[3] == block->orow[3]
116 if (minbnum == max) {
123 if (minbnum == max && mingnum == max) {
131 bestblock = &bloxx[bestidx];
132 bestblock->in_use =
TRUE;
133 pthread_mutex_unlock(&ctxcnt_mutex);
136 int startctx = swctx_count, endctx = startctx + nreq;
137 if (endctx >= MAX_SWS_CTX
138 || nb >= MAX_SWS_BLOCKS - 1) {
139 if (bestidx == -1) abort();
140 bestblock = &bloxx[bestidx];
141 bestblock->in_use =
TRUE;
142 pthread_mutex_unlock(&ctxcnt_mutex);
145 bestblock = &bloxx[nb++];
146 bestblock->in_use =
TRUE;
147 swctx_count = endctx;
148 pthread_mutex_unlock(&ctxcnt_mutex);
150 bestblock->num = nreq;
151 bestblock->offset = startctx;
152 for (i = startctx; i < endctx; i++) swscalep[i] = NULL;
155 bestblock->iwidth = iwidth;
156 bestblock->iheight = iheight;
157 bestblock->ipixfmt = ipixfmt;
158 bestblock->width = width;
159 bestblock->height = height;
160 bestblock->opixfmt = opixfmt;
161 bestblock->flags = flags;
163 bestblock->subspace = subspace;
164 bestblock->iclamping = iclamping;
165 bestblock->oclamp_hint = oclamp_hint;
166 for (i = 0; i < 4; i++) {
167 bestblock->irow[i] = irow[i];
168 bestblock->orow[i] = orow[i];
177 block->in_use =
FALSE;
181 static struct SwsContext *swscale = NULL;
184 #endif // USE_SWSCALE
189 static boolean unal_inited =
FALSE;
194 # define get_pixbuf_rowstride_value(rowstride) ((rowstride + 3) & ~3)
196 # define get_pixbuf_rowstride_value(rowstride) (rowstride)
201 #define get_last_pixbuf_rowstride_value(width, nchans) (width * (((nchans << 3) + 7) >> 3))
203 #define get_last_pixbuf_rowstride_value(width, nchans) (width * nchans)
207 static void lives_free_buffer(uint8_t *pixels, livespointer data) {
211 #define CLAMP0255(a) ((unsigned char)((((-a) >> 31) & a) | (255 - a) >> 31) )
212 #define CLAMP0255f(a) (a > 255. ? 255.: a < 0. ? 0. : a)
213 #define CLAMP0255fi(a) ((int)(a > 255. ? 255.: a < 0. ? 0. : a))
229 static int Y_Rc[256];
230 static int Y_Gc[256];
231 static int Y_Bc[256];
232 static int Cb_Rc[256];
233 static int Cb_Gc[256];
234 static int Cb_Bc[256];
235 static int Cr_Rc[256];
236 static int Cr_Gc[256];
237 static int Cr_Bc[256];
240 static int Y_Ru[256];
241 static int Y_Gu[256];
242 static int Y_Bu[256];
243 static int Cb_Ru[256];
244 static int Cb_Gu[256];
245 static int Cb_Bu[256];
246 static int Cr_Ru[256];
247 static int Cr_Gu[256];
248 static int Cr_Bu[256];
251 static int HY_Rc[256];
252 static int HY_Gc[256];
253 static int HY_Bc[256];
254 static int HCb_Rc[256];
255 static int HCb_Gc[256];
256 static int HCb_Bc[256];
257 static int HCr_Rc[256];
258 static int HCr_Gc[256];
259 static int HCr_Bc[256];
262 static int HY_Ru[256];
263 static int HY_Gu[256];
264 static int HY_Bu[256];
265 static int HCb_Ru[256];
266 static int HCb_Gu[256];
267 static int HCb_Bu[256];
268 static int HCr_Ru[256];
269 static int HCr_Gu[256];
270 static int HCr_Bu[256];
272 static boolean conv_RY_inited =
FALSE;
282 static int RGB_Yc[256];
283 static int R_Crc[256];
284 static int G_Cbc[256];
285 static int G_Crc[256];
286 static int B_Cbc[256];
289 static int RGB_Yu[256];
290 static int R_Cru[256];
291 static int G_Cru[256];
292 static int G_Cbu[256];
293 static int B_Cbu[256];
296 static int HRGB_Yc[256];
297 static int HR_Crc[256];
298 static int HG_Crc[256];
299 static int HG_Cbc[256];
300 static int HB_Cbc[256];
303 static int HRGB_Yu[256];
304 static int HR_Cru[256];
305 static int HG_Cru[256];
306 static int HG_Cbu[256];
307 static int HB_Cbu[256];
309 static boolean conv_YR_inited =
FALSE;
311 static short min_Y, max_Y, min_UV, max_UV;
314 static uint8_t *cavg;
315 static uint8_t cavgc[256][256];
316 static uint8_t cavgu[256][256];
317 static uint8_t cavgrgb[256][256];
318 static boolean avg_inited =
FALSE;
321 static int unal[256][256];
322 static int al[256][256];
323 static int unalcy[256][256];
324 static int alcy[256][256];
325 static int unalcuv[256][256];
326 static int alcuv[256][256];
331 static uint8_t *Y_to_Y;
332 static uint8_t *U_to_U;
333 static uint8_t *V_to_V;
336 static uint8_t Yclamped_to_Yunclamped[256];
337 static uint8_t UVclamped_to_UVunclamped[256];
340 static uint8_t Yunclamped_to_Yclamped[256];
341 static uint8_t UVunclamped_to_UVclamped[256];
343 static boolean conv_YY_inited =
FALSE;
364 static uint8_t *gamma_s2l = NULL;
365 static uint8_t *gamma_l2s = NULL;
366 static uint8_t *gamma_b2l = NULL;
367 static uint8_t *gamma_l2b = NULL;
368 static uint8_t *gamma_s2b = NULL;
369 static uint8_t *gamma_b2s = NULL;
371 static inline uint8_t *create_gamma_lut(
double fileg,
int gamma_from,
int gamma_to) {
373 float inv_gamma = 0.;
378 if (gamma_to == WEED_GAMMA_UNKNOWN || gamma_from == WEED_GAMMA_UNKNOWN)
return NULL;
379 if (gamma_from == WEED_GAMMA_LINEAR && gamma_to == WEED_GAMMA_SRGB && gamma_l2s)
return gamma_l2s;
380 if (gamma_from == WEED_GAMMA_LINEAR && gamma_to == WEED_GAMMA_BT709 && gamma_l2b)
return gamma_l2b;
381 if (gamma_from == WEED_GAMMA_SRGB && gamma_to == WEED_GAMMA_LINEAR && gamma_s2l)
return gamma_s2l;
382 if (gamma_from == WEED_GAMMA_SRGB && gamma_to == WEED_GAMMA_BT709 && gamma_s2b)
return gamma_s2b;
383 if (gamma_from == WEED_GAMMA_BT709 && gamma_to == WEED_GAMMA_LINEAR && gamma_b2l)
return gamma_b2l;
384 if (gamma_from == WEED_GAMMA_BT709 && gamma_to == WEED_GAMMA_SRGB && gamma_b2s)
return gamma_b2s;
388 if (!gamma_lut)
return NULL;
396 for (i = 1; i < 256; ++i) {
397 if (gamma_from == gamma_to && fileg == 1.0) {
402 x = a = (float)i / 255.;
412 case WEED_GAMMA_SRGB:
414 switch (gamma_from) {
415 case WEED_GAMMA_BT709:
417 a = (a < gamma_tx[WEED_GAMMA_BT709].
thresh) ? a / gamma_tx[WEED_GAMMA_BT709].lin
418 : powf((a + gamma_tx[WEED_GAMMA_BT709].offs) / (1. + gamma_tx[WEED_GAMMA_BT709].
offs),
419 gamma_tx[WEED_GAMMA_BT709].pf);
420 case WEED_GAMMA_LINEAR:
421 x = (a < (gamma_tx[WEED_GAMMA_SRGB].
thresh) / gamma_tx[WEED_GAMMA_SRGB].lin)
422 ? a * gamma_tx[WEED_GAMMA_SRGB].
lin
423 : powf((1. + gamma_tx[WEED_GAMMA_SRGB].offs) * a,
424 1. / gamma_tx[WEED_GAMMA_SRGB].pf) - gamma_tx[WEED_GAMMA_SRGB].
offs;
427 x = powf(a, inv_gamma);
437 case WEED_GAMMA_LINEAR:
438 switch (gamma_from) {
442 case WEED_GAMMA_SRGB:
443 x = (a < gamma_tx[WEED_GAMMA_SRGB].
thresh) ? a / gamma_tx[WEED_GAMMA_SRGB].lin
444 : powf((a + gamma_tx[WEED_GAMMA_SRGB].offs) / (1. + gamma_tx[WEED_GAMMA_SRGB].
offs),
445 gamma_tx[WEED_GAMMA_SRGB].pf);
447 case WEED_GAMMA_BT709:
448 x = (a < gamma_tx[WEED_GAMMA_BT709].
thresh) ? a / gamma_tx[WEED_GAMMA_BT709].lin
449 : powf((a + gamma_tx[WEED_GAMMA_BT709].offs) / (1. + gamma_tx[WEED_GAMMA_BT709].
offs),
450 gamma_tx[WEED_GAMMA_BT709].pf);
456 case WEED_GAMMA_BT709:
457 switch (gamma_from) {
461 case WEED_GAMMA_SRGB:
463 a = (a < gamma_tx[WEED_GAMMA_SRGB].
thresh) ? a / gamma_tx[WEED_GAMMA_SRGB].lin
464 : powf((a + gamma_tx[WEED_GAMMA_SRGB].offs) / (1. + gamma_tx[WEED_GAMMA_SRGB].
offs),
465 gamma_tx[WEED_GAMMA_SRGB].pf);
466 case WEED_GAMMA_LINEAR:
467 x = (a < (gamma_tx[WEED_GAMMA_BT709].
thresh) / gamma_tx[WEED_GAMMA_BT709].lin)
468 ? a * gamma_tx[WEED_GAMMA_BT709].
lin
469 : powf((1. + gamma_tx[WEED_GAMMA_BT709].offs) * a,
470 1. / gamma_tx[WEED_GAMMA_BT709].pf) - gamma_tx[WEED_GAMMA_BT709].
offs;
480 gamma_lut[i] =
CLAMP0255((int32_t)(255. * x + .5));
482 if (gamma_from == WEED_GAMMA_LINEAR && gamma_to == WEED_GAMMA_SRGB && gamma_l2s)
483 gamma_l2s = gamma_lut;
484 if (gamma_from == WEED_GAMMA_LINEAR && gamma_to == WEED_GAMMA_BT709 && gamma_l2b)
485 gamma_l2b = gamma_lut;
486 if (gamma_from == WEED_GAMMA_SRGB && gamma_to == WEED_GAMMA_LINEAR && gamma_s2l)
487 gamma_s2l = gamma_lut;
488 if (gamma_from == WEED_GAMMA_SRGB && gamma_to == WEED_GAMMA_BT709 && gamma_s2b)
489 gamma_s2b = gamma_lut;
490 if (gamma_from == WEED_GAMMA_BT709 && gamma_to == WEED_GAMMA_LINEAR && gamma_b2l)
491 gamma_b2l = gamma_lut;
492 if (gamma_from == WEED_GAMMA_BT709 && gamma_to == WEED_GAMMA_SRGB && gamma_b2s)
493 gamma_b2s = gamma_lut;
497 static inline void lives_gamma_lut_free(uint8_t *lut) {
498 if (lut && lut != gamma_l2s && lut != gamma_l2b && lut != gamma_s2l && lut != gamma_s2b
499 && lut != gamma_b2s && lut != gamma_b2l)
lives_free(lut);
503 static inline int32_t _spc_rnd(int32_t val,
short quality) {
534 uint32_t
sig = val & 0x80000000;
535 return (((val - (val >> 8)) >> 16) |
sig);
541 #define spc_rnd(val) (_spc_rnd((val), prefs ? prefs->pb_quality : PB_QUALITY_HIGH))
552 if (a > 255) a = 255;
553 return a < 0 ? 0. : (double)a / 255.;
559 return get_luma8(r >> 8, g >> 8, b >> 8);
563 static void init_RGB_to_YUV_tables(
void) {
590 for (i = 0; i < 256; i++) {
608 for (i = 0; i < 256; i++) {
633 for (i = 0; i < 256; i++) {
651 for (i = 0; i < 256; i++) {
669 conv_RY_inited =
TRUE;
672 static void init_YUV_to_RGB_tables(
void) {
687 for (i = 0; i <=
YUV_CLAMP_MINI; i++) R_Crc[i] = G_Crc[i] = G_Cbc[i] = B_Cbc[i] = 0;
703 for (; i < 256; i++) {
715 for (i = 0; i <= 255; i++) {
719 for (i = 0; i <= 255; i++) {
739 for (i = 0; i <=
YUV_CLAMP_MINI; i++) HR_Crc[i] = HG_Crc[i] = HG_Cbc[i] = HB_Cbc[i] = 0;
752 for (; i < 256; i++) {
760 for (i = 0; i <= 255; i++) HRGB_Yu[i] = i *
SCALE_FACTOR;
762 for (i = 0; i <= 255; i++) {
768 conv_YR_inited =
TRUE;
772 static void init_YUV_to_YUV_tables(
void) {
777 Yclamped_to_Yunclamped[i] = 0;
782 for (; i < 256; i++) {
783 Yclamped_to_Yunclamped[i] = 255;
787 UVclamped_to_UVunclamped[i] = 0;
792 for (; i < 256; i++) {
793 UVclamped_to_UVunclamped[i] = 255;
796 for (i = 0; i < 256; i++) {
801 conv_YY_inited =
TRUE;
805 static void init_average(
void) {
806 for (
int x = 0; x < 256; x++) {
807 float fa = (float)(x - 128.) * 255. / 244.;
808 short sa = (short)(x - 128);
809 for (
int y = 0; y < 256; y++) {
810 float fb = (float)(y - 128.) * 255. / 244.;
811 short sb = (short)(y - 128);
814 float fc = (fa + fb - ((fa * fb) >> 8)) * 224. / 512. + 128.;
815 short c = (sa + sb - ((sa * sb) >> 8)) + 128;
818 float fc = (fa + fb) * 224. / 512. + 128.;
819 short c = ((sa + sb) >> 1) + 128;
821 cavgc[x][y] = (uint8_t)(fc > 240. ? 240 : fc < 16. ? 16 : fc);
822 cavgrgb[x][y] = cavgu[x][y] = (uint8_t)(c > 255 ? 255 : c < 0 ? 0 : c);
829 static void init_unal(
void) {
831 for (
int i = 0; i < 256; i++) {
832 for (
int j = 0; j < 256; j++) {
833 unal[i][j] = (float)j * 255. / (
float)i;
834 al[i][j] = (float)j * (
float)i / 255.;
847 static void set_conversion_arrays(
int clamping,
int subspace) {
852 case WEED_YUV_SUBSPACE_YUV:
853 case WEED_YUV_SUBSPACE_YCBCR:
854 if (clamping == WEED_YUV_CLAMPING_CLAMPED) {
895 case WEED_YUV_SUBSPACE_BT709:
896 if (clamping == WEED_YUV_CLAMPING_CLAMPED) {
938 if (!avg_inited) init_average();
940 if (clamping == WEED_YUV_CLAMPING_CLAMPED) {
944 cavg = (uint8_t *)cavgc;
947 max_Y = max_UV = 255;
948 cavg = (uint8_t *)cavgu;
953 static void get_YUV_to_YUV_conversion_arrays(
int iclamping,
int isubspace,
int oclamping,
int osubspace) {
957 if (!conv_YY_inited) init_YUV_to_YUV_tables();
960 case WEED_YUV_SUBSPACE_YUV:
961 LIVES_WARN(
"YUV subspace input not specified, assuming Y'CbCr");
962 case WEED_YUV_SUBSPACE_YCBCR:
964 case WEED_YUV_SUBSPACE_YUV:
965 LIVES_WARN(
"YUV subspace output not specified, assuming Y'CbCr");
966 case WEED_YUV_SUBSPACE_YCBCR:
967 if (iclamping == WEED_YUV_CLAMPING_CLAMPED) {
969 Y_to_Y = Yclamped_to_Yunclamped;
970 U_to_U = V_to_V = UVclamped_to_UVunclamped;
973 Y_to_Y = Yunclamped_to_Yclamped;
974 U_to_U = V_to_V = UVunclamped_to_UVclamped;
979 errmsg =
lives_strdup_printf(
"Invalid YUV subspace conversion %d to %d", isubspace, osubspace);
983 case WEED_YUV_SUBSPACE_BT709:
985 case WEED_YUV_SUBSPACE_YUV:
986 LIVES_WARN(
"YUV subspace output not specified, assuming BT709");
987 case WEED_YUV_SUBSPACE_BT709:
988 if (iclamping == WEED_YUV_CLAMPING_CLAMPED) {
990 Y_to_Y = Yclamped_to_Yunclamped;
991 U_to_U = V_to_V = UVclamped_to_UVunclamped;
994 Y_to_Y = Yunclamped_to_Yclamped;
995 U_to_U = V_to_V = UVunclamped_to_UVclamped;
1000 errmsg =
lives_strdup_printf(
"Invalid YUV subspace conversion %d to %d", isubspace, osubspace);
1005 errmsg =
lives_strdup_printf(
"Invalid YUV subspace conversion %d to %d", isubspace, osubspace);
1013 void rgb2xyz(uint8_t r, uint8_t g, uint8_t b,
double *x,
double *y,
double *z) {
1014 double rr = (double)r / 2.55, gg = (
double)g / 2.55, bb = (double)b / 2.55;
1015 *x = rr * 0.4124 + gg * 0.3576 + bb * 0.1805;
1016 *y = rr * 0.2126 + gg * 0.7152 + bb * 0.0722;
1017 *z = rr * 0.0193 + gg * 0.1192 + bb * 0.9505;
1022 #define LAB0 0.008856
1023 #define LAB1 0.33333333333
1025 #define LAB3 0.13793103448 // 16. / 116.
1028 void xyz2lab(
double x,
double y,
double z,
double *l,
double *a,
double *b) {
1030 if (l) {*l = 116. * y - 16.;}
if (a) {*a = 500. * (x - y);}
if (b) {*b = 200. * (y - z);}
1033 #define KL 1.0 // 2.0 for textiles
1034 #define KC 1.0 // default
1035 #define KH 1.0 // default
1036 #define K1 0.045 // graphics arts, 0.048 textiles
1037 #define K2 0.015 // graphics arts, 0.014 textiles
1038 #define RNDFAC 0.0000000001
1039 static double cdist94lab(
double l0,
double a0,
double b0,
double l1,
double a1,
double b1) {
1041 double dl = l0 - l1;
1042 double c0 = sqrt(a0 * a0 + b0 * b0), c1 = sqrt(a1 * a1 + b1 * b1);
1043 double dc = c0 - c1, da = a0 - a1, db = b0 - b1;
1044 double dh = sqrt(da * da + db * db - dc * dc +
RNDFAC);
1046 dc /= (1. +
K1 * c0);
1048 dh /= (1. +
K2 * c1);
1050 return sqrt(dl * dl + dc * dc + dh * dh);
1054 static uint8_t get_maxmin_diff(uint8_t a, uint8_t b, uint8_t c, uint8_t *max, uint8_t *min) {
1058 if (b > c) lmin = c;
1061 if (c > a) lmax = c;
1064 if (b < c) lmax = c;
1067 if (c < a) lmin = c;
1070 if (max) *max = lmax;
1071 if (min) *min = lmin;
1075 double cdist94(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1) {
1077 double x0 = 0., y0 = 0., z0 = 0.;
1078 double x1 = 0., y1 = 0., z1 = 0.;
1079 double L0 = 0., A0 = 0., B0 = 0.;
1080 double L1 = 0., A1 = 0., B1 = 0.;
1081 rgb2xyz(r0, g0, b0, &x0, &y0, &z0);
1082 rgb2xyz(r1, g1, b1, &x1, &y1, &z1);
1083 xyz2lab(x0, y0, z0, &L0, &A0, &B0);
1084 xyz2lab(x1, y1, z1, &L1, &A1, &B1);
1085 dist = cdist94lab(L0, A0, B0, L1, A1, B1);
1090 void rgb2hsv(uint8_t r, uint8_t g, uint8_t b,
double *h,
double *s,
double *v) {
1092 uint8_t cmax = 0, cmin = 0;
1093 uint8_t diff = get_maxmin_diff(r, g, b, &cmax, &cmin);
1094 double ddiff = (double)diff, dcmax = (
double)cmax;
1095 if (h) {*h = 0.;}
if (s) {*s = 0.;}
if (v) {*v = 0.;}
1096 if (h && cmax != cmin) {
1097 if (cmax == r) *h = ((double)g - (
double)b) / ddiff;
1098 else if (cmax == g) *h = 2. + ((double)b - (
double)r) / ddiff;
1099 else *h = 4. + ((double)r - (
double)g) / ddiff;
1100 *h = 60. * (*h < 0. ? (*h + 6.) : *h >= 6. ? (*h - 6.) : *h);
1102 if (s && cmax) *s = (ddiff / dcmax) * 100.;
1103 if (v) *v = dcmax / 2.55;
1107 if ((a =
spc_rnd(Y_Ru[r] + Y_Gu[g] + Y_Bu[b])) > 255) a = 255;
1108 if (v) *v = (double)(a < 0 ? 0 : a) / 255.;
1113 void hsv2rgb(
double h,
double s,
double v, uint8_t *r, uint8_t *g, uint8_t *b) {
1115 *r = *g = *b = (v * 255. + .5);
1119 double f = h - (double)i;
1120 double p = v * (1. - s);
1123 double q = v * (1. - (s * f));
1125 case 1: dr = q; dg = v; db = p;
break;
1126 case 3: dr = p; dg = q; db = v;
break;
1127 default: dr = v; dg = p; db = q;
break;
1130 double t = v * (1. - (s * (1. - f)));
1132 case 0: dr = v; dg = t; db = p;
break;
1133 case 2: dr = p; dg = v; db = t;
break;
1134 default: dr = t; dg = p; db = v;
break;
1137 *r = (uint8_t)(dr * 255. + .5); *g = (uint8_t)(dg * 255. + .5); *b = (uint8_t)(db * 255. + .5);
1142 boolean pick_nice_colour(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t *r1, uint8_t *g1, uint8_t *b1,
1143 double max,
double lmin,
double lmax) {
1151 #define DIST_THRESH 10.
1152 #define RAT_START .9
1153 #define RAT_TIO .9999999
1156 volatile double gmm = 1. + lmax * 2., gmn = 1. + lmin;
1157 volatile uint8_t xr, xb, xg, ar, ag, ab;
1158 volatile uint8_t rmin = MIN(r0, *r1) / 1.5, gmin = MIN(g0, *g1) / gmm, bmin = MIN(b0, *b1) / 1.5;
1159 volatile uint8_t rmax = MAX(r0, *r1), gmax = MAX(g0, *g1), bmax = MAX(b0, *b1);
1160 volatile double da, db, z, rat =
RAT_START, d =
cdist94(r0, g0, b0, *r1, *g1, *b1);
1164 ar = (
volatile double)(r0 + *r1) / 2.;
1165 ag = (
volatile double)(g0 + *g1) / 2.;
1166 ab = (
volatile double)(b0 + *b1) / 2.;
1168 rmax = (rmax < 128 ? rmax << 1 : 255) - rmin;
1169 gmax = (gmax < 255 / gmn ? gmax *gmn : 255) - gmin;
1170 bmax = (bmax < 128 ? bmax << 1 : 255) - bmin;
1179 da =
cdist94(ar, ag, ab, xr, xg, xb);
1180 if (max * rat > da)
continue;
1181 da =
cdist94(r0, g0, b0, xr, xg, xb);
1182 db =
cdist94(*r1, *g1, *b1, xr, xg, xb);
1183 if (da * rat * lmax > db || db * rat > da * lmax)
continue;
1186 if (l < lmin || l > lmax)
continue;
1187 *r1 = xr; *g1 = xg; *b1 = xb;
1197 #ifdef WEED_ADVANCED_PALETTES
1199 static weed_macropixel_t advp[256];
1202 lives_memset(advp, 0, 256 *
sizeof(weed_macropixel_t));
1204 advp[0] = (weed_macropixel_t) {
1206 {WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue}
1209 advp[1] = (weed_macropixel_t) {
1211 {WEED_VCHAN_blue, WEED_VCHAN_green, WEED_VCHAN_red}
1214 advp[2] = (weed_macropixel_t) {
1215 WEED_PALETTE_RGBA32,
1216 {WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue, WEED_VCHAN_alpha}
1219 advp[3] = (weed_macropixel_t) {
1220 WEED_PALETTE_BGRA32,
1221 {WEED_VCHAN_blue, WEED_VCHAN_green, WEED_VCHAN_red, WEED_VCHAN_alpha}
1224 advp[4] = (weed_macropixel_t) {
1225 WEED_PALETTE_ARGB32,
1226 {WEED_VCHAN_alpha, WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue}
1229 advp[5] = (weed_macropixel_t) {
1230 WEED_PALETTE_RGBFLOAT,
1231 {WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue},
1232 WEED_VCHAN_DESC_FP, {0}, {0}, 1, {32, 32, 32}
1235 advp[6] = (weed_macropixel_t) {
1236 WEED_PALETTE_RGBAFLOAT,
1237 {WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue, WEED_VCHAN_alpha},
1238 WEED_VCHAN_DESC_FP, {0}, {0}, 1, {32, 32, 32, 32}
1242 advp[7] = (weed_macropixel_t) {
1243 WEED_PALETTE_YUV420P,
1244 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V},
1245 WEED_VCHAN_DESC_PLANAR, {1, 2, 2}, {1, 2, 2}
1248 advp[8] = (weed_macropixel_t) {
1249 WEED_PALETTE_YVU420P,
1250 {WEED_VCHAN_Y, WEED_VCHAN_V, WEED_VCHAN_U},
1251 WEED_VCHAN_DESC_PLANAR, {1, 2, 2}, {1, 2, 2}
1254 advp[9] = (weed_macropixel_t) {
1255 WEED_PALETTE_YUV422P,
1256 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V},
1257 WEED_VCHAN_DESC_PLANAR, {1, 2, 2}, {1, 1, 1}
1260 advp[10] = (weed_macropixel_t) {
1261 WEED_PALETTE_YUV444P,
1262 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V}, WEED_VCHAN_DESC_PLANAR
1265 advp[11] = (weed_macropixel_t) {
1266 WEED_PALETTE_YUVA4444P,
1267 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V, WEED_VCHAN_alpha},
1268 WEED_VCHAN_DESC_PLANAR
1272 advp[12] = (weed_macropixel_t) {
1274 {WEED_VCHAN_U, WEED_VCHAN_Y, WEED_VCHAN_V, WEED_VCHAN_Y},
1278 advp[13] = (weed_macropixel_t) {
1280 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_Y, WEED_VCHAN_V},
1284 advp[14] = (weed_macropixel_t) {WEED_PALETTE_YUV888, {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V}};
1286 advp[15] = (weed_macropixel_t) {
1287 WEED_PALETTE_YUVA8888,
1288 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V, WEED_VCHAN_alpha}
1291 advp[16] = (weed_macropixel_t) {
1292 WEED_PALETTE_YUV411, {
1293 WEED_VCHAN_U, WEED_VCHAN_Y, WEED_VCHAN_Y,
1294 WEED_VCHAN_V, WEED_VCHAN_Y, WEED_VCHAN_Y
1300 advp[17] = (weed_macropixel_t) {WEED_PALETTE_A8, {WEED_VCHAN_alpha}};
1302 advp[18] = (weed_macropixel_t) {WEED_PALETTE_A1, {WEED_VCHAN_alpha}, 0, {0}, {0}, 1, {1}};
1304 advp[19] = (weed_macropixel_t) {
1305 WEED_PALETTE_AFLOAT, {WEED_VCHAN_alpha},
1306 WEED_VCHAN_DESC_FP, {0}, {0}, 1, {32}
1309 advp[20] = (weed_macropixel_t) {WEED_PALETTE_END};
1312 advp[21] = (weed_macropixel_t) {
1313 LIVES_PALETTE_ABGR32,
1314 {WEED_VCHAN_alpha, WEED_VCHAN_blue, WEED_VCHAN_green, WEED_VCHAN_red}
1317 advp[22] = (weed_macropixel_t) {
1318 LIVES_PALETTE_YVU422P,
1319 {WEED_VCHAN_Y, WEED_VCHAN_V, WEED_VCHAN_U},
1320 WEED_VCHAN_DESC_PLANAR, {1, 2, 2}, {1, 1, 1}
1323 advp[23] = (weed_macropixel_t) {
1324 LIVES_PALETTE_YUVA420P,
1325 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V, WEED_VCHAN_alpha},
1326 WEED_VCHAN_DESC_PLANAR, {1, 2, 2, 1}, {1, 2, 2, 1}
1329 advp[24] = (weed_macropixel_t) {
1330 LIVES_PALETTE_AYUV8888,
1331 {WEED_VCHAN_alpha, WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V}
1334 advp[25] = (weed_macropixel_t) {
1335 LIVES_PALETTE_YUVFLOAT,
1336 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V},
1337 WEED_VCHAN_DESC_FP, {0}, {0}, 1, {32, 32, 32}
1340 advp[26] = (weed_macropixel_t) {
1341 LIVES_PALETTE_YUVAFLOAT,
1342 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V, WEED_VCHAN_alpha},
1343 WEED_VCHAN_DESC_FP, {0}, {0}, 1, {32, 32, 32, 32}
1346 advp[27] = (weed_macropixel_t) {
1347 LIVES_PALETTE_RGB48,
1348 {WEED_VCHAN_red, WEED_VCHAN_green, WEED_VCHAN_blue},
1349 0, {0}, {0}, 1, {16, 16, 16}
1352 advp[28] = (weed_macropixel_t) {
1353 LIVES_PALETTE_RGBA64, {
1354 WEED_VCHAN_red, WEED_VCHAN_green,
1355 WEED_VCHAN_blue, WEED_VCHAN_alpha
1357 0, {0}, {0}, 1, {16, 16, 16, 16}
1360 advp[29] = (weed_macropixel_t) {
1361 LIVES_PALETTE_YUV121010,
1362 {WEED_VCHAN_Y, WEED_VCHAN_U, WEED_VCHAN_V},
1363 0, {0}, {0}, 1, {12, 10, 10}
1369 for (
register int i = 0; advp[i].ext_ref != WEED_PALETTE_END; i++)
1370 if (advp[i].ext_ref == weed_palette)
return &advp[i];
1379 if (mpx)
return mpx->ext_ref;
1380 return WEED_PALETTE_NONE;
1384 return (ctype == WEED_VCHAN_red || ctype == WEED_VCHAN_green || ctype == WEED_VCHAN_blue);
1388 return (ctype == WEED_VCHAN_Y || ctype == WEED_VCHAN_U || ctype == WEED_VCHAN_V);
1397 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++)
1398 psize += mpx->bitsize[i] == 0 ? 1 : mpx->bitsize[i] / 8;
1407 npix = mpx->npixels;
1408 return !npix ? 1 : npix;
1421 if (!(mpx->flags & WEED_VCHAN_DESC_PLANAR))
return 1;
1422 for (i = 0; i < MAXPPLANES && mpx->chantype[i]; i++);
1429 if (mpx && mpx->chantype[0] == WEED_VCHAN_alpha && !mpx->chantype[1])
return TRUE;
1436 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++) {
1437 if (mpx->chantype[i] == WEED_VCHAN_red)
return TRUE;
1438 if (mpx->chantype[i] == WEED_VCHAN_blue)
return FALSE;
1451 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++)
1460 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++)
1469 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++)
1470 if (mpx->chantype[i] == WEED_VCHAN_alpha)
return TRUE;
1477 return (mpx && (mpx->flags & WEED_VCHAN_DESC_FP));
1483 if (mpx) subsam = mpx->hsub[plane];
1484 if (subsam)
return 1. / (double)(subsam);
1491 if (mpx) subsam = mpx->vsub[plane];
1492 if (subsam)
return 1. / (double)(subsam);
1499 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++)
1500 if (mpx->chantype[i] == WEED_VCHAN_alpha)
return i;
1551 int nseqy = 0, nseqyu = 0, nseqyv = 0, nu = 0, nv = 0;
1553 if (!mpx)
return FALSE;
1554 for (
register int i = 0; i < MAXPPLANES && mpx->chantype[i]; i++) {
1555 uint16_t ctype = mpx->chantype[i];
1556 if (i > 3 && alpha)
return FALSE;
1559 if (red || blue)
return FALSE;
1560 if (++nseqy > 2)
return FALSE;
1563 if (red || blue)
return FALSE;
1564 if (nseqyv && nseqy && nseqy != nseqyv)
return FALSE;
1570 if (red || blue)
return FALSE;
1571 if (nseqyu && nseqy && nseqy != nseqyu)
return FALSE;
1580 case WEED_VCHAN_alpha: alpha =
TRUE;
break;
1581 case WEED_VCHAN_red: red =
TRUE;
break;
1582 case WEED_VCHAN_blue: blue =
TRUE;
break;
1583 default:
return FALSE;
1587 if (nu || nv || nseqy)
return FALSE;
1589 case WEED_VCHAN_alpha:
return FALSE;
1590 case WEED_VCHAN_green:
1591 if (!red && !blue)
return FALSE;
1593 case WEED_VCHAN_red:
1594 if (!alpha)
return FALSE;
1597 case WEED_VCHAN_blue:
1598 if (!alpha)
return FALSE;
1601 default:
return FALSE;
1605 if (nu || nv || nseqy)
return FALSE;
1607 case WEED_VCHAN_alpha:
return FALSE;
1608 case WEED_VCHAN_green:
1609 if (!red && !blue)
return FALSE;
1611 case WEED_VCHAN_red:
1612 if (!blue)
return FALSE;
1615 case WEED_VCHAN_blue:
1616 if (!red)
return FALSE;
1619 default:
return FALSE;
1624 case WEED_VCHAN_alpha:
1625 if (alpha)
return FALSE;
1628 case WEED_VCHAN_red:
1629 if (!blue)
return FALSE;
1632 case WEED_VCHAN_blue:
1633 if (!red)
return FALSE;
1636 default:
return FALSE;
1640 if (ctype != WEED_VCHAN_alpha)
return FALSE;
1647 if (red != blue || nv != nu || (nseqy != nseqyu && nseqy != nseqyv))
return FALSE;
1653 static void init_gamma_tx(
void) {
1654 gamma_tx[WEED_GAMMA_SRGB] = (
gamma_const_t) {0.055, 12.92, 0.04045, 2.4};
1655 gamma_tx[WEED_GAMMA_BT709] = (
gamma_const_t) {0.099, 4.5, 0.081, 1. / .45};
1658 static void rgb2yuv(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t *y, uint8_t *u, uint8_t *v)
GNU_HOT;
1659 static void yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b)
GNU_HOT;
1662 init_RGB_to_YUV_tables();
1663 init_YUV_to_RGB_tables();
1664 init_YUV_to_YUV_tables();
1669 #ifdef WEED_ADVANCED_PALETTES
1676 uint8_t r = 100, g, b, y, u, v, xr, xg, xb;;
1677 set_conversion_arrays(WEED_YUV_CLAMPING_UNCLAMPED, WEED_YUV_SUBSPACE_YCBCR);
1679 for (cr = 100; cr < 256; cr++) {
1681 for (cg = 0; cg < 256; cg++) {
1683 for (cb = 0; cb < 256; cb++) {
1684 g_print(
"in: %d %d %d\n", r, g, b);
1685 rgb2yuv(r, g, b, &y, &u, &v);
1686 yuv2rgb(y, u, v, &xr, &xg, &xb);
1687 g_print(
"out: %d %d %d %d %d %d\n", y, u, v, xr, xg, xb);
1699 static void *convert_rgb_to_uyvy_frame_thread(
void *cc_params);
1700 static void *convert_bgr_to_uyvy_frame_thread(
void *cc_params);
1701 static void *convert_rgb_to_yuyv_frame_thread(
void *cc_params);
1702 static void *convert_bgr_to_yuyv_frame_thread(
void *cc_params);
1703 static void *convert_argb_to_uyvy_frame_thread(
void *cc_params);
1704 static void *convert_argb_to_yuyv_frame_thread(
void *cc_params);
1706 static void *convert_rgb_to_yuv_frame_thread(
void *cc_params);
1707 static void *convert_bgr_to_yuv_frame_thread(
void *cc_params);
1708 static void *convert_argb_to_yuv_frame_thread(
void *cc_params);
1709 static void *convert_rgb_to_yuvp_frame_thread(
void *cc_params);
1710 static void *convert_bgr_to_yuvp_frame_thread(
void *cc_params);
1711 static void *convert_argb_to_yuvp_frame_thread(
void *cc_params);
1713 static void *convert_uyvy_to_rgb_frame_thread(
void *cc_params);
1714 static void *convert_uyvy_to_bgr_frame_thread(
void *cc_params);
1715 static void *convert_uyvy_to_argb_frame_thread(
void *cc_params);
1716 static void *convert_yuyv_to_rgb_frame_thread(
void *cc_params);
1717 static void *convert_yuyv_to_bgr_frame_thread(
void *cc_params);
1718 static void *convert_yuyv_to_argb_frame_thread(
void *cc_params);
1720 static void *convert_yuv_planar_to_rgb_frame_thread(
void *cc_params);
1721 static void *convert_yuv_planar_to_bgr_frame_thread(
void *cc_params);
1722 static void *convert_yuv_planar_to_argb_frame_thread(
void *cc_params);
1724 static void *convert_yuv420p_to_rgb_frame_thread(
void *cc_params);
1725 static void *convert_yuv420p_to_bgr_frame_thread(
void *cc_params);
1726 static void *convert_yuv420p_to_argb_frame_thread(
void *cc_params);
1728 static void *convert_yuv888_to_rgb_frame_thread(
void *cc_params);
1729 static void *convert_yuv888_to_bgr_frame_thread(
void *cc_params);
1730 static void *convert_yuv888_to_argb_frame_thread(
void *cc_params);
1731 static void *convert_yuva8888_to_rgba_frame_thread(
void *cc_params);
1732 static void *convert_yuva8888_to_bgra_frame_thread(
void *cc_params);
1733 static void *convert_yuva8888_to_argb_frame_thread(
void *cc_params);
1735 static void *convert_swap3_frame_thread(
void *cc_params);
1736 static void *convert_swap4_frame_thread(
void *cc_params);
1737 static void *convert_swap3addpost_frame_thread(
void *cc_params);
1738 static void *convert_swap3addpre_frame_thread(
void *cc_params);
1739 static void *convert_swap3delpost_frame_thread(
void *cc_params);
1740 static void *convert_swap3delpre_frame_thread(
void *cc_params);
1741 static void *convert_addpre_frame_thread(
void *cc_params);
1742 static void *convert_addpost_frame_thread(
void *cc_params);
1743 static void *convert_delpre_frame_thread(
void *cc_params);
1744 static void *convert_delpost_frame_thread(
void *cc_params);
1745 static void *convert_swap3postalpha_frame_thread(
void *cc_params);
1746 #ifdef WEED_ADVANCED_PALETTES
1747 static void *convert_swap3prealpha_frame_thread(
void *cc_params);
1749 static void *convert_swapprepost_frame_thread(
void *cc_params);
1751 static void *convert_swab_frame_thread(
void *cc_params);
1754 static void rgb2yuv_with_gamma(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t *y, uint8_t *u, uint8_t *v, uint8_t *lut)
GNU_HOT;
1756 static void rgb2uyvy(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1758 static void rgb2uyvy_with_gamma(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1760 static void rgb16_2uyvy(uint16_t r0, uint16_t g0, uint16_t b0, uint16_t r1, uint16_t g1, uint16_t b1,
1763 static void rgb16_2uyvy_with_gamma(uint16_t r0, uint16_t g0, uint16_t b0, uint16_t r1, uint16_t g1, uint16_t b1,
1767 static void rgb2yuyv(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1770 static void rgb2yuyv_with_gamma(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1773 static void rgb2_411(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1776 static void yuv2rgb_with_gamma(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *lut)
GNU_HOT;
1777 static void uyvy2rgb(
uyvy_macropixel *uyvy, uint8_t *r0, uint8_t *g0, uint8_t *b0,
1779 static void yuyv2rgb(
yuyv_macropixel *yuyv, uint8_t *r0, uint8_t *g0, uint8_t *b0,
1781 static void yuv888_2_rgb(uint8_t *yuv, uint8_t *rgb,
boolean add_alpha)
GNU_FLATTEN GNU_HOT;
1782 static void yuva8888_2_rgba(uint8_t *yuva, uint8_t *rgba,
boolean del_alpha)
GNU_FLATTEN GNU_HOT;
1783 static void yuv888_2_bgr(uint8_t *yuv, uint8_t *bgr,
boolean add_alpha)
GNU_FLATTEN GNU_HOT;
1784 static void yuva8888_2_bgra(uint8_t *yuva, uint8_t *bgra,
boolean del_alpha)
GNU_FLATTEN GNU_HOT;
1787 static void uyvy_2_yuv422(
uyvy_macropixel *uyvy, uint8_t *y0, uint8_t *u0, uint8_t *v0, uint8_t *y1)
GNU_HOT;
1788 static void yuyv_2_yuv422(
yuyv_macropixel *yuyv, uint8_t *y0, uint8_t *u0, uint8_t *v0, uint8_t *y1)
GNU_HOT;
1790 #define avg_chroma(x, y) ((uint8_t)(*(cavg + ((int)(x) << 8) + (int)(y))))
1791 #define avg_chroma_3_1(x, y) ((uint8_t)(avg_chroma(x, avg_chroma(x, y))))
1792 #define avg_chroma_1_3(x, y) ((uint8_t)(avg_chroma(avg_chroma(x, y), y)))
1794 static uint8_t (*avg_chromaf)(uint8_t x, uint8_t y);
1800 static uint8_t avg_chromaf_fast(uint8_t x, uint8_t y) {
1805 avg_chromaf = avg_chromaf_fast;
1817 #define avg_chroma_3_1f(x, y) ((uint8_t)(avg_chromaf(x, avg_chromaf(x, y))))
1818 #define avg_chroma_1_3f(x, y) ((uint8_t)(avg_chromaf(avg_chromaf(x, y), y)))
1820 LIVES_INLINE void rgb2yuv(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t *y, uint8_t *u, uint8_t *v) {
1822 if ((a =
spc_rnd(Y_R[r0] + Y_G[g0] + Y_B[b0])) > max_Y) * y = max_Y;
1823 else *y = a < min_Y ? min_Y : a;
1824 if ((a =
spc_rnd(Cb_R[r0] + Cb_G[g0] + Cb_B[b0])) > max_UV) * u = max_UV;
1825 else *u = a < min_UV ? min_UV : a;
1826 if ((a =
spc_rnd(Cr_R[r0] + Cr_G[g0] + Cr_B[b0])) > max_UV) * v = max_UV;
1827 else *v = a < min_UV ? min_UV : a;
1830 #define bgr2yuv(b0, g0, r0, y, u, v) rgb2yuv(r0, g0, b0, y, u, v)
1835 if ((a =
spc_rnd(Y_R[(r0 = lut[r0])] + Y_G[(g0 = lut[g0])] + Y_B[(b0 = lut[b0])])) > max_Y) * y = max_Y;
1836 else *y = a < min_Y ? min_Y : a;
1837 if ((a =
spc_rnd(Cb_R[r0] + Cb_G[g0] + Cb_B[b0])) > max_UV) * u = max_UV;
1838 else *u = a < min_UV ? min_UV : a;
1839 if ((a =
spc_rnd(Cr_R[r0] + Cr_G[g0] + Cr_B[b0])) > max_UV) * v = max_UV;
1840 else *v = a < min_UV ? min_UV : a;
1844 #define bgr2yuv_with_gamma(b0, g0, r0, y, u, v) rgb2yuv(r0, g0, b0, y, u, v, lut)
1848 if ((a =
spc_rnd(Cb_R[r0] + Cb_G[g0] + Cb_B[b0])) > max_UV) uyvy->
u0 = max_UV;
1849 else uyvy->
u0 = a < min_UV ? min_UV : a;
1851 if ((a =
spc_rnd(Y_R[r0] + Y_G[g0] + Y_B[b0])) > max_Y) uyvy->
y0 = max_Y;
1852 else uyvy->
y0 = a < min_Y ? min_Y : a;
1854 if ((a =
spc_rnd(Cr_R[r1] + Cr_G[g1] + Cr_B[b1])) > max_UV) uyvy->
v0 = max_UV;
1855 else uyvy->
v0 = a < min_UV ? min_UV : a;
1857 if ((a =
spc_rnd(Y_R[r1] + Y_G[g1] + Y_B[b1])) > max_Y) uyvy->
y1 = max_Y;
1858 else uyvy->
y1 = a < min_Y ? min_Y : a;
1861 LIVES_INLINE void rgb2uyvy_with_gamma(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
1864 if ((a =
spc_rnd(Cb_R[(r0 = lut[r0])] + Cb_G[(g0 = lut[g0])] + Cb_B[(b0 = lut[b0])])) > max_UV) uyvy->
u0 = max_UV;
1865 else uyvy->
u0 = a < min_UV ? min_UV : a;
1867 if ((a =
spc_rnd(Y_R[r0] + Y_G[g0] + Y_B[b0])) > max_Y) uyvy->
y0 = max_Y;
1868 else uyvy->
y0 = a < min_Y ? min_Y : a;
1870 if ((a =
spc_rnd(Cr_R[(r1 = lut[r1])] + Cr_G[(g1 = lut[g1])] + Cr_B[(b1 = lut[b1])])) > max_UV) uyvy->
v0 = max_UV;
1871 else uyvy->
v0 = a < min_UV ? min_UV : a;
1873 if ((a =
spc_rnd(Y_R[r1] + Y_G[g1] + Y_B[b1])) > max_Y) uyvy->
y1 = max_Y;
1874 else uyvy->
y1 = a < min_Y ? min_Y : a;
1879 if ((a =
spc_rnd(Y_R[r0] + Y_G[g0] + Y_B[b0])) > max_Y) yuyv->
y0 = max_Y;
1880 else yuyv->
y0 = a < min_Y ? min_Y : a;
1882 if ((a =
spc_rnd(Cb_R[r0] + Cb_G[g0] + Cb_B[b0])) > max_UV) yuyv->
u0 = max_UV;
1883 yuyv->
u0 = a < min_UV ? min_UV : a;
1885 if ((a =
spc_rnd(Y_R[r1] + Y_G[g1] + Y_B[b1])) > max_Y) yuyv->
y1 = max_Y;
1886 else yuyv->
y1 = a < min_Y ? min_Y : a;
1888 if ((a =
spc_rnd(Cr_R[r1] + Cr_G[g1] + Cr_B[b1])) > max_UV) yuyv->
v0 = max_UV;
1889 yuyv->
v0 = a < min_UV ? min_UV : a;
1896 if ((a =
spc_rnd(Y_R[(r0 = lut[r0])] + Y_G[(g0 = lut[g0])] + Y_B[(b0 = lut[b0])])) > max_Y) yuyv->
y0 = max_Y;
1897 else yuyv->
y0 = a < min_Y ? min_Y : a;
1899 if ((a =
spc_rnd(Cb_R[r0] + Cb_G[g0] + Cb_B[b0])) > max_UV) yuyv->
u0 = max_UV;
1900 else yuyv->
u0 = a < min_UV ? min_UV : a;
1902 if ((a =
spc_rnd(Y_R[(r1 = lut[r1])] + Y_G[(g1 = lut[g1])] + Y_B[(b1 = lut[b1])])) > max_Y) yuyv->
y1 = max_Y;
1903 else yuyv->
y1 = a < min_Y ? min_Y : a;
1905 if ((a =
spc_rnd(Cr_R[r1] + Cr_G[g1] + Cr_B[b1])) > max_UV) yuyv->
v0 = max_UV;
1906 else yuyv->
v0 = a < min_UV ? min_UV : a;
1910 LIVES_INLINE void rgb16_2uyvy(uint16_t r0, uint16_t g0, uint16_t b0, uint16_t r1, uint16_t g1, uint16_t b1,
1913 uint8_t rfrac0, gfrac0, bfrac0, rfrac1, gfrac1, bfrac1;
1914 uint8_t rr0, bb0, gg0, rr1, gg1, bb1;
1917 bytes = (uint8_t *)&r0;
1919 bytes = (uint8_t *)&g0;
1921 bytes = (uint8_t *)&b0;
1923 bytes = (uint8_t *)&r1;
1925 bytes = (uint8_t *)&g1;
1927 bytes = (uint8_t *)&b1;
1930 rr0 = (r0 & 0xFF) == 0xFF ? Y_R[255] : (Y_R[r0 & 0xFF] * rfrac0 + Y_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8;
1931 gg0 = (g0 & 0xFF) == 0xFF ? Y_G[255] : (Y_G[g0 & 0xFF] * gfrac0 + Y_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8;
1932 bb0 = (b0 & 0xFF) == 0xFF ? Y_B[255] : (Y_B[b0 & 0xFF] * bfrac0 + Y_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8;
1934 if ((a =
spc_rnd(rr0 + gg0 + bb0)) > max_Y) uyvy->
y0 = max_Y;
1935 else uyvy->
y0 = a < min_Y ? min_Y : a;
1937 rr1 = (r1 & 0xFF) == 0xFF ? Y_R[255] : (Y_R[r1 & 0xFF] * rfrac1 + Y_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8;
1938 gg1 = (g1 & 0xFF) == 0xFF ? Y_G[255] : (Y_G[g1 & 0xFF] * gfrac1 + Y_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8;
1939 bb1 = (b1 & 0xFF) == 0xFF ? Y_B[255] : (Y_B[b1 & 0xFF] * bfrac1 + Y_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8;
1941 if ((a =
spc_rnd(rr0 + gg0 + bb0)) > max_Y) uyvy->
y1 = max_Y;
1942 else uyvy->
y1 = a < min_Y ? min_Y : a;
1944 rr0 = (r0 & 0xFF) == 0xFF ? Cb_R[255] : (Cb_R[r0 & 0xFF] * rfrac0 + Cb_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8;
1945 gg0 = (g0 & 0xFF) == 0xFF ? Cb_G[255] : (Cb_G[g0 & 0xFF] * gfrac0 + Cb_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8;
1946 bb0 = (b0 & 0xFF) == 0xFF ? Cb_B[255] : (Cb_B[b0 & 0xFF] * bfrac0 + Cb_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8;
1948 rr1 = (r1 & 0xFF) == 0xFF ? Cb_R[255] : (Cb_R[r1 & 0xFF] * rfrac1 + Cb_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8;
1949 gg1 = (g1 & 0xFF) == 0xFF ? Cb_G[255] : (Cb_G[g1 & 0xFF] * gfrac1 + Cb_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8;
1950 bb1 = (b1 & 0xFF) == 0xFF ? Cb_B[255] : (Cb_B[b1 & 0xFF] * bfrac1 + Cb_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8;
1954 rr0 = (r0 & 0xFF) == 0xFF ? Cr_R[255] : (Cr_R[r0 & 0xFF] * rfrac0 + Cr_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8;
1955 gg0 = (g0 & 0xFF) == 0xFF ? Cr_G[255] : (Cr_G[g0 & 0xFF] * gfrac0 + Cr_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8;
1956 bb0 = (b0 & 0xFF) == 0xFF ? Cr_B[255] : (Cr_B[b0 & 0xFF] * bfrac0 + Cr_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8;
1958 rr1 = (r1 & 0xFF) == 0xFF ? Cr_R[255] : (Cr_R[r1 & 0xFF] * rfrac1 + Cr_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8;
1959 gg1 = (g1 & 0xFF) == 0xFF ? Cr_G[255] : (Cr_G[g1 & 0xFF] * gfrac1 + Cr_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8;
1960 bb1 = (b1 & 0xFF) == 0xFF ? Cr_B[255] : (Cr_B[b1 & 0xFF] * bfrac1 + Cr_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8;
1966 LIVES_INLINE void rgb16_2uyvy_with_gamma(uint16_t r0, uint16_t g0, uint16_t b0, uint16_t r1, uint16_t g1, uint16_t b1,
1969 uint8_t rfrac0, gfrac0, bfrac0, rfrac1, gfrac1, bfrac1;
1970 uint8_t rr0, bb0, gg0, rr1, gg1, bb1;
1973 bytes = (uint8_t *)&r0;
1975 bytes = (uint8_t *)&g0;
1977 bytes = (uint8_t *)&b0;
1979 bytes = (uint8_t *)&r1;
1981 bytes = (uint8_t *)&g1;
1983 bytes = (uint8_t *)&b1;
1986 rr0 = lut[(r0 & 0xFF) == 0xFF ? Y_R[255] : (Y_R[r0 & 0xFF] * rfrac0 + Y_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8];
1987 gg0 = lut[(g0 & 0xFF) == 0xFF ? Y_G[255] : (Y_G[g0 & 0xFF] * gfrac0 + Y_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8];
1988 bb0 = lut[(b0 & 0xFF) == 0xFF ? Y_B[255] : (Y_B[b0 & 0xFF] * bfrac0 + Y_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8];
1990 if ((a =
spc_rnd(rr0 + gg0 + bb0)) > max_Y) uyvy->
y0 = max_Y;
1991 else uyvy->
y0 = a < min_Y ? min_Y : a;
1993 rr1 = lut[(r1 & 0xFF) == 0xFF ? Y_R[255] : (Y_R[r1 & 0xFF] * rfrac1 + Y_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8];
1994 gg1 = lut[(g1 & 0xFF) == 0xFF ? Y_G[255] : (Y_G[g1 & 0xFF] * gfrac1 + Y_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8];
1995 bb1 = lut[(b1 & 0xFF) == 0xFF ? Y_B[255] : (Y_B[b1 & 0xFF] * bfrac1 + Y_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8];
1997 if ((a =
spc_rnd(rr1 + gg1 + bb1)) > max_Y) uyvy->
y1 = max_Y;
1998 else uyvy->
y1 = a < min_Y ? min_Y : a;
2000 rr0 = lut[(r0 & 0xFF) == 0xFF ? Cb_R[255] : (Cb_R[r0 & 0xFF] * rfrac0 + Cb_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8];
2001 gg0 = lut[(g0 & 0xFF) == 0xFF ? Cb_G[255] : (Cb_G[g0 & 0xFF] * gfrac0 + Cb_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8];
2002 bb0 = lut[(b0 & 0xFF) == 0xFF ? Cb_B[255] : (Cb_B[b0 & 0xFF] * bfrac0 + Cb_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8];
2004 rr1 = lut[(r1 & 0xFF) == 0xFF ? Cb_R[255] : (Cb_R[r1 & 0xFF] * rfrac1 + Cb_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8];
2005 gg1 = lut[(g1 & 0xFF) == 0xFF ? Cb_G[255] : (Cb_G[g1 & 0xFF] * gfrac1 + Cb_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8];
2006 bb1 = lut[(b1 & 0xFF) == 0xFF ? Cb_B[255] : (Cb_B[b1 & 0xFF] * bfrac1 + Cb_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8];
2010 rr0 = lut[(r0 & 0xFF) == 0xFF ? Cr_R[255] : (Cr_R[r0 & 0xFF] * rfrac0 + Cr_R[(r0 & 0xFF) + 1] * (255 - rfrac0)) >> 8];
2011 gg0 = lut[(g0 & 0xFF) == 0xFF ? Cr_G[255] : (Cr_G[g0 & 0xFF] * gfrac0 + Cr_G[(g0 & 0xFF) + 1] * (255 - gfrac0)) >> 8];
2012 bb0 = lut[(b0 & 0xFF) == 0xFF ? Cr_B[255] : (Cr_B[b0 & 0xFF] * bfrac0 + Cr_B[(b0 & 0xFF) + 1] * (255 - bfrac0)) >> 8];
2014 rr1 = lut[(r1 & 0xFF) == 0xFF ? Cr_R[255] : (Cr_R[r1 & 0xFF] * rfrac1 + Cr_R[(r1 & 0xFF) + 1] * (255 - rfrac1)) >> 8];
2015 gg1 = lut[(g1 & 0xFF) == 0xFF ? Cr_G[255] : (Cr_G[g1 & 0xFF] * gfrac1 + Cr_G[(g1 & 0xFF) + 1] * (255 - gfrac1)) >> 8];
2016 bb1 = lut[(b1 & 0xFF) == 0xFF ? Cr_B[255] : (Cr_B[b1 & 0xFF] * bfrac1 + Cr_B[(b1 & 0xFF) + 1] * (255 - bfrac1)) >> 8];
2022 LIVES_INLINE void rgb2_411(uint8_t r0, uint8_t g0, uint8_t b0, uint8_t r1, uint8_t g1, uint8_t b1,
2023 uint8_t r2, uint8_t g2, uint8_t b2, uint8_t r3, uint8_t g3, uint8_t b3,
yuv411_macropixel *yuv) {
2025 if ((a = ((Y_R[r0] + Y_G[g0] + Y_B[b0]) >>
FP_BITS)) > max_Y) yuv->
y0 = max_Y;
2026 else yuv->
y0 = a < min_Y ? min_Y : a;
2027 if ((a = ((Y_R[r1] + Y_G[g1] + Y_B[b1]) >>
FP_BITS)) > max_Y) yuv->
y1 = max_Y;
2028 else yuv->
y1 = a < min_Y ? min_Y : a;
2029 if ((a = ((Y_R[r2] + Y_G[g2] + Y_B[b2]) >>
FP_BITS)) > max_Y) yuv->
y2 = max_Y;
2030 else yuv->
y2 = a < min_Y ? min_Y : a;
2031 if ((a = ((Y_R[r3] + Y_G[g3] + Y_B[b3]) >>
FP_BITS)) > max_Y) yuv->
y3 = max_Y;
2032 else yuv->
y3 = a < min_Y ? min_Y : a;
2034 if ((a = ((((Cr_R[r0] + Cr_G[g0] + Cr_B[b0]) >>
FP_BITS) + ((Cr_R[r1] + Cr_G[g1] + Cr_B[b1]) >>
FP_BITS) +
2035 ((Cr_R[r2] + Cr_G[g2] + Cr_B[b2]) >>
FP_BITS) + ((Cr_R[r3] + Cr_G[g3] + Cr_B[b3]) >>
FP_BITS)) >> 2)) > max_UV)
2037 else yuv->
v2 = a < min_UV ? min_UV : a;
2038 if ((a = ((((Cb_R[r0] + Cb_G[g0] + Cb_B[b0]) >>
FP_BITS) + ((Cb_R[r1] + Cb_G[g1] + Cb_B[b1]) >>
FP_BITS) +
2039 ((Cb_R[r2] + Cb_G[g2] + Cb_B[b2]) >>
FP_BITS) + ((Cb_R[r3] + Cb_G[g3] + Cb_B[b3]) >>
FP_BITS)) >> 2)) > max_UV)
2041 else yuv->
u2 = a < min_UV ? min_UV : a;
2044 LIVES_INLINE void yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b) {
2050 #define yuv2bgr(y, u, v, b, g, r) yuv2rgb(y, u, v, r, g, b)
2052 LIVES_INLINE void yuv2rgb_with_gamma(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *lut) {
2058 #define yuv2bgr_with_gamma(y, u, v, b, g, r, lut) yuv2rgb_with_gamma(y, u, v, r, g, b, lut)
2061 uint8_t *r1, uint8_t *g1, uint8_t *b1) {
2062 yuv2rgb(uyvy->
y0, uyvy->
u0, uyvy->
v0, r0, g0, b0);
2063 yuv2rgb(uyvy->
y1, uyvy->
u0, uyvy->
v0, r1, g1, b1);
2069 uint8_t *r1, uint8_t *g1, uint8_t *b1) {
2070 yuv2rgb(yuyv->
y0, yuyv->
u0, yuyv->
v0, r0, g0, b0);
2071 yuv2rgb(yuyv->
y1, yuyv->
u0, yuyv->
v0, r1, g1, b1);
2075 LIVES_INLINE void yuv888_2_rgb(uint8_t *yuv, uint8_t *rgb,
boolean add_alpha) {
2076 yuv2rgb(yuv[0], yuv[1], yuv[2], &(rgb[0]), &(rgb[1]), &(rgb[2]));
2077 if (add_alpha) rgb[3] = 255;
2081 LIVES_INLINE void yuva8888_2_rgba(uint8_t *yuva, uint8_t *rgba,
boolean del_alpha) {
2082 yuv2rgb(yuva[0], yuva[1], yuva[2], &(rgba[0]), &(rgba[1]), &(rgba[2]));
2083 if (!del_alpha) rgba[3] = yuva[3];
2087 LIVES_INLINE void yuv888_2_bgr(uint8_t *yuv, uint8_t *bgr,
boolean add_alpha) {
2088 yuv2bgr(yuv[0], yuv[1], yuv[2], &(bgr[0]), &(bgr[1]), &(bgr[2]));
2089 if (add_alpha) bgr[3] = 255;
2093 LIVES_INLINE void yuva8888_2_bgra(uint8_t *yuva, uint8_t *bgra,
boolean del_alpha) {
2094 yuv2bgr(yuva[0], yuva[1], yuva[2], &(bgra[0]), &(bgra[1]), &(bgra[2]));
2095 if (!del_alpha) bgra[3] = yuva[3];
2099 LIVES_INLINE void yuv888_2_argb(uint8_t *yuv, uint8_t *argb) {
2101 yuv2rgb(yuv[0], yuv[1], yuv[2], &(argb[1]), &(argb[2]), &(argb[3]));
2105 LIVES_INLINE void yuva8888_2_argb(uint8_t *yuva, uint8_t *argb) {
2107 yuv2rgb(yuva[0], yuva[1], yuva[2], &(argb[1]), &(argb[2]), &(argb[3]));
2131 #ifdef LIVES_PAINTER_IS_CAIRO
2132 if (pal == WEED_PALETTE_A8 || pal == WEED_PALETTE_A1)
return TRUE;
2134 if (pal == WEED_PALETTE_ARGB32)
return TRUE;
2136 if (pal == WEED_PALETTE_BGRA32)
return TRUE;
2155 case WEED_PALETTE_YUVA8888:
2156 if (p1 != WEED_PALETTE_YUVA8888 && p1 != WEED_PALETTE_YUVA4444P)
return TRUE;
2158 case WEED_PALETTE_YUVA4444P:
2159 if (p1 != WEED_PALETTE_YUVA8888 && p1 != WEED_PALETTE_YUVA4444P)
return TRUE;
2161 case WEED_PALETTE_YUV888:
2162 if (p1 != WEED_PALETTE_YUVA8888 && p1 != WEED_PALETTE_YUVA4444P && p1 != WEED_PALETTE_YUV444P
2163 && p1 != WEED_PALETTE_YUVA4444P)
2166 case WEED_PALETTE_YUV444P:
2167 if (p1 != WEED_PALETTE_YUVA8888 && p1 != WEED_PALETTE_YUVA4444P && p1 != WEED_PALETTE_YUV444P
2168 && p1 != WEED_PALETTE_YUVA4444P)
2172 case WEED_PALETTE_YUV422P:
2173 case WEED_PALETTE_UYVY8888:
2174 case WEED_PALETTE_YUYV8888:
2175 if (p1 != WEED_PALETTE_YUVA8888 && p1 != WEED_PALETTE_YUVA4444P && p1 != WEED_PALETTE_YUV444P &&
2176 p1 != WEED_PALETTE_YUVA4444P && p1 != WEED_PALETTE_YUV422P && p1 != WEED_PALETTE_UYVY8888
2177 && p1 != WEED_PALETTE_YUYV8888)
2181 case WEED_PALETTE_YUV420P:
2182 case WEED_PALETTE_YVU420P:
2183 if (p1 == WEED_PALETTE_YUV411)
return TRUE;
2185 case WEED_PALETTE_A8:
2186 if (p1 == WEED_PALETTE_A1)
return TRUE;
2201 int psize = has_alpha ? 4 : 3;
2206 for (j = 0; j < height; j++) {
2207 for (i = offs; i < width; i += psize) {
2227 if (((a & 0x1F) ^ a) & ((c & 0x1F) ^ c) & (((b & 0x1F) ^ b) | ((((b << 1) & 0x1F) ^ (b << 1))
2228 & ((((b & 0x0F) << 2) & 0x1F) ^ ((b & 0x0F) << 2)))))
return FALSE;
2241 case WEED_PALETTE_YUV444P:
2242 if (contig)
lives_memcpy(pixel_data[0], data, size * 3);
2245 lives_memcpy(pixel_data[1], (uint8_t *)data + size, size);
2246 lives_memcpy(pixel_data[2], (uint8_t *)data + size * 2, size);
2249 case WEED_PALETTE_YUVA4444P:
2250 if (contig)
lives_memcpy(pixel_data[0], data, size * 4);
2253 lives_memcpy(pixel_data[1], (uint8_t *)data + size, size);
2254 lives_memcpy(pixel_data[2], (uint8_t *)data + size * 2, size);
2255 lives_memcpy(pixel_data[3], (uint8_t *)data + size * 2, size);
2258 case WEED_PALETTE_YUV422P:
2259 if (contig)
lives_memcpy(pixel_data[0], data, size * 2);
2262 lives_memcpy(pixel_data[1], (uint8_t *)data + size, size / 2);
2263 lives_memcpy(pixel_data[2], (uint8_t *)data + size * 3 / 2, size / 2);
2266 case WEED_PALETTE_YUV420P:
2267 case WEED_PALETTE_YVU420P:
2268 if (contig)
lives_memcpy(pixel_data[0], data, size * 3 / 2);
2271 lives_memcpy(pixel_data[1], (uint8_t *)data + size, size / 4);
2272 lives_memcpy(pixel_data[2], (uint8_t *)data + size * 5 / 4, size / 4);
2282 static void convert_yuv888_to_rgb_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2283 int orowstride, uint8_t *dest,
boolean add_alpha,
int clamping,
int subspace,
int thread_id) {
2287 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2289 if (thread_id == -1) {
2290 set_conversion_arrays(clamping, subspace);
2294 uint8_t *end = src + vsize * irowstride;
2296 int dheight, xdheight;
2303 if ((src + dheight * i * irowstride) < end) {
2304 ccparams[i].
src = src + dheight * i * irowstride;
2305 ccparams[i].
hsize = hsize;
2306 ccparams[i].
dest = dest + dheight * i * orowstride;
2308 if (dheight * (i + 1) > (vsize - 4)) {
2309 dheight = vsize - (dheight * i);
2312 ccparams[i].
vsize = dheight;
2321 if (i == 0) convert_yuv888_to_rgb_frame_thread(&ccparams[i]);
2329 for (i = 1; i < nthreads; i++) {
2337 if (add_alpha) offs = 4;
2338 orowstride -= offs * hsize;
2339 irowstride -= hsize * 3;
2341 for (y = 0; y < vsize; y++) {
2342 for (x = 0; x < hsize; x++) {
2343 yuv888_2_rgb(src, dest, add_alpha);
2353 static void *convert_yuv888_to_rgb_frame_thread(
void *data) {
2362 static void convert_yuva8888_to_rgba_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2363 int orowstride, uint8_t *dest,
boolean del_alpha,
int clamping,
int subspace,
int thread_id) {
2364 register int x, y, i;
2368 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2370 if (thread_id == -1)
2371 set_conversion_arrays(clamping, subspace);
2375 uint8_t *end = src + vsize * irowstride;
2377 int dheight, xdheight;
2384 if ((src + dheight * i * irowstride) < end) {
2385 ccparams[i].
src = src + dheight * i * irowstride;
2386 ccparams[i].
hsize = hsize;
2387 ccparams[i].
dest = dest + dheight * i * orowstride;
2389 if (dheight * (i + 1) > (vsize - 4)) {
2390 dheight = vsize - (dheight * i);
2393 ccparams[i].
vsize = dheight;
2402 if (i == 0) convert_yuva8888_to_rgba_frame_thread(&ccparams[i]);
2410 for (i = 1; i < nthreads; i++) {
2417 if (del_alpha) offs = 3;
2418 orowstride -= offs * hsize;
2419 irowstride -= hsize * 4;
2421 for (y = 0; y < vsize; y++) {
2422 for (x = 0; x < hsize; x++) {
2423 yuva8888_2_rgba(src, dest, del_alpha);
2433 static void *convert_yuva8888_to_rgba_frame_thread(
void *data) {
2435 convert_yuva8888_to_rgba_frame((uint8_t *)ccparams->
src, ccparams->
hsize, ccparams->
vsize, ccparams->
irowstrides[0],
2442 static void convert_yuv888_to_bgr_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2443 int orowstride, uint8_t *dest,
boolean add_alpha,
int clamping,
int subspace,
int thread_id) {
2444 register int x, y, i;
2447 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2448 if (thread_id == -1)
2449 set_conversion_arrays(clamping, subspace);
2453 uint8_t *end = src + vsize * irowstride;
2455 int dheight, xdheight;
2462 if ((src + dheight * i * irowstride) < end) {
2463 ccparams[i].
src = src + dheight * i * irowstride;
2464 ccparams[i].
hsize = hsize;
2465 ccparams[i].
dest = dest + dheight * i * orowstride;
2467 if (dheight * (i + 1) > (vsize - 4)) {
2468 dheight = vsize - (dheight * i);
2471 ccparams[i].
vsize = dheight;
2480 if (i == 0) convert_yuv888_to_bgr_frame_thread(&ccparams[i]);
2488 for (i = 1; i < nthreads; i++) {
2495 if (add_alpha) offs = 4;
2496 orowstride -= offs * hsize;
2497 irowstride -= hsize * 3;
2499 for (y = 0; y < vsize; y++) {
2500 for (x = 0; x < hsize; x++) {
2501 yuv888_2_bgr(src, dest, add_alpha);
2511 static void *convert_yuv888_to_bgr_frame_thread(
void *data) {
2520 static void convert_yuva8888_to_bgra_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2521 int orowstride, uint8_t *dest,
boolean del_alpha,
int clamping,
int subspace,
int thread_id) {
2522 register int x, y, i;
2526 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2527 if (thread_id == -1)
2528 set_conversion_arrays(clamping, subspace);
2532 uint8_t *end = src + vsize * irowstride;
2534 int dheight, xdheight;
2541 if ((src + dheight * i * irowstride) < end) {
2542 ccparams[i].
src = src + dheight * i * irowstride;
2543 ccparams[i].
hsize = hsize;
2544 ccparams[i].
dest = dest + dheight * i * orowstride;
2546 if (dheight * (i + 1) > (vsize - 4)) {
2547 dheight = vsize - (dheight * i);
2550 ccparams[i].
vsize = dheight;
2559 if (i == 0) convert_yuva8888_to_bgra_frame_thread(&ccparams[i]);
2567 for (i = 1; i < nthreads; i++) {
2574 if (del_alpha) offs = 3;
2575 orowstride -= offs * hsize;
2576 irowstride -= 4 * hsize;
2578 for (y = 0; y < vsize; y++) {
2579 for (x = 0; x < hsize; x++) {
2580 yuva8888_2_bgra(src, dest, del_alpha);
2590 static void *convert_yuva8888_to_bgra_frame_thread(
void *data) {
2592 convert_yuva8888_to_bgra_frame((uint8_t *)ccparams->
src, ccparams->
hsize, ccparams->
vsize, ccparams->
irowstrides[0],
2599 static void convert_yuv888_to_argb_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2600 int orowstride, uint8_t *dest,
int clamping,
int subspace,
int thread_id) {
2604 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2605 if (thread_id == -1)
2606 set_conversion_arrays(clamping, subspace);
2610 uint8_t *end = src + vsize * irowstride;
2612 int dheight, xdheight;
2619 if ((src + dheight * i * irowstride) < end) {
2620 ccparams[i].
src = src + dheight * i * irowstride;
2621 ccparams[i].
hsize = hsize;
2622 ccparams[i].
dest = dest + dheight * i * orowstride;
2624 if (dheight * (i + 1) > (vsize - 4)) {
2625 dheight = vsize - (dheight * i);
2628 ccparams[i].
vsize = dheight;
2636 if (i == 0) convert_yuv888_to_argb_frame_thread(&ccparams[i]);
2644 for (i = 1; i < nthreads; i++) {
2651 orowstride -= offs * hsize;
2652 irowstride -= hsize * 3;
2654 for (y = 0; y < vsize; y++) {
2655 for (x = 0; x < hsize; x++) {
2656 yuv888_2_argb(src, dest);
2666 static void *convert_yuv888_to_argb_frame_thread(
void *data) {
2675 static void convert_yuva8888_to_argb_frame(uint8_t *src,
int hsize,
int vsize,
int irowstride,
2676 int orowstride, uint8_t *dest,
int clamping,
int subspace,
int thread_id) {
2681 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2682 if (thread_id == -1)
2683 set_conversion_arrays(clamping, subspace);
2687 uint8_t *end = src + vsize * irowstride;
2689 int dheight, xdheight;
2696 if ((src + dheight * i * irowstride) < end) {
2697 ccparams[i].
src = src + dheight * i * irowstride;
2698 ccparams[i].
hsize = hsize;
2699 ccparams[i].
dest = dest + dheight * i * orowstride;
2701 if (dheight * (i + 1) > (vsize - 4)) {
2702 dheight = vsize - (dheight * i);
2705 ccparams[i].
vsize = dheight;
2713 if (i == 0) convert_yuva8888_to_argb_frame_thread(&ccparams[i]);
2721 for (i = 1; i < nthreads; i++) {
2728 orowstride -= offs * hsize;
2729 irowstride -= hsize * 4;
2731 for (y = 0; y < vsize; y++) {
2732 for (x = 0; x < hsize; x++) {
2733 yuva8888_2_argb(src, dest);
2743 static void *convert_yuva8888_to_argb_frame_thread(
void *data) {
2745 convert_yuva8888_to_argb_frame((uint8_t *)ccparams->
src, ccparams->
hsize, ccparams->
vsize, ccparams->
irowstrides[0],
2752 static void convert_yuv420p_to_rgb_frame(uint8_t **src,
int width,
int height,
boolean is_bottom,
int *istrides,
int orowstride,
2753 uint8_t *dest,
boolean add_alpha,
boolean is_422,
int sampling,
int clamping,
int subspace,
2754 int gamma,
int tgamma, uint8_t *gamma_lut,
int thread_id) {
2756 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
2758 int irow = istrides[0] - width;
2759 boolean even =
TRUE;
2761 uint8_t y, u, v, next_u, next_v, last_u, last_v;
2763 if (thread_id == -1) {
2764 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2767 set_conversion_arrays(clamping, subspace);
2769 if (tgamma) gamma_lut = create_gamma_lut(1.0, gamma, tgamma);
2772 uint8_t *end = src[0] + height * istrides[0];
2774 int dheight, xdheight;
2781 if ((src[0] + dheight * i * istrides[0]) < end) {
2782 ccparams[i].
srcp[0] = src[0] + dheight * i * istrides[0];
2783 ccparams[i].
srcp[1] = src[1] + dheight / 2 * i * istrides[1];
2784 ccparams[i].
srcp[2] = src[2] + dheight / 2 * i * istrides[2];
2785 ccparams[i].
hsize = width;
2786 ccparams[i].
dest = dest + dheight * i * orowstride;
2788 if (dheight * (i + 1) > (height - 4)) {
2789 dheight = height - (dheight * i);
2792 ccparams[i].
vsize = dheight;
2804 ccparams[i].
is_422 = is_422;
2805 ccparams[i].
lut = gamma_lut;
2808 if (i == 0) convert_yuv420p_to_rgb_frame_thread(&ccparams[i]);
2816 for (i = 1; i < nthreads; i++) {
2820 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
2825 if (add_alpha) opsize = 4;
2828 for (i = 0; i < height; i++) {
2830 if (!(i & 1)) even =
TRUE;
2836 for (j = 0; j < width; j += opsize) {
2849 last_u = next_u = u = s_u[uv_offs];
2850 last_v = next_v = v = s_v[uv_offs];
2852 if (is_bottom && i == height - 1) {
2853 next_u = u = s_u[uv_offs];
2854 next_v = v = s_v[uv_offs];
2856 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
2857 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
2862 yuv2rgb_with_gamma(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2], gamma_lut);
2864 yuv2rgb(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2]);
2865 if (add_alpha) dest[j + 3] = 255;
2874 if (j < width - 1) {
2877 next_u = s_u[uv_offs];
2878 next_v = s_v[uv_offs];
2880 if (is_bottom && i == height - 1) {
2881 next_u = u = s_u[uv_offs];
2882 next_v = v = s_v[uv_offs];
2885 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
2886 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
2897 yuv2rgb_with_gamma(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2], gamma_lut);
2899 yuv2rgb(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2]);
2900 if (add_alpha) dest[j + 3] = 255;
2905 if (is_422 || !even) {
2912 static void *convert_yuv420p_to_rgb_frame_thread(
void *data) {
2914 convert_yuv420p_to_rgb_frame((uint8_t **)ccparams->
srcp, ccparams->
hsize, ccparams->
vsize,
2924 static void convert_yuv420p_to_bgr_frame(uint8_t **src,
int width,
int height,
boolean is_bottom,
int *istrides,
int orowstride,
2925 uint8_t *dest,
boolean add_alpha,
boolean is_422,
int sampling,
int clamping,
int subspace,
2926 int gamma,
int tgamma, uint8_t *gamma_lut,
int thread_id) {
2928 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
2930 int irow = istrides[0] - width;
2931 boolean even =
TRUE;
2932 uint8_t y, u, v, next_u, next_v, last_u, last_v;
2935 if (thread_id == -1) {
2936 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
2939 set_conversion_arrays(clamping, subspace);
2941 if (tgamma) gamma_lut = create_gamma_lut(1.0, gamma, tgamma);
2944 uint8_t *end = src[0] + height * istrides[0];
2946 int dheight, xdheight;
2953 if ((src[0] + dheight * i * istrides[0]) < end) {
2954 ccparams[i].
srcp[0] = src[0] + dheight * i * istrides[0];
2955 ccparams[i].
srcp[1] = src[1] + dheight / 2 * i * istrides[1];
2956 ccparams[i].
srcp[2] = src[2] + dheight / 2 * i * istrides[2];
2957 ccparams[i].
hsize = width;
2958 ccparams[i].
dest = dest + dheight * i * orowstride;
2960 if (dheight * (i + 1) > (height - 4)) {
2961 dheight = height - (dheight * i);
2964 ccparams[i].
vsize = dheight;
2975 ccparams[i].
is_422 = is_422;
2976 ccparams[i].
lut = gamma_lut;
2979 if (i == 0) convert_yuv420p_to_bgr_frame_thread(&ccparams[i]);
2987 for (i = 1; i < nthreads; i++) {
2991 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
2996 if (add_alpha) opsize = 4;
2999 for (i = 0; i < height; i++) {
3001 if (!(i & 1)) even =
TRUE;
3007 for (j = 0; j < width; j += opsize) {
3020 next_u = u = s_u[uv_offs];
3021 next_v = v = s_v[uv_offs];
3023 if (i == height - 1 && is_bottom) {
3024 next_u = u = s_u[uv_offs];
3025 next_v = v = s_v[uv_offs];
3027 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
3028 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
3035 yuv2bgr(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2]);
3036 if (add_alpha) dest[j + 3] = 255;
3044 if (j < width - 1) {
3047 next_u = s_u[uv_offs];
3048 next_v = s_v[uv_offs];
3050 if (i == height - 1 && is_bottom) {
3051 next_u = u = s_u[uv_offs];
3052 next_v = v = s_v[uv_offs];
3054 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
3055 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
3068 yuv2bgr(y, u, v, &dest[j], &dest[j + 1], &dest[j + 2]);
3069 if (add_alpha) dest[j + 3] = 255;
3074 if (is_422 || !even) {
3081 static void *convert_yuv420p_to_bgr_frame_thread(
void *data) {
3083 convert_yuv420p_to_bgr_frame((uint8_t **)ccparams->
srcp, ccparams->
hsize, ccparams->
vsize,
3093 static void convert_yuv420p_to_argb_frame(uint8_t **src,
int width,
int height,
boolean is_bottom,
int *istrides,
3095 uint8_t *dest,
boolean is_422,
int sampling,
int clamping,
int subspace,
3096 int gamma,
int tgamma, uint8_t *gamma_lut,
int thread_id) {
3098 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
3100 int irow = istrides[0] - width;
3101 boolean even =
TRUE;
3102 uint8_t y, u, v, next_u = 0, next_v = 0, last_u = 0, last_v = 0;
3105 if (thread_id == -1) {
3106 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
3109 set_conversion_arrays(clamping, subspace);
3111 if (tgamma) gamma_lut = create_gamma_lut(1.0, gamma, tgamma);
3114 uint8_t *end = src[0] + height * istrides[0];
3116 int dheight, xdheight;
3123 if ((src[0] + dheight * i * istrides[0]) < end) {
3124 ccparams[i].
srcp[0] = src[0] + dheight * i * istrides[0];
3125 ccparams[i].
srcp[1] = src[1] + dheight / 2 * i * istrides[1];
3126 ccparams[i].
srcp[2] = src[2] + dheight / 2 * i * istrides[2];
3127 ccparams[i].
hsize = width;
3128 ccparams[i].
dest = dest + dheight * i * orowstride;
3130 if (dheight * (i + 1) > (height - 4)) {
3131 dheight = height - (dheight * i);
3134 ccparams[i].
vsize = dheight;
3144 ccparams[i].
is_422 = is_422;
3145 ccparams[i].
lut = gamma_lut;
3148 if (i == 0) convert_yuv420p_to_argb_frame_thread(&ccparams[i]);
3156 for (i = 1; i < nthreads; i++) {
3160 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3167 for (i = 0; i < height; i++) {
3169 if (!(i & 1)) even =
TRUE;
3175 for (j = 0; j < width; j += opsize) {
3189 next_u = u = s_u[uv_offs];
3190 next_v = v = s_v[uv_offs];
3192 if (i == height - 1 && is_bottom) {
3193 next_u = u = s_u[uv_offs];
3194 next_v = v = s_v[uv_offs];
3196 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
3197 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
3202 yuv2rgb_with_gamma(y, u, v, &dest[j + 1], &dest[j + 2], &dest[j + 3], gamma_lut);
3204 yuv2rgb(y, u, v, &dest[j + 1], &dest[j + 2], &dest[j + 3]);
3213 if (j < width - 1) {
3216 next_u = s_u[uv_offs];
3217 next_v = s_v[uv_offs];
3219 if (i == height - 1 && is_bottom) {
3220 next_u = u = s_u[uv_offs];
3221 next_v = v = s_v[uv_offs];
3223 next_u = u = avg_chromaf(s_u[uv_offs], s_u[uv_offs + istrides[1]]);
3224 next_v = v = avg_chromaf(s_v[uv_offs], s_v[uv_offs + istrides[2]]);
3235 yuv2rgb_with_gamma(y, u, v, &dest[j + 1], &dest[j + 2], &dest[j + 3], gamma_lut);
3237 yuv2rgb(y, u, v, &dest[j + 1], &dest[j + 2], &dest[j + 3]);
3242 if (is_422 || !even) {
3249 static void *convert_yuv420p_to_argb_frame_thread(
void *data) {
3251 convert_yuv420p_to_argb_frame((uint8_t **)ccparams->
srcp, ccparams->
hsize, ccparams->
vsize,
3261 static void convert_rgb_to_uyvy_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3262 uyvy_macropixel *u,
boolean has_alpha,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3264 int hs3, ipsize = 3, ipsize2;
3268 int x = 3, y = 4, z = 5;
3269 hsize = (hsize >> 1) << 1;
3271 if (thread_id == -1) {
3272 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3273 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3276 end = rgbdata + rowstride * vsize;
3281 int dheight, xdheight;
3288 if ((rgbdata + dheight * i * rowstride) < end) {
3289 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3290 ccparams[i].
hsize = hsize;
3291 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3293 if (dheight * (i + 1) > (vsize - 4)) {
3294 dheight = vsize - (dheight * i);
3297 ccparams[i].
vsize = dheight;
3303 ccparams[i].
lut = gamma_lut;
3306 if (i == 0) convert_rgb_to_uyvy_frame_thread(&ccparams[i]);
3314 for (i = 1; i < nthreads; i++) {
3318 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3329 ipsize2 = ipsize * 2;
3330 hs3 = hsize * ipsize;
3331 orowstride = orowstride / 2 - hsize;
3332 for (
int k = 0; k < vsize; k++) {
3333 for (i = 0; i < hs3; i += ipsize2) {
3336 rgb2uyvy_with_gamma(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + x], rgbdata[i + y],
3337 rgbdata[i + z], u++, gamma_lut);
3339 rgb2uyvy(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + x], rgbdata[i + y], rgbdata[i + z], u++);
3341 rgbdata += rowstride;
3347 static void *convert_rgb_to_uyvy_frame_thread(
void *data) {
3357 static void convert_rgb_to_yuyv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3358 yuyv_macropixel *u,
boolean has_alpha,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3360 int hs3, ipsize = 3, ipsize2;
3361 uint8_t *end = rgbdata + rowstride * vsize;
3364 int x = 3, y = 4, z = 5;
3365 hsize = (hsize >> 1) << 1;
3367 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3368 if (thread_id == -1)
3369 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3374 int dheight, xdheight;
3381 if ((rgbdata + dheight * i * rowstride) < end) {
3382 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3383 ccparams[i].
hsize = hsize;
3384 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3386 if (dheight * (i + 1) > (vsize - 4)) {
3387 dheight = vsize - (dheight * i);
3390 ccparams[i].
vsize = dheight;
3396 ccparams[i].
lut = gamma_lut;
3399 if (i == 0) convert_rgb_to_yuyv_frame_thread(&ccparams[i]);
3407 for (i = 1; i < nthreads; i++) {
3411 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3422 ipsize2 = ipsize * 2;
3423 hs3 = hsize * ipsize;
3424 orowstride = orowstride / 2 - hsize;
3426 for (; rgbdata < end; rgbdata += rowstride) {
3427 for (i = 0; i < hs3; i += ipsize2) {
3430 rgb2yuyv_with_gamma(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + x], rgbdata[i + y],
3431 rgbdata[i + z], u++, gamma_lut);
3433 rgb2yuyv(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + x], rgbdata[i + y], rgbdata[i + z], u++);
3440 static void *convert_rgb_to_yuyv_frame_thread(
void *data) {
3449 static void convert_bgr_to_uyvy_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3450 uyvy_macropixel *u,
boolean has_alpha,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3452 int hs3, ipsize = 3, ipsize2;
3453 uint8_t *end = rgbdata + rowstride * vsize;
3456 int x = 3, y = 4, z = 5;
3457 hsize = (hsize >> 1) << 1;
3459 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3460 if (thread_id == -1)
3461 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3466 int dheight, xdheight;
3473 if ((rgbdata + dheight * i * rowstride) < end) {
3474 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3475 ccparams[i].
hsize = hsize;
3476 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3478 if (dheight * (i + 1) > (vsize - 4)) {
3479 dheight = vsize - (dheight * i);
3482 ccparams[i].
vsize = dheight;
3488 ccparams[i].
lut = gamma_lut;
3491 if (i == 0) convert_bgr_to_uyvy_frame_thread(&ccparams[i]);
3499 for (i = 1; i < nthreads; i++) {
3503 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3514 ipsize2 = ipsize * 2;
3515 hs3 = hsize * ipsize;
3516 orowstride = orowstride / 2 - hsize;
3518 for (; rgbdata < end; rgbdata += rowstride) {
3519 for (i = 0; i < hs3; i += ipsize2) {
3522 rgb2uyvy_with_gamma(rgbdata[i + 2], rgbdata[i + 1], rgbdata[i], rgbdata[i + z], rgbdata[i + y],
3523 rgbdata[i + x], u++, gamma_lut);
3525 rgb2uyvy(rgbdata[i + 2], rgbdata[i + 1], rgbdata[i], rgbdata[i + z], rgbdata[i + y], rgbdata[i + x], u++);
3532 static void *convert_bgr_to_uyvy_frame_thread(
void *data) {
3541 static void convert_bgr_to_yuyv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3542 yuyv_macropixel *u,
boolean has_alpha,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3544 int hs3, ipsize = 3, ipsize2;
3546 uint8_t *end = rgbdata + rowstride * vsize;
3549 int x = 3, y = 4, z = 5;
3551 hsize = (hsize >> 1) << 1;
3553 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3554 if (thread_id == -1)
3555 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3560 int dheight, xdheight;
3567 if ((rgbdata + dheight * i * rowstride) < end) {
3568 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3569 ccparams[i].
hsize = hsize;
3570 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3572 if (dheight * (i + 1) > (vsize - 4)) {
3573 dheight = vsize - (dheight * i);
3576 ccparams[i].
vsize = dheight;
3582 ccparams[i].
lut = gamma_lut;
3585 if (i == 0) convert_bgr_to_yuyv_frame_thread(&ccparams[i]);
3593 for (i = 1; i < nthreads; i++) {
3597 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3608 ipsize2 = ipsize * 2;
3609 hs3 = hsize * ipsize;
3610 orowstride = orowstride / 2 - hsize;
3612 for (; rgbdata < end; rgbdata += rowstride) {
3613 for (i = 0; i < hs3; i += ipsize2) {
3616 rgb2yuyv_with_gamma(rgbdata[i + 2], rgbdata[i + 1], rgbdata[i], rgbdata[i + z], rgbdata[i + y],
3617 rgbdata[i + x], u++, gamma_lut);
3619 rgb2yuyv(rgbdata[i + 2], rgbdata[i + 1], rgbdata[i], rgbdata[i + z], rgbdata[i + y], rgbdata[i + x], u++);
3626 static void *convert_bgr_to_yuyv_frame_thread(
void *data) {
3635 static void convert_argb_to_uyvy_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3636 uyvy_macropixel *u,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3638 int hs3, ipsize = 4, ipsize2;
3642 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3643 if (thread_id == -1)
3644 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3646 end = rgbdata + rowstride * vsize;
3647 hsize = (hsize >> 1) << 1;
3652 int dheight, xdheight;
3659 if ((rgbdata + dheight * i * rowstride) < end) {
3660 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3661 ccparams[i].
hsize = hsize;
3662 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3664 if (dheight * (i + 1) > (vsize - 4)) {
3665 dheight = vsize - (dheight * i);
3668 ccparams[i].
vsize = dheight;
3673 ccparams[i].
lut = gamma_lut;
3676 if (i == 0) convert_argb_to_uyvy_frame_thread(&ccparams[i]);
3684 for (i = 1; i < nthreads; i++) {
3688 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3692 ipsize2 = ipsize * 2;
3693 hs3 = hsize * ipsize;
3694 orowstride = orowstride / 2 - hsize;
3696 for (; rgbdata < end; rgbdata += rowstride) {
3697 for (i = 0; i < hs3; i += ipsize2) {
3700 rgb2uyvy_with_gamma(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], rgbdata[i + 5], rgbdata[i + 6],
3701 rgbdata[i + 7], u++, gamma_lut);
3703 rgb2uyvy(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], rgbdata[i + 5], rgbdata[i + 6], rgbdata[i + 7], u++);
3710 static void *convert_argb_to_uyvy_frame_thread(
void *data) {
3719 static void convert_argb_to_yuyv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orowstride,
3720 yuyv_macropixel *u,
int clamping, uint8_t *gamma_lut,
int thread_id) {
3722 int hs3, ipsize = 4, ipsize2;
3726 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3727 if (thread_id == -1)
3728 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3730 end = rgbdata + rowstride * vsize;
3731 hsize = (hsize >> 1) << 1;
3736 int dheight, xdheight;
3743 if ((rgbdata + dheight * i * rowstride) < end) {
3744 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3745 ccparams[i].
hsize = hsize;
3746 ccparams[i].
dest = u + dheight * i * orowstride / 4;
3748 if (dheight * (i + 1) > (vsize - 4)) {
3749 dheight = vsize - (dheight * i);
3752 ccparams[i].
vsize = dheight;
3757 ccparams[i].
lut = gamma_lut;
3760 if (i == 0) convert_argb_to_yuyv_frame_thread(&ccparams[i]);
3768 for (i = 1; i < nthreads; i++) {
3772 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
3776 ipsize2 = ipsize * 2;
3777 hs3 = hsize * ipsize;
3778 orowstride = orowstride / 2 - hsize;
3779 for (; rgbdata < end; rgbdata += rowstride) {
3780 for (i = 0; i < hs3; i += ipsize2) {
3783 rgb2yuyv_with_gamma(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], rgbdata[i + 5], rgbdata[i + 6],
3784 rgbdata[i + 7], u++, gamma_lut);
3786 rgb2yuyv(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], rgbdata[i + 5], rgbdata[i + 6], rgbdata[i + 7], u++);
3793 static void *convert_argb_to_yuyv_frame_thread(
void *data) {
3802 static void convert_rgb_to_yuv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
3803 uint8_t *u,
boolean in_has_alpha,
boolean out_has_alpha,
int clamping,
int thread_id) {
3804 int ipsize = 3, opsize = 3;
3806 uint8_t *end = rgbdata + (rowstride * vsize);
3808 uint8_t in_alpha = 255;
3810 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3811 if (thread_id == -1)
3812 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3817 int dheight, xdheight;
3824 if ((rgbdata + dheight * i * rowstride) < end) {
3825 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3826 ccparams[i].
hsize = hsize;
3827 ccparams[i].
dest = u + dheight * i * orow;
3829 if (dheight * (i + 1) > (vsize - 4)) {
3830 dheight = vsize - (dheight * i);
3833 ccparams[i].
vsize = dheight;
3837 ccparams[i].
in_alpha = in_has_alpha;
3842 if (i == 0) convert_rgb_to_yuv_frame_thread(&ccparams[i]);
3850 for (i = 1; i < nthreads; i++) {
3857 if (in_has_alpha) ipsize = 4;
3858 if (out_has_alpha) opsize = 4;
3860 hsize = (hsize >> 1) << 1;
3861 iwidth = hsize * ipsize;
3862 orow -= hsize * opsize;
3864 for (; rgbdata < end; rgbdata += rowstride) {
3865 for (i = 0; i < iwidth; i += ipsize) {
3866 if (in_has_alpha) in_alpha = rgbdata[i + 3];
3867 if (out_has_alpha) u[3] = in_alpha;
3868 rgb2yuv(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], &(u[0]), &(u[1]), &(u[2]));
3876 static void *convert_rgb_to_yuv_frame_thread(
void *data) {
3886 static void convert_rgb_to_yuvp_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
3887 uint8_t **yuvp,
boolean in_has_alpha,
boolean out_has_alpha,
int clamping,
int thread_id) {
3890 uint8_t *end = rgbdata + (rowstride * vsize);
3892 uint8_t in_alpha = 255, *a = NULL;
3896 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3897 if (thread_id == -1)
3898 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
3903 if (out_has_alpha) a = yuvp[3];
3908 int dheight, xdheight;
3915 if ((rgbdata + dheight * i * rowstride) < end) {
3916 ccparams[i].
src = rgbdata + dheight * i * rowstride;
3917 ccparams[i].
hsize = hsize;
3919 ccparams[i].
destp[0] = y + dheight * i * orow;
3920 ccparams[i].
destp[1] = u + dheight * i * orow;
3921 ccparams[i].
destp[2] = v + dheight * i * orow;
3922 if (out_has_alpha) ccparams[i].
destp[3] = a + dheight * i * orow;
3924 if (dheight * (i + 1) > (vsize - 4)) {
3925 dheight = vsize - (dheight * i);
3928 ccparams[i].
vsize = dheight;
3932 ccparams[i].
in_alpha = in_has_alpha;
3937 if (i == 0) convert_rgb_to_yuvp_frame_thread(&ccparams[i]);
3945 for (i = 1; i < nthreads; i++) {
3952 if (in_has_alpha) ipsize = 4;
3954 hsize = (hsize >> 1) << 1;
3955 iwidth = hsize * ipsize;
3958 for (; rgbdata < end; rgbdata += rowstride) {
3959 for (i = 0; i < iwidth; i += ipsize) {
3960 if (in_has_alpha) in_alpha = rgbdata[i + 3];
3961 if (out_has_alpha) *(a++) = in_alpha;
3962 rgb2yuv(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], y, u, v);
3970 if (out_has_alpha) a += orow;
3975 static void *convert_rgb_to_yuvp_frame_thread(
void *data) {
3985 static void convert_bgr_to_yuv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
3986 uint8_t *u,
boolean in_has_alpha,
boolean out_has_alpha,
int clamping,
int thread_id) {
3987 int ipsize = 3, opsize = 3;
3989 uint8_t *end = rgbdata + (rowstride * vsize);
3991 uint8_t in_alpha = 255;
3993 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
3994 if (thread_id == -1)
3995 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4000 int dheight, xdheight;
4007 if ((rgbdata + dheight * i * rowstride) < end) {
4008 ccparams[i].
src = rgbdata + dheight * i * rowstride;
4009 ccparams[i].
hsize = hsize;
4010 ccparams[i].
dest = u + dheight * i * orow;
4012 if (dheight * (i + 1) > (vsize - 4)) {
4013 dheight = vsize - (dheight * i);
4016 ccparams[i].
vsize = dheight;
4019 ccparams[i].
in_alpha = in_has_alpha;
4024 if (i == 0) convert_bgr_to_yuv_frame_thread(&ccparams[i]);
4032 for (i = 1; i < nthreads; i++) {
4039 if (in_has_alpha) ipsize = 4;
4040 if (out_has_alpha) opsize = 4;
4042 hsize = (hsize >> 1) << 1;
4043 iwidth = hsize * ipsize;
4044 orow -= hsize * opsize;
4046 for (; rgbdata < end; rgbdata += rowstride) {
4047 for (i = 0; i < iwidth; i += ipsize) {
4048 bgr2yuv(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], &(u[0]), &(u[1]), &(u[2]));
4049 if (in_has_alpha) in_alpha = rgbdata[i + 3];
4050 if (out_has_alpha) u[3] = in_alpha;
4058 static void *convert_bgr_to_yuv_frame_thread(
void *data) {
4067 static void convert_bgr_to_yuvp_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
4068 uint8_t **yuvp,
boolean in_has_alpha,
boolean out_has_alpha,
int clamping,
int thread_id) {
4073 uint8_t *end = rgbdata + (rowstride * vsize);
4075 uint8_t in_alpha = 255, *a = NULL;
4079 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4080 if (thread_id == -1)
4081 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4086 if (out_has_alpha) a = yuvp[3];
4091 int dheight, xdheight;
4098 if ((rgbdata + dheight * i * rowstride) < end) {
4099 ccparams[i].
src = rgbdata + dheight * i * rowstride;
4100 ccparams[i].
hsize = hsize;
4102 ccparams[i].
destp[0] = y + dheight * i * orow;
4103 ccparams[i].
destp[1] = u + dheight * i * orow;
4104 ccparams[i].
destp[2] = v + dheight * i * orow;
4105 if (out_has_alpha) ccparams[i].
destp[3] = a + dheight * i * orow;
4107 if (dheight * (i + 1) > (vsize - 4)) {
4108 dheight = vsize - (dheight * i);
4111 ccparams[i].
vsize = dheight;
4115 ccparams[i].
in_alpha = in_has_alpha;
4120 if (i == 0) convert_bgr_to_yuvp_frame_thread(&ccparams[i]);
4128 for (i = 1; i < nthreads; i++) {
4135 if (in_has_alpha) ipsize = 4;
4137 hsize = (hsize >> 1) << 1;
4138 iwidth = hsize * ipsize;
4141 for (; rgbdata < end; rgbdata += rowstride) {
4142 for (i = 0; i < iwidth; i += ipsize) {
4143 bgr2yuv(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], &(y[0]), &(u[0]), &(v[0]));
4144 if (in_has_alpha) in_alpha = rgbdata[i + 3];
4145 if (out_has_alpha) *(a++) = in_alpha;
4153 if (out_has_alpha) a += orow;
4158 static void *convert_bgr_to_yuvp_frame_thread(
void *data) {
4168 static void convert_argb_to_yuv_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
4169 uint8_t *u,
boolean out_has_alpha,
int clamping,
int thread_id) {
4170 int ipsize = 4, opsize = 3;
4172 uint8_t *end = rgbdata + (rowstride * vsize);
4175 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4176 if (thread_id == -1)
4177 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4182 int dheight, xdheight;
4189 if ((rgbdata + dheight * i * rowstride) < end) {
4190 ccparams[i].
src = rgbdata + dheight * i * rowstride;
4191 ccparams[i].
hsize = hsize;
4193 ccparams[i].
dest = u + dheight * i * orow;
4195 if (dheight * (i + 1) > (vsize - 4)) {
4196 dheight = vsize - (dheight * i);
4199 ccparams[i].
vsize = dheight;
4207 if (i == 0) convert_rgb_to_yuv_frame_thread(&ccparams[i]);
4215 for (i = 1; i < nthreads; i++) {
4222 if (out_has_alpha) opsize = 4;
4224 hsize = (hsize >> 1) << 1;
4225 iwidth = hsize * ipsize;
4226 orow -= hsize * opsize;
4228 for (; rgbdata < end; rgbdata += rowstride) {
4229 for (i = 0; i < iwidth; i += ipsize) {
4230 if (out_has_alpha) u[3] = rgbdata[i];
4231 rgb2yuv(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], &(u[0]), &(u[1]), &(u[2]));
4239 static void *convert_argb_to_yuv_frame_thread(
void *data) {
4248 static void convert_argb_to_yuvp_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int orow,
4249 uint8_t **yuvp,
boolean out_has_alpha,
int clamping,
int thread_id) {
4252 uint8_t *end = rgbdata + (rowstride * vsize);
4257 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4258 if (thread_id == -1)
4259 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4264 if (out_has_alpha) a = yuvp[3];
4269 int dheight, xdheight;
4276 if ((rgbdata + dheight * i * rowstride) < end) {
4277 ccparams[i].
src = rgbdata + dheight * i * rowstride;
4278 ccparams[i].
hsize = hsize;
4280 ccparams[i].
destp[0] = y + dheight * i * orow;
4281 ccparams[i].
destp[1] = u + dheight * i * orow;
4282 ccparams[i].
destp[2] = v + dheight * i * orow;
4283 if (out_has_alpha) ccparams[i].
destp[3] = a + dheight * i * orow;
4285 if (dheight * (i + 1) > (vsize - 4)) {
4286 dheight = vsize - (dheight * i);
4289 ccparams[i].
vsize = dheight;
4297 if (i == 0) convert_argb_to_yuvp_frame_thread(&ccparams[i]);
4305 for (i = 1; i < nthreads; i++) {
4312 hsize = (hsize >> 1) << 1;
4313 iwidth = hsize * ipsize;
4316 for (; rgbdata < end; rgbdata += rowstride) {
4317 for (i = 0; i < iwidth; i += ipsize) {
4318 if (out_has_alpha) *(a++) = rgbdata[i];
4319 rgb2yuv(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], y, u, v);
4327 if (out_has_alpha) a += orow;
4332 static void *convert_argb_to_yuvp_frame_thread(
void *data) {
4342 static void convert_rgb_to_yuv420_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int *ostrides,
4343 uint8_t **dest,
boolean is_422,
boolean has_alpha,
int subspace,
int clamping) {
4346 uint16_t *rgbdata16 = NULL;
4347 uint8_t *y, *Cb, *Cr;
4349 boolean chroma_row =
TRUE;
4352 int ipsize = 3, ipsize2;
4353 boolean is16bit =
FALSE;
4356 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4358 set_conversion_arrays(clamping, subspace);
4360 if (has_alpha) ipsize = 4;
4364 rgbdata16 = (uint16_t *)rgbdata;
4368 hsize = (hsize >> 1) << 1;
4369 vsize = (vsize >> 1) << 1;
4375 hhsize = hsize >> 1;
4376 ipsize2 = ipsize * 2;
4377 hs3 = (hsize * ipsize) - (ipsize2 - 1);
4379 for (i = 0; i < vsize; i++) {
4380 for (j = 0; j < hs3; j += ipsize2) {
4386 rgb16_2uyvy(rgbdata16[j], rgbdata16[j + 1], rgbdata16[j + 2], rgbdata16[j + ipsize], rgbdata16[j + ipsize + 1],
4387 rgbdata16[j + ipsize + 2], &u);
4388 }
else rgb2uyvy(rgbdata[j], rgbdata[j + 1], rgbdata[j + 2], rgbdata[j + ipsize], rgbdata[j + ipsize + 1],
4389 rgbdata[j + ipsize + 2], &u);
4396 if (!is_422 && chroma_row && i > 0) {
4398 Cb[-1 - ostrides[1]] = avg_chromaf(Cb[-1], Cb[-1 - ostrides[1]]);
4399 Cr[-1 - ostrides[1]] = avg_chromaf(Cr[-1], Cr[-1 - ostrides[1]]);
4408 chroma_row = !chroma_row;
4410 rgbdata += rowstride;
4415 static void convert_argb_to_yuv420_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int *ostrides,
4416 uint8_t **dest,
boolean is_422,
int subspace,
int clamping) {
4421 uint8_t *y, *Cb, *Cr;
4424 boolean chroma_row =
TRUE;
4426 int ipsize = 4, ipsize2;
4428 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4430 set_conversion_arrays(clamping, subspace);
4433 hsize = (hsize >> 1) << 1;
4434 vsize = (vsize >> 1) << 1;
4440 ipsize2 = ipsize * 2;
4441 hs3 = (hsize * ipsize) - (ipsize2 - 1);
4443 for (i = 0; i < vsize; i++) {
4444 for (j = 0; j < hs3; j += ipsize2) {
4450 rgb2uyvy(rgbdata[j + 1], rgbdata[j + 2], rgbdata[j + 3], rgbdata[j + 1 + ipsize], rgbdata[j + 2 + ipsize + 1],
4451 rgbdata[j + 3 + ipsize + 2], &u);
4458 if (!is_422 && chroma_row && i > 0) {
4460 Cb[-1 - ostrides[1]] = avg_chromaf(Cb[-1], Cb[-1 - ostrides[1]]);
4461 Cr[-1 - ostrides[2]] = avg_chromaf(Cr[-1], Cr[-1 - ostrides[2]]);
4470 chroma_row = !chroma_row;
4472 rgbdata += rowstride;
4477 static void convert_bgr_to_yuv420_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
int *ostrides,
4478 uint8_t **dest,
boolean is_422,
boolean has_alpha,
int subspace,
int clamping) {
4483 uint8_t *y, *Cb, *Cr;
4486 int chroma_row =
TRUE;
4487 int ipsize = 3, ipsize2;
4489 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4491 set_conversion_arrays(clamping, subspace);
4493 if (has_alpha) ipsize = 4;
4496 hsize = (hsize >> 1) << 1;
4497 vsize = (vsize >> 1) << 1;
4503 ipsize2 = ipsize * 2;
4504 hs3 = (hsize * ipsize) - (ipsize2 - 1);
4505 for (i = 0; i < vsize; i++) {
4506 for (j = 0; j < hs3; j += ipsize2) {
4508 rgb2uyvy(rgbdata[j + 2], rgbdata[j + 1], rgbdata[j], rgbdata[j + ipsize + 2],
4509 rgbdata[j + ipsize + 1], rgbdata[j + ipsize], &u);
4516 if (!is_422 && chroma_row && i > 0) {
4518 Cb[-1 - ostrides[1]] = avg_chromaf(Cb[-1], Cb[-1 - ostrides[1]]);
4519 Cr[-1 - ostrides[2]] = avg_chromaf(Cr[-1], Cr[-1 - ostrides[2]]);
4527 chroma_row = !chroma_row;
4529 rgbdata += rowstride;
4534 static void convert_yuv422p_to_uyvy_frame(uint8_t **src,
int width,
int height,
int *irows,
int orow, uint8_t *dest) {
4536 uint8_t *src_y = src[0];
4537 uint8_t *src_u = src[1];
4538 uint8_t *src_v = src[2];
4542 irows[1] -= width >> 1;
4543 irows[2] -= width >> 1;
4546 for (i = 0; i < height; i++) {
4547 for (j = 0; j < width; j++) {
4548 *(dest++) = *(src_u++);
4549 *(dest++) = *(src_y++);
4550 *(dest++) = *(src_v++);
4551 *(dest++) = *(src_y++);
4561 static void convert_yuv422p_to_yuyv_frame(uint8_t **src,
int width,
int height,
int *irows,
int orow, uint8_t *dest) {
4564 uint8_t *src_y = src[0];
4565 uint8_t *src_u = src[1];
4566 uint8_t *src_v = src[2];
4570 irows[1] -= width >> 1;
4571 irows[2] -= width >> 1;
4574 for (i = 0; i < height; i++) {
4575 for (j = 0; j < width; j++) {
4576 *(dest++) = *(src_y++);
4577 *(dest++) = *(src_u++);
4578 *(dest++) = *(src_y++);
4579 *(dest++) = *(src_v++);
4589 static void convert_rgb_to_yuv411_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
4593 int hs3 = (int)(hsize >> 2) * 12, ipstep = 12;
4598 int x = 3, y = 4, z = 5, a = 6, b = 7, c = 8, d = 9, e = 10, f = 11;
4600 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4602 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4614 hs3 = (int)(hsize >> 2) * 16;
4617 end = rgbdata + (rowstride * vsize) + 1 - ipstep;
4618 hs3 -= (ipstep - 1);
4620 for (; rgbdata < end; rgbdata += rowstride) {
4621 for (i = 0; i < hs3; i += ipstep) {
4623 rgb2_411(rgbdata[i], rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + x], rgbdata[i + y], rgbdata[i + z], rgbdata[i + a],
4625 rgbdata[i + c], rgbdata[i + d],
4626 rgbdata[i + e], rgbdata[i + f], u++);
4632 static void convert_bgr_to_yuv411_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
4636 int hs3 = (int)(hsize >> 2) * 12, ipstep = 12;
4641 int x = 3, y = 4, z = 5, a = 6, b = 7, c = 8, d = 9, e = 10, f = 11;
4643 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4645 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4657 hs3 = (int)(hsize >> 2) * 16;
4660 end = rgbdata + (rowstride * vsize) + 1 - ipstep;
4661 hs3 -= (ipstep - 1);
4663 for (; rgbdata < end; rgbdata += rowstride) {
4664 for (i = 0; i < hs3; i += ipstep) {
4666 rgb2_411(rgbdata[i + 2], rgbdata[i + 1], rgbdata[i], rgbdata[i + z], rgbdata[i + y], rgbdata[i + x], rgbdata[i + c],
4668 rgbdata[i + a], rgbdata[i + f],
4669 rgbdata[i + e], rgbdata[i + d], u++);
4675 static void convert_argb_to_yuv411_frame(uint8_t *rgbdata,
int hsize,
int vsize,
int rowstride,
4679 int hs3 = (int)(hsize >> 2) * 12, ipstep = 12;
4684 if (LIVES_UNLIKELY(!conv_RY_inited)) init_RGB_to_YUV_tables();
4686 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4688 hs3 = (int)(hsize >> 2) * 16;
4691 end = rgbdata + (rowstride * vsize) + 1 - ipstep;
4692 hs3 -= (ipstep - 1);
4694 for (; rgbdata < end; rgbdata += rowstride) {
4695 for (i = 0; i < hs3; i += ipstep) {
4697 rgb2_411(rgbdata[i + 1], rgbdata[i + 2], rgbdata[i + 3], rgbdata[i + 5], rgbdata[i + 6], rgbdata[i + 7], rgbdata[i + 9],
4700 rgbdata[i + 13], rgbdata[i + 14], rgbdata[i + 15], u++);
4706 static void convert_uyvy_to_rgb_frame(
uyvy_macropixel *src,
int width,
int height,
int irow,
int orowstride,
4707 uint8_t *dest,
boolean add_alpha,
int clamping,
int subspace,
int thread_id) {
4710 int a = 3, b = 4, c = 5;
4712 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
4713 if (thread_id == -1)
4714 set_conversion_arrays(clamping, subspace);
4719 int dheight, xdheight;
4726 if ((dheight * i) < height) {
4727 ccparams[i].
src = src + dheight * i * irow / 4;
4728 ccparams[i].
hsize = width;
4729 ccparams[i].
dest = dest + dheight * i * orowstride;
4731 if (dheight * (i + 1) > (height - 4)) {
4732 dheight = height - (dheight * i);
4735 ccparams[i].
vsize = dheight;
4744 if (i == 0) convert_uyvy_to_rgb_frame_thread(&ccparams[i]);
4752 for (i = 1; i < nthreads; i++) {
4766 orowstride -= width * psize;
4767 irow = irow / 4 - width;
4768 for (i = 0; i < height; i++) {
4769 for (j = 0; j < width; j++) {
4770 uyvy2rgb(src, &dest[0], &dest[1], &dest[2], &dest[a], &dest[b], &dest[c]);
4771 if (add_alpha) dest[3] = dest[7] = 255;
4781 static void *convert_uyvy_to_rgb_frame_thread(
void *data) {
4791 static void convert_uyvy_to_bgr_frame(
uyvy_macropixel *src,
int width,
int height,
int irow,
int orowstride,
4792 uint8_t *dest,
boolean add_alpha,
int clamping,
int thread_id) {
4796 int a = 3, b = 4, c = 5;
4798 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
4799 if (thread_id == -1)
4800 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4805 int dheight, xdheight;
4812 if ((dheight * i) < height) {
4813 ccparams[i].
src = src + dheight * i * irow / 4;
4814 ccparams[i].
hsize = width;
4815 ccparams[i].
dest = dest + dheight * i * orowstride;
4817 if (dheight * (i + 1) > (height - 4)) {
4818 dheight = height - (dheight * i);
4821 ccparams[i].
vsize = dheight;
4829 if (i == 0) convert_uyvy_to_bgr_frame_thread(&ccparams[i]);
4837 for (i = 1; i < nthreads; i++) {
4851 orowstride -= width * psize;
4852 irow = irow / 4 - width;
4853 for (i = 0; i < height; i++) {
4854 for (j = 0; j < width; j++) {
4855 uyvy2rgb(src, &dest[2], &dest[1], &dest[0], &dest[c], &dest[b], &dest[a]);
4856 if (add_alpha) dest[3] = dest[7] = 255;
4866 static void *convert_uyvy_to_bgr_frame_thread(
void *data) {
4875 static void convert_uyvy_to_argb_frame(
uyvy_macropixel *src,
int width,
int height,
int irow,
int orowstride,
4876 uint8_t *dest,
int clamping,
int thread_id) {
4880 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
4881 if (thread_id == -1)
4882 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4887 int dheight, xdheight;
4894 if ((dheight * i) < height) {
4895 ccparams[i].
src = src + dheight * i * irow / 4;
4896 ccparams[i].
hsize = width;
4897 ccparams[i].
dest = dest + dheight * i * orowstride;
4899 if (dheight * (i + 1) > (height - 4)) {
4900 dheight = height - (dheight * i);
4903 ccparams[i].
vsize = dheight;
4910 if (i == 0) convert_uyvy_to_argb_frame_thread(&ccparams[i]);
4918 for (i = 1; i < nthreads; i++) {
4925 orowstride -= width * psize;
4926 irow = irow / 4 - width;
4927 for (i = 0; i < height; i++) {
4928 for (j = 0; j < width; j++) {
4929 uyvy2rgb(src, &dest[1], &dest[2], &dest[3], &dest[5], &dest[6], &dest[7]);
4930 dest[0] = dest[4] = 255;
4940 static void *convert_uyvy_to_argb_frame_thread(
void *data) {
4949 static void convert_yuyv_to_rgb_frame(
yuyv_macropixel *src,
int width,
int height,
int irow,
int orowstride,
4950 uint8_t *dest,
boolean add_alpha,
int clamping,
int thread_id) {
4953 int a = 3, b = 4, c = 5;
4955 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
4956 if (thread_id == -1)
4957 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
4962 int dheight, xdheight;
4969 if ((dheight * i) < height) {
4970 ccparams[i].
src = src + dheight * i * irow / 4;
4971 ccparams[i].
hsize = width;
4972 ccparams[i].
dest = dest + dheight * i * orowstride;
4974 if (dheight * (i + 1) > (height - 4)) {
4975 dheight = height - (dheight * i);
4978 ccparams[i].
vsize = dheight;
4985 if (i == 0) convert_yuyv_to_rgb_frame_thread(&ccparams[i]);
4993 for (i = 1; i < nthreads; i++) {
5007 orowstride -= width * psize;
5008 irow = irow / 4 - width;
5009 for (i = 0; i < height; i++) {
5010 for (j = 0; j < width; j++) {
5011 yuyv2rgb(src, &dest[0], &dest[1], &dest[2], &dest[a], &dest[b], &dest[c]);
5012 if (add_alpha) dest[3] = dest[7] = 255;
5022 static void *convert_yuyv_to_rgb_frame_thread(
void *data) {
5031 static void convert_yuyv_to_bgr_frame(
yuyv_macropixel *src,
int width,
int height,
int irow,
int orowstride,
5032 uint8_t *dest,
boolean add_alpha,
int clamping,
int thread_id) {
5035 int a = 3, b = 4, c = 5;
5037 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
5038 if (thread_id == -1)
5039 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5044 int dheight, xdheight;
5051 if ((dheight * i) < height) {
5052 ccparams[i].
src = src + dheight * i * irow / 4;
5053 ccparams[i].
hsize = width;
5054 ccparams[i].
dest = dest + dheight * i * orowstride;
5056 if (dheight * (i + 1) > (height - 4)) {
5057 dheight = height - (dheight * i);
5060 ccparams[i].
vsize = dheight;
5068 if (i == 0) convert_yuyv_to_bgr_frame_thread(&ccparams[i]);
5076 for (i = 1; i < nthreads; i++) {
5090 orowstride -= width * psize;
5091 irow = irow / 4 - width;
5092 for (i = 0; i < height; i++) {
5093 for (j = 0; j < width; j++) {
5094 yuyv2rgb(src, &dest[2], &dest[1], &dest[0], &dest[c], &dest[b], &dest[a]);
5095 if (add_alpha) dest[3] = dest[7] = 255;
5105 static void *convert_yuyv_to_bgr_frame_thread(
void *data) {
5114 static void convert_yuyv_to_argb_frame(
yuyv_macropixel *src,
int width,
int height,
int irow,
int orowstride,
5115 uint8_t *dest,
int clamping,
int thread_id) {
5119 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
5120 if (thread_id == -1)
5121 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5126 int dheight, xdheight;
5133 if ((dheight * i) < height) {
5134 ccparams[i].
src = src + dheight * i * irow / 4;
5135 ccparams[i].
hsize = width;
5136 ccparams[i].
dest = dest + dheight * i * orowstride;
5138 if (dheight * (i + 1) > (height - 4)) {
5139 dheight = height - (dheight * i);
5142 ccparams[i].
vsize = dheight;
5149 if (i == 0) convert_yuyv_to_argb_frame_thread(&ccparams[i]);
5157 for (i = 1; i < nthreads; i++) {
5164 orowstride -= width * psize;
5165 irow = irow / 4 - width;
5166 for (i = 0; i < height; i++) {
5167 for (j = 0; j < width; j++) {
5168 yuyv2rgb(src, &dest[1], &dest[2], &dest[3], &dest[5], &dest[6], &dest[7]);
5169 dest[0] = dest[4] = 255;
5179 static void *convert_yuyv_to_argb_frame_thread(
void *data) {
5188 static void convert_yuv420_to_uyvy_frame(uint8_t **src,
int width,
int height,
int *irows,
int orow,
5190 register int i = 0, j;
5191 uint8_t *y, *u, *v, *end;
5192 int hwidth = width >> 1;
5193 boolean chroma =
TRUE;
5196 if (!avg_inited) init_average();
5202 end = y + height * irows[0];
5203 orow = orow / 4 - hwidth;
5206 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5209 for (j = 0; j < hwidth; j++) {
5215 if (chroma && i > 0) {
5216 dest[-hwidth].
u0 = avg_chromaf(dest[-hwidth].u0, u[0]);
5217 dest[-hwidth].
v0 = avg_chromaf(dest[-hwidth].v0, v[0]);
5236 static void convert_yuv420_to_yuyv_frame(uint8_t **src,
int width,
int height,
int *irows,
int orow,
yuyv_macropixel *dest,
5238 register int i = 0, j;
5239 uint8_t *y, *u, *v, *end;
5240 int hwidth = width >> 1;
5241 boolean chroma =
TRUE;
5244 if (!avg_inited) init_average();
5250 end = y + height * irows[0];
5251 orow = orow / 4 - hwidth;
5254 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5257 for (j = 0; j < hwidth; j++) {
5263 if (chroma && i > 0) {
5264 dest[-hwidth].
u0 = avg_chromaf(dest[-hwidth].u0, u[0]);
5265 dest[-hwidth].
v0 = avg_chromaf(dest[-hwidth].v0, v[0]);
5283 static void convert_yuv_planar_to_rgb_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride, uint8_t *dest,
5284 boolean in_alpha,
boolean out_alpha,
int clamping,
int thread_id) {
5285 uint8_t *y = src[0];
5286 uint8_t *u = src[1];
5287 uint8_t *v = src[2];
5290 uint8_t *end = y + irowstride * height;
5295 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
5296 if (thread_id == -1)
5297 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5299 if (in_alpha) a = src[3];
5304 int dheight, xdheight;
5311 if ((y + dheight * i * irowstride) < end) {
5312 ccparams[i].
hsize = width;
5314 ccparams[i].
srcp[0] = y + dheight * i * irowstride;
5315 ccparams[i].
srcp[1] = u + dheight * i * irowstride;
5316 ccparams[i].
srcp[2] = v + dheight * i * irowstride;
5317 if (in_alpha) ccparams[i].
srcp[3] = a + dheight * i * irowstride;
5319 ccparams[i].
dest = dest + dheight * i * orowstride;
5321 if (dheight * (i + 1) > (height - 4)) {
5322 dheight = height - (dheight * i);
5325 ccparams[i].
vsize = dheight;
5334 if (i == 0) convert_yuv_planar_to_rgb_frame_thread(&ccparams[i]);
5342 for (i = 1; i < nthreads; i++) {
5349 if (out_alpha) opstep = 4;
5351 orowstride -= width * opstep;
5352 irowstride -= width;
5354 for (i = 0; i < height; i++) {
5355 for (j = 0; j < width; j++) {
5356 yuv2rgb(*(y++), *(u++), *(v++), &dest[0], &dest[1], &dest[2]);
5360 }
else dest[3] = 255;
5368 if (a) a += irowstride;
5373 static void *convert_yuv_planar_to_rgb_frame_thread(
void *data) {
5383 static void convert_yuv_planar_to_bgr_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride, uint8_t *dest,
5384 boolean in_alpha,
boolean out_alpha,
int clamping,
int thread_id) {
5385 uint8_t *y = src[0];
5386 uint8_t *u = src[1];
5387 uint8_t *v = src[2];
5390 uint8_t *end = y + irowstride * height;
5395 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
5396 if (thread_id == -1)
5397 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5399 if (in_alpha) a = src[3];
5404 int dheight, xdheight;
5412 if ((y + dheight * i * irowstride) < end) {
5413 ccparams[i].
hsize = width;
5415 ccparams[i].
srcp[0] = y + dheight * i * irowstride;
5416 ccparams[i].
srcp[1] = u + dheight * i * irowstride;
5417 ccparams[i].
srcp[2] = v + dheight * i * irowstride;
5418 if (in_alpha) ccparams[i].
srcp[3] = a + dheight * i * irowstride;
5420 ccparams[i].
dest = dest + dheight * i * orowstride;
5422 if (dheight * (i + 1) > (height - 4)) {
5423 dheight = height - (dheight * i);
5426 ccparams[i].
vsize = dheight;
5435 if (i == 0) convert_yuv_planar_to_bgr_frame_thread(&ccparams[i]);
5443 for (i = 1; i < nthreads; i++) {
5450 orowstride -= width * opstep;
5451 irowstride -= width;
5453 for (i = 0; i < height; i++) {
5454 for (j = 0; j < width; j++) {
5455 yuv2bgr(*(y++), *(u++), *(v++), &dest[0], &dest[1], &dest[2]);
5459 }
else dest[3] = 255;
5467 if (a) a += irowstride;
5472 static void *convert_yuv_planar_to_bgr_frame_thread(
void *data) {
5482 static void convert_yuv_planar_to_argb_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride,
5484 boolean in_alpha,
int clamping,
int thread_id) {
5485 uint8_t *y = src[0];
5486 uint8_t *u = src[1];
5487 uint8_t *v = src[2];
5490 uint8_t *end = y + irowstride * height;
5495 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
5497 if (in_alpha) a = src[3];
5502 int dheight, xdheight;
5509 if ((y + dheight * i * irowstride) < end) {
5510 ccparams[i].
hsize = width;
5512 ccparams[i].
srcp[0] = y + dheight * i * irowstride;
5513 ccparams[i].
srcp[1] = u + dheight * i * irowstride;
5514 ccparams[i].
srcp[2] = v + dheight * i * irowstride;
5515 if (in_alpha) ccparams[i].
srcp[3] = a + dheight * i * irowstride;
5517 ccparams[i].
dest = dest + dheight * i * orowstride;
5519 if (dheight * (i + 1) > (height - 4)) {
5520 dheight = height - (dheight * i);
5523 ccparams[i].
vsize = dheight;
5531 if (i == 0) convert_yuv_planar_to_argb_frame_thread(&ccparams[i]);
5539 for (i = 1; i < nthreads; i++) {
5546 orowstride -= width * opstep;
5547 orowstride -= width;
5549 for (i = 0; i < height; i++) {
5550 for (j = 0; j < width; j++) {
5551 yuv2rgb(*(y++), *(u++), *(v++), &dest[1], &dest[2], &dest[3]);
5554 }
else dest[0] = 255;
5561 if (a) a += irowstride;
5566 static void *convert_yuv_planar_to_argb_frame_thread(
void *data) {
5568 convert_yuv_planar_to_argb_frame((uint8_t **)ccparams->
srcp, ccparams->
hsize, ccparams->
vsize, ccparams->
irowstrides[0],
5575 static void convert_yuv_planar_to_uyvy_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride,
5578 int size = (width * height) >> 1;
5580 uint8_t *y = src[0];
5581 uint8_t *u = src[1];
5582 uint8_t *v = src[2];
5584 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5586 if (irowstride == width && orowstride == width << 1) {
5587 for (x = 0; x < size; x++) {
5589 uyvy->
u0 = avg_chromaf(u[0], u[1]);
5593 uyvy->
v0 = avg_chromaf(v[0], v[1]);
5600 irowstride -= width;
5601 orowstride -= width << 1;
5602 for (k = 0; k < height; k++) {
5603 for (x = 0; x < width; x++) {
5605 uyvy->
u0 = avg_chromaf(u[0], u[1]);
5609 uyvy->
v0 = avg_chromaf(v[0], v[1]);
5622 static void convert_yuv_planar_to_yuyv_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride,
5625 int hsize = (width * height) >> 1;
5627 uint8_t *y = src[0];
5628 uint8_t *u = src[1];
5629 uint8_t *v = src[2];
5631 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5633 if (irowstride == width && orowstride == (width << 1)) {
5634 for (x = 0; x < hsize; x++) {
5636 yuyv->
u0 = avg_chromaf(u[0], u[1]);
5639 yuyv->
v0 = avg_chromaf(v[0], v[1]);
5646 irowstride -= width;
5647 orowstride = orowstride / 4 - width;
5648 for (k = 0; k < height; k++) {
5649 for (x = 0; x < width; x++) {
5651 yuyv->
u0 = avg_chromaf(u[0], u[1]);
5654 yuyv->
v0 = avg_chromaf(v[0], v[1]);
5666 static void convert_combineplanes_frame(uint8_t **src,
int width,
int height,
int irowstride,
5667 int orowstride, uint8_t *dest,
boolean in_alpha,
boolean out_alpha) {
5672 int size = width * height;
5674 uint8_t *y = src[0];
5675 uint8_t *u = src[1];
5676 uint8_t *v = src[2];
5681 if (in_alpha) a = src[3];
5682 if (out_alpha) opsize = 4;
5684 if (irowstride == width && orowstride == width * opsize) {
5685 for (x = 0; x < size; x++) {
5690 if (in_alpha) *(dest++) = *(a++);
5691 else *(dest++) = 255;
5695 irowstride -= width;
5696 orowstride -= width * opsize;
5697 for (k = 0; k < height; k++) {
5698 for (x = 0; x < width; x++) {
5703 if (in_alpha) *(dest++) = *(a++);
5704 else *(dest++) = 255;
5716 static void convert_yuvap_to_yuvp_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride, uint8_t **dest) {
5717 size_t size = irowstride * height;
5719 uint8_t *ys = src[0];
5720 uint8_t *us = src[1];
5721 uint8_t *vs = src[2];
5723 uint8_t *yd = dest[0];
5724 uint8_t *ud = dest[1];
5725 uint8_t *vd = dest[2];
5729 if (orowstride == irowstride) {
5735 for (y = 0; y < height; y++) {
5755 static void convert_yuvp_to_yuvap_frame(uint8_t **src,
int width,
int height,
int irowstride,
int orowstride, uint8_t **dest) {
5756 convert_yuvap_to_yuvp_frame(src, width, height, irowstride, orowstride, dest);
5761 static void convert_yuvp_to_yuv420_frame(uint8_t **src,
int width,
int height,
int *irows,
int *orows, uint8_t **dest,
5772 uint8_t *d_u, *d_v, *s_u = src[1], *s_v = src[2];
5773 register short x_u, x_v;
5774 boolean chroma =
FALSE;
5776 int hwidth = width >> 1;
5778 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5780 if (dest[0] != src[0]) {
5781 if (irows[0] == orows[0]) {
5784 uint8_t *d_y = dest[0];
5785 uint8_t *s_y = src[0];
5786 for (i = 0; i < height; i++) {
5797 for (i = 0; i < height; i++) {
5798 for (j = 0; j < hwidth; j++) {
5802 d_u[j] = avg_chromaf(s_u[j * 2], s_u[j * 2 + 1]);
5803 d_v[j] = avg_chromaf(s_v[j * 2], s_v[j * 2 + 1]);
5807 x_u = avg_chromaf(s_u[j * 2], s_u[j * 2 + 1]);
5808 x_v = avg_chromaf(s_v[j * 2], s_v[j * 2 + 1]);
5810 d_u[j] = avg_chromaf(d_u[j], x_u);
5811 d_v[j] = avg_chromaf(d_v[j], x_v);
5825 static void convert_yuvp_to_yuv411_frame(uint8_t **src,
int width,
int height,
int irowstride,
5833 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
5834 register short x_u, x_v;
5836 int widtha = (width >> 1) << 1;
5837 int cbytes = width - widtha;
5839 irowstride -= width + cbytes;
5841 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5843 for (i = 0; i < height; i++) {
5844 for (j = 0; j < widtha; j += 4) {
5846 yuv->
u2 = avg_chromaf(s_u[0], s_u[1]);
5847 x_u = avg_chromaf(s_u[2], s_u[3]);
5848 yuv->
u2 = avg_chromaf(yuv->
u2, x_u);
5855 yuv->
v2 = avg_chromaf(s_v[0], s_v[1]);
5856 x_v = avg_chromaf(s_v[2], s_v[3]);
5857 yuv->
v2 = avg_chromaf(yuv->
v2, x_v);
5870 static void convert_uyvy_to_yuvp_frame(
uyvy_macropixel *uyvy,
int width,
int height,
int irow,
int *orow, uint8_t **dest,
5871 boolean add_alpha) {
5874 uint8_t *y = dest[0];
5875 uint8_t *u = dest[1];
5876 uint8_t *v = dest[2];
5880 for (
int k = 0; k < height; k++) {
5881 for (
int x = 0, x1 = 0; x < width; x++, x1 += 2) {
5882 u[k * orow[0] + x1] = u[k * orow[0] + x1 + 1] = uyvy[k * irow + x].
u0;
5883 y[k * orow[1] + x1] = uyvy[k * irow + x].
y0;
5884 v[k * orow[2] + x1] = v[k * orow[2] + x1 + 1] = uyvy[k * irow + x].
v0;
5885 y[k * orow[0] + x1 + 1] = uyvy[k * irow + x].
y1;
5888 if (add_alpha)
lives_memset(dest[3], 255, orow[3] * height);
5892 static void convert_yuyv_to_yuvp_frame(
yuyv_macropixel *yuyv,
int width,
int height,
int irow,
int *orow,
5893 uint8_t **dest,
boolean add_alpha) {
5896 uint8_t *y = dest[0];
5897 uint8_t *u = dest[1];
5898 uint8_t *v = dest[2];
5902 for (
int k = 0; k < height; k++) {
5903 for (
int x = 0, x1 = 0; x < width; x++, x1 += 2) {
5904 y[k * orow[1] + x1] = yuyv[k * irow + x].
y0;
5905 u[k * orow[0] + x1] = u[k * orow[0] + x1 + 1] = yuyv[k * irow + x].
u0;
5906 y[k * orow[0] + x1 + 1] = yuyv[k * irow + x].
y1;
5907 v[k * orow[2] + x1] = v[k * orow[2] + x1 + 1] = yuyv[k * irow + x].
v0;
5910 if (add_alpha)
lives_memset(dest[3], 255, orow[3] * height);
5914 static void convert_uyvy_to_yuv888_frame(
uyvy_macropixel *uyvy,
int width,
int height,
int irow,
int orow,
5915 uint8_t *yuv,
boolean add_alpha) {
5920 for (
int y = 0; y < height; y++) {
5921 for (
int x = 0, x1 = 0; x < width; x++) {
5922 yuv[y * orow + x1++] = uyvy[y * irow + x].
y0;
5923 yuv[y * orow + x1++] = uyvy[y * irow + x].
u0;
5924 yuv[y * orow + x1++] = uyvy[y * irow + x].
v0;
5925 if (add_alpha) yuv[y * orow + x1++] = 255;
5926 yuv[y * orow + x1++] = uyvy[y * irow + x].
y1;
5927 yuv[y * orow + x1++] = uyvy[y * irow + x].
u0;
5928 yuv[y * orow + x1++] = uyvy[y * irow + x].
v0;
5929 if (add_alpha) yuv[y * orow + x1++] = 255;
5935 static void convert_yuyv_to_yuv888_frame(
yuyv_macropixel *yuyv,
int width,
int height,
int irow,
int orow,
5936 uint8_t *yuv,
boolean add_alpha) {
5941 for (
int y = 0; y < height; y++) {
5942 for (
int x = 0, x1 = 0; x < width; x++) {
5943 yuv[y * orow + x1++] = yuyv[y * irow + x].
y0;
5944 yuv[y * orow + x1++] = yuyv[y * irow + x].
u0;
5945 yuv[y * orow + x1++] = yuyv[y * irow + x].
v0;
5946 if (add_alpha) yuv[y * orow + x1++] = 255;
5947 yuv[y * orow + x1++] = yuyv[y * irow + x].
y1;
5948 yuv[y * orow + x1++] = yuyv[y * irow + x].
u0;
5949 yuv[y * orow + x1++] = yuyv[y * irow + x].
v0;
5950 if (add_alpha) yuv[y * orow + x1++] = 255;
5956 static void convert_uyvy_to_yuv420_frame(
uyvy_macropixel *uyvy,
int width,
int height, uint8_t **yuv,
int clamping) {
5963 uint8_t *y = yuv[0];
5964 uint8_t *u = yuv[1];
5965 uint8_t *v = yuv[2];
5967 boolean chroma =
TRUE;
5969 uint8_t *end = y + width * height * 2;
5971 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
5974 for (j = 0; j < width; j++) {
5975 if (chroma) *(u++) = uyvy->
u0;
5977 *u = avg_chromaf(*u, uyvy->
u0);
5981 if (chroma) *(v++) = uyvy->
v0;
5983 *v = avg_chromaf(*v, uyvy->
v0);
5998 static void convert_yuyv_to_yuv420_frame(
yuyv_macropixel *yuyv,
int width,
int height, uint8_t **yuv,
int clamping) {
6005 uint8_t *y = yuv[0];
6006 uint8_t *u = yuv[1];
6007 uint8_t *v = yuv[2];
6009 boolean chroma =
TRUE;
6011 uint8_t *end = y + width * height * 2;
6013 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6016 for (j = 0; j < width; j++) {
6018 if (chroma) *(u++) = yuyv->
u0;
6020 *u = avg_chromaf(*u, yuyv->
u0);
6024 if (chroma) *(v++) = yuyv->
v0;
6026 *v = avg_chromaf(*v, yuyv->
v0);
6046 int widtha = (width << 1) >> 1;
6047 size_t cbytes = width - widtha;
6049 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6051 for (; uyvy < end; uyvy += cbytes) {
6052 for (x = 0; x < widtha; x += 2) {
6053 yuv->
u2 = avg_chromaf(uyvy[0].u0, uyvy[1].u0);
6055 yuv->
y0 = uyvy[0].
y0;
6056 yuv->
y1 = uyvy[0].
y1;
6058 yuv->
v2 = avg_chromaf(uyvy[0].v0, uyvy[1].v0);
6060 yuv->
y2 = uyvy[1].
y0;
6061 yuv->
y3 = uyvy[1].
y1;
6078 int widtha = (width << 1) >> 1;
6079 size_t cybtes = width - widtha;
6081 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6083 for (; yuyv < end; yuyv += cybtes) {
6084 for (x = 0; x < widtha; x += 2) {
6085 yuv->
u2 = avg_chromaf(yuyv[0].u0, yuyv[1].u0);
6087 yuv->
y0 = yuyv[0].
y0;
6088 yuv->
y1 = yuyv[0].
y1;
6090 yuv->
v2 = avg_chromaf(yuyv[0].v0, yuyv[1].v0);
6092 yuv->
y2 = yuyv[1].
y0;
6093 yuv->
y3 = yuyv[1].
y1;
6102 static void convert_yuv888_to_yuv420_frame(uint8_t *yuv8,
int width,
int height,
int irowstride,
int *orows,
6103 uint8_t **yuv4,
boolean src_alpha,
int clamping) {
6115 register short x_u, x_v;
6117 uint8_t *d_y, *d_u, *d_v, *end;
6119 boolean chroma =
TRUE;
6121 size_t ipsize = 3, ipsize2;
6124 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6126 if (src_alpha) ipsize = 4;
6132 end = d_y + width * height;
6133 ipsize2 = ipsize * 2;
6134 widthx = width * ipsize;
6137 for (j = 0; j < widthx; j += ipsize2) {
6139 *(d_y++) = yuv8[j + ipsize];
6141 *(d_u++) = avg_chromaf(yuv8[j + 1], yuv8[j + 1 + ipsize]);
6142 *(d_v++) = avg_chromaf(yuv8[j + 2], yuv8[j + 2 + ipsize]);
6144 x_u = avg_chromaf(yuv8[j + 1], yuv8[j + 1 + ipsize]);
6145 *d_u = avg_chromaf(*d_u, x_u);
6147 x_v = avg_chromaf(yuv8[j + 2], yuv8[j + 2 + ipsize]);
6148 *d_v = avg_chromaf(*d_v, x_v);
6162 static void convert_uyvy_to_yuv422_frame(
uyvy_macropixel *uyvy,
int width,
int height, uint8_t **yuv) {
6163 int size = width * height;
6165 uint8_t *y = yuv[0];
6166 uint8_t *u = yuv[1];
6167 uint8_t *v = yuv[2];
6171 for (x = 0; x < size; x++) {
6172 uyvy_2_yuv422(uyvy, y, u, v, y + 1);
6180 static void convert_yuyv_to_yuv422_frame(
yuyv_macropixel *yuyv,
int width,
int height, uint8_t **yuv) {
6181 int size = width * height;
6183 uint8_t *y = yuv[0];
6184 uint8_t *u = yuv[1];
6185 uint8_t *v = yuv[2];
6189 for (x = 0; x < size; x++) {
6190 yuyv_2_yuv422(yuyv, y, u, v, y + 1);
6198 static void convert_yuv888_to_yuv422_frame(uint8_t *yuv8,
int width,
int height,
int irowstride,
int *ostrides,
6199 uint8_t **yuv4,
boolean has_alpha,
int clamping) {
6204 int size = width * height;
6206 uint8_t *y = yuv4[0];
6207 uint8_t *u = yuv4[1];
6208 uint8_t *v = yuv4[2];
6210 register int x, i, j;
6215 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6217 if (has_alpha) offs = 1;
6219 ipsize = (3 + offs) << 1;
6221 if ((irowstride << 1) == width * ipsize && ostrides[0] == width && ostrides[1] == (width >> 1)) {
6222 for (x = 0; x < size; x += 2) {
6224 *(y++) = yuv8[3 + offs];
6225 *(u++) = avg_chromaf(yuv8[1], yuv8[4 + offs]);
6226 *(v++) = avg_chromaf(yuv8[2], yuv8[5 + offs]);
6231 irowstride -= width * ipsize;
6232 ostrides[0] -= width;
6233 ostrides[1] -= width >> 1;
6234 ostrides[2] -= width >> 1;
6236 for (i = 0; i < height; i++) {
6237 for (j = 0; j < width; j++) {
6239 *(y++) = yuv8[3 + offs];
6240 *(u++) = avg_chromaf(yuv8[1], yuv8[4 + offs]);
6241 *(v++) = avg_chromaf(yuv8[2], yuv8[5 + offs]);
6253 static void convert_yuv888_to_uyvy_frame(uint8_t *yuv,
int width,
int height,
int irowstride,
int orow,
6255 int size = width * height;
6257 register int x, i, j;
6262 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6264 if (has_alpha) offs = 1;
6266 ipsize = (3 + offs) << 1;
6268 if ((irowstride << 1) == width * ipsize && (width << 1) == orow) {
6269 for (x = 0; x < size; x += 2) {
6270 uyvy->
u0 = avg_chromaf(yuv[1], yuv[4 + offs]);
6272 uyvy->
v0 = avg_chromaf(yuv[2], yuv[5 + offs]);
6273 uyvy->
y1 = yuv[3 + offs];
6280 irowstride -= width * ipsize;
6281 for (i = 0; i < height; i++) {
6282 for (j = 0; j < width; j++) {
6283 uyvy->
u0 = avg_chromaf(yuv[1], yuv[4 + offs]);
6285 uyvy->
v0 = avg_chromaf(yuv[2], yuv[5 + offs]);
6286 uyvy->
y1 = yuv[3 + offs];
6297 static void convert_yuv888_to_yuyv_frame(uint8_t *yuv,
int width,
int height,
int irowstride,
int orow,
6299 int size = width * height;
6301 register int x, i, j;
6306 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6308 if (has_alpha) offs = 1;
6310 ipsize = (3 + offs) << 1;
6312 if (irowstride << 1 == width * ipsize && (width << 1) == orow) {
6313 for (x = 0; x < size; x += 2) {
6315 yuyv->
u0 = avg_chromaf(yuv[1], yuv[4 + offs]);
6316 yuyv->
y1 = yuv[3 + offs];
6317 yuyv->
v0 = avg_chromaf(yuv[2], yuv[5 + offs]);
6324 irowstride -= width * ipsize;
6325 for (i = 0; i < height; i++) {
6326 for (j = 0; j < width; j++) {
6328 yuyv->
u0 = avg_chromaf(yuv[1], yuv[4 + offs]);
6329 yuyv->
y1 = yuv[3 + offs];
6330 yuyv->
v0 = avg_chromaf(yuv[2], yuv[5 + offs]);
6341 static void convert_yuv888_to_yuv411_frame(uint8_t *yuv8,
int width,
int height,
int irowstride,
6347 uint8_t *end = yuv8 + width * height;
6350 int widtha = (width >> 1) << 1;
6351 int cbytes = width - widtha;
6353 if (has_alpha) ipsize = 4;
6355 irowstride -= widtha * ipsize;
6357 for (; yuv8 < end; yuv8 += cbytes) {
6358 for (x = 0; x < widtha; x += 4) {
6359 yuv411->
u2 = (yuv8[1] + yuv8[ipsize + 1] + yuv8[2 * ipsize + 1] + yuv8[3 * ipsize + 1]) >> 2;
6360 yuv411->
y0 = yuv8[0];
6361 yuv411->
y1 = yuv8[ipsize];
6362 yuv411->
v2 = (yuv8[2] + yuv8[ipsize + 2] + yuv8[2 * ipsize + 2] + yuv8[3 * ipsize + 2]) >> 2;
6363 yuv411->
y2 = yuv8[ipsize * 2];
6364 yuv411->
y3 = yuv8[ipsize * 3];
6374 static void convert_yuv411_to_rgb_frame(
yuv411_macropixel *yuv411,
int width,
int height,
int orowstride,
6375 uint8_t *dest,
boolean add_alpha,
int clamping) {
6377 int m = 3, n = 4, o = 5;
6378 uint8_t u, v, h_u, h_v, q_u, q_v, y0, y1;
6381 size_t psize = 3, psize2;
6383 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
6385 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6394 orowstride -= width * 4 * psize;
6395 psize2 = psize << 1;
6397 while (yuv411 < end) {
6399 if (add_alpha) dest[3] = dest[7] = 255;
6401 uyvy.
y0 = yuv411[0].
y0;
6402 uyvy.
y1 = yuv411[0].
y1;
6403 uyvy.
u0 = yuv411[0].
u2;
6404 uyvy.
v0 = yuv411[0].
v2;
6405 uyvy2rgb(&uyvy, &dest[0], &(dest[1]), &dest[2], &dest[m], &dest[n], &dest[o]);
6408 for (j = 1; j < width; j++) {
6413 y0 = yuv411[j - 1].
y2;
6414 y1 = yuv411[j - 1].
y3;
6416 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6417 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6423 q_u = avg_chromaf(h_u, yuv411[j - 1].u2);
6424 q_v = avg_chromaf(h_v, yuv411[j - 1].v2);
6428 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6429 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6431 yuv2rgb(y0, u, v, &dest[0], &dest[1], &dest[2]);
6433 u = avg_chromaf(q_u, yuv411[j].u2);
6434 v = avg_chromaf(q_v, yuv411[j].v2);
6436 yuv2rgb(y1, u, v, &dest[m], &dest[n], &dest[o]);
6447 q_u = avg_chromaf(h_u, yuv411[j].u2);
6448 q_v = avg_chromaf(h_v, yuv411[j].v2);
6452 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6453 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6455 yuv2rgb(y0, u, v, &dest[0], &dest[1], &dest[2]);
6457 u = avg_chromaf(q_u, yuv411[j].u2);
6458 v = avg_chromaf(q_v, yuv411[j].v2);
6460 yuv2rgb(y1, u, v, &dest[m], &dest[n], &dest[o]);
6462 if (add_alpha) dest[3] = dest[7] = 255;
6468 if (add_alpha) dest[3] = dest[7] = 255;
6470 uyvy.
y0 = yuv411[j - 1].
y2;
6471 uyvy.
y1 = yuv411[j - 1].
y3;
6472 uyvy.
u0 = yuv411[j - 1].
u2;
6473 uyvy.
v0 = yuv411[j - 1].
v2;
6474 uyvy2rgb(&uyvy, &dest[0], &(dest[1]), &dest[2], &dest[m], &dest[n], &dest[o]);
6476 dest += psize2 + orowstride;
6482 static void convert_yuv411_to_bgr_frame(
yuv411_macropixel *yuv411,
int width,
int height,
int orowstride,
6483 uint8_t *dest,
boolean add_alpha,
int clamping) {
6485 int m = 3, n = 4, o = 5;
6486 uint8_t u, v, h_u, h_v, q_u, q_v, y0, y1;
6489 size_t psize = 3, psize2;
6491 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
6493 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6502 orowstride -= width * 4 * psize;
6504 psize2 = psize << 1;
6506 while (yuv411 < end) {
6508 if (add_alpha) dest[3] = dest[7] = 255;
6510 uyvy.
y0 = yuv411[0].
y0;
6511 uyvy.
y1 = yuv411[0].
y1;
6512 uyvy.
u0 = yuv411[0].
u2;
6513 uyvy.
v0 = yuv411[0].
v2;
6514 uyvy2rgb(&uyvy, &dest[0], &(dest[1]), &dest[2], &dest[o], &dest[n], &dest[m]);
6517 for (j = 1; j < width; j++) {
6522 y0 = yuv411[j - 1].
y2;
6523 y1 = yuv411[j - 1].
y3;
6525 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6526 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6532 q_u = avg_chromaf(h_u, yuv411[j - 1].u2);
6533 q_v = avg_chromaf(h_v, yuv411[j - 1].v2);
6537 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6538 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6540 yuv2bgr(y0, u, v, &dest[0], &dest[1], &dest[2]);
6542 u = avg_chromaf(q_u, yuv411[j].u2);
6543 v = avg_chromaf(q_v, yuv411[j].v2);
6545 yuv2bgr(y1, u, v, &dest[m], &dest[n], &dest[o]);
6556 q_u = avg_chromaf(h_u, yuv411[j].u2);
6557 q_v = avg_chromaf(h_v, yuv411[j].v2);
6561 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6562 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6564 yuv2bgr(y0, u, v, &dest[0], &dest[1], &dest[2]);
6566 u = avg_chromaf(q_u, yuv411[j].u2);
6567 v = avg_chromaf(q_v, yuv411[j].v2);
6569 yuv2bgr(y1, u, v, &dest[m], &dest[n], &dest[o]);
6571 if (add_alpha) dest[3] = dest[7] = 255;
6577 if (add_alpha) dest[3] = dest[7] = 255;
6579 uyvy.
y0 = yuv411[j - 1].
y2;
6580 uyvy.
y1 = yuv411[j - 1].
y3;
6581 uyvy.
u0 = yuv411[j - 1].
u2;
6582 uyvy.
v0 = yuv411[j - 1].
v2;
6583 uyvy2rgb(&uyvy, &dest[0], &(dest[1]), &dest[2], &dest[m], &dest[n], &dest[o]);
6585 dest += psize2 + orowstride;
6591 static void convert_yuv411_to_argb_frame(
yuv411_macropixel *yuv411,
int width,
int height,
int orowstride,
6592 uint8_t *dest,
int clamping) {
6594 uint8_t u, v, h_u, h_v, q_u, q_v, y0, y1;
6597 size_t psize = 4, psize2;
6599 if (LIVES_UNLIKELY(!conv_YR_inited)) init_YUV_to_RGB_tables();
6601 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6603 orowstride -= width * 4 * psize;
6604 psize2 = psize << 1;
6606 while (yuv411 < end) {
6608 dest[0] = dest[4] = 255;
6610 uyvy.
y0 = yuv411[0].
y0;
6611 uyvy.
y1 = yuv411[0].
y1;
6612 uyvy.
u0 = yuv411[0].
u2;
6613 uyvy.
v0 = yuv411[0].
v2;
6614 uyvy2rgb(&uyvy, &dest[1], &(dest[2]), &dest[3], &dest[5], &dest[6], &dest[7]);
6617 for (j = 1; j < width; j++) {
6622 y0 = yuv411[j - 1].
y2;
6623 y1 = yuv411[j - 1].
y3;
6625 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6626 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6632 q_u = avg_chromaf(h_u, yuv411[j - 1].u2);
6633 q_v = avg_chromaf(h_v, yuv411[j - 1].v2);
6637 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6638 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6640 yuv2rgb(y0, u, v, &dest[1], &dest[2], &dest[3]);
6642 u = avg_chromaf(q_u, yuv411[j].u2);
6643 v = avg_chromaf(q_v, yuv411[j].v2);
6645 yuv2rgb(y1, u, v, &dest[5], &dest[6], &dest[7]);
6656 q_u = avg_chromaf(h_u, yuv411[j].u2);
6657 q_v = avg_chromaf(h_v, yuv411[j].v2);
6661 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6662 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6664 yuv2rgb(y0, u, v, &dest[1], &dest[2], &dest[3]);
6666 u = avg_chromaf(q_u, yuv411[j].u2);
6667 v = avg_chromaf(q_v, yuv411[j].v2);
6669 yuv2rgb(y1, u, v, &dest[5], &dest[6], &dest[7]);
6671 dest[0] = dest[4] = 255;
6677 dest[0] = dest[4] = 255;
6679 uyvy.
y0 = yuv411[j - 1].
y2;
6680 uyvy.
y1 = yuv411[j - 1].
y3;
6681 uyvy.
u0 = yuv411[j - 1].
u2;
6682 uyvy.
v0 = yuv411[j - 1].
v2;
6683 uyvy2rgb(&uyvy, &dest[1], &(dest[2]), &dest[3], &dest[5], &dest[6], &dest[7]);
6685 dest += psize2 + orowstride;
6691 static void convert_yuv411_to_yuv888_frame(
yuv411_macropixel *yuv411,
int width,
int height,
6692 uint8_t *dest,
boolean add_alpha,
int clamping) {
6696 uint8_t u, v, h_u, h_v, q_u, q_v, y0, y1;
6698 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6700 if (add_alpha) psize = 4;
6702 while (yuv411 < end) {
6704 if (add_alpha) dest[3] = dest[7] = 255;
6707 dest[0] = yuv411[0].
y0;
6708 dest[1] = yuv411[0].
u2;
6709 dest[2] = yuv411[0].
v2;
6712 dest[0] = yuv411[0].
y1;
6713 dest[1] = yuv411[0].
u2;
6714 dest[2] = yuv411[0].
v2;
6717 for (j = 1; j < width; j++) {
6722 y0 = yuv411[j - 1].
y2;
6723 y1 = yuv411[j - 1].
y3;
6725 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6726 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6732 q_u = avg_chromaf(h_u, yuv411[j - 1].u2);
6733 q_v = avg_chromaf(h_v, yuv411[j - 1].v2);
6737 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6738 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6743 if (add_alpha) dest[3] = 255;
6747 u = avg_chromaf(q_u, yuv411[j].u2);
6748 v = avg_chromaf(q_v, yuv411[j].v2);
6753 if (add_alpha) dest[3] = 255;
6764 q_u = avg_chromaf(h_u, yuv411[j].u2);
6765 q_v = avg_chromaf(h_v, yuv411[j].v2);
6769 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6770 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6776 if (add_alpha) dest[3] = 255;
6779 u = avg_chromaf(q_u, yuv411[j].u2);
6780 v = avg_chromaf(q_v, yuv411[j].v2);
6786 if (add_alpha) dest[3] = 255;
6791 if (add_alpha) dest[3] = dest[7] = 255;
6793 dest[0] = yuv411[j - 1].
y2;
6794 dest[1] = yuv411[j - 1].
u2;
6795 dest[2] = yuv411[j - 1].
v2;
6798 dest[0] = yuv411[j - 1].
y3;
6799 dest[1] = yuv411[j - 1].
u2;
6800 dest[2] = yuv411[j - 1].
v2;
6808 static void convert_yuv411_to_yuvp_frame(
yuv411_macropixel *yuv411,
int width,
int height, uint8_t **dest,
6809 boolean add_alpha,
int clamping) {
6812 uint8_t u, v, h_u, h_v, q_u, q_v, y0;
6814 uint8_t *d_y = dest[0];
6815 uint8_t *d_u = dest[1];
6816 uint8_t *d_v = dest[2];
6817 uint8_t *d_a = dest[3];
6819 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6821 while (yuv411 < end) {
6823 *(d_y++) = yuv411[0].y0;
6824 *(d_u++) = yuv411[0].u2;
6825 *(d_v++) = yuv411[0].v2;
6826 if (add_alpha) *(d_a++) = 255;
6828 *(d_y++) = yuv411[0].y0;
6829 *(d_u++) = yuv411[0].u2;
6830 *(d_v++) = yuv411[0].v2;
6831 if (add_alpha) *(d_a++) = 255;
6833 for (j = 1; j < width; j++) {
6838 y0 = yuv411[j - 1].
y2;
6840 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6841 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6847 q_u = avg_chromaf(h_u, yuv411[j - 1].u2);
6848 q_v = avg_chromaf(h_v, yuv411[j - 1].v2);
6852 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6853 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6858 if (add_alpha) *(d_a++) = 255;
6860 u = avg_chromaf(q_u, yuv411[j].u2);
6861 v = avg_chromaf(q_v, yuv411[j].v2);
6866 if (add_alpha) *(d_a++) = 255;
6874 q_u = avg_chromaf(h_u, yuv411[j].u2);
6875 q_v = avg_chromaf(h_v, yuv411[j].v2);
6879 u = avg_chromaf(q_u, yuv411[j - 1].u2);
6880 v = avg_chromaf(q_v, yuv411[j - 1].v2);
6885 if (add_alpha) *(d_a++) = 255;
6887 u = avg_chromaf(q_u, yuv411[j].u2);
6888 v = avg_chromaf(q_v, yuv411[j].v2);
6893 if (add_alpha) *(d_a++) = 255;
6896 *(d_y++) = yuv411[j - 1].y2;
6897 *(d_u++) = yuv411[j - 1].u2;
6898 *(d_v++) = yuv411[j - 1].v2;
6899 if (add_alpha) *(d_a++) = 255;
6901 *(d_y++) = yuv411[j - 1].y3;
6902 *(d_u++) = yuv411[j - 1].u2;
6903 *(d_v++) = yuv411[j - 1].v2;
6904 if (add_alpha) *(d_a++) = 255;
6911 static void convert_yuv411_to_uyvy_frame(
yuv411_macropixel *yuv411,
int width,
int height,
6915 uint8_t u, v, h_u, h_v, y0;
6917 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6919 while (yuv411 < end) {
6921 uyvy->
u0 = yuv411->
u2;
6922 uyvy->
y0 = yuv411->
y0;
6923 uyvy->
v0 = yuv411->
v2;
6924 uyvy->
y1 = yuv411->
y1;
6928 for (j = 1; j < width; j++) {
6933 y0 = yuv411[j - 1].
y2;
6935 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
6936 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
6942 u = avg_chromaf(h_u, yuv411[j - 1].u2);
6943 v = avg_chromaf(h_v, yuv411[j - 1].v2);
6954 u = avg_chromaf(h_u, yuv411[j].u2);
6955 v = avg_chromaf(h_v, yuv411[j].v2);
6969 uyvy->
u0 = yuv411[j - 1].
u2;
6970 uyvy->
y0 = yuv411[j - 1].
y2;
6971 uyvy->
v0 = yuv411[j - 1].
v2;
6972 uyvy->
y1 = yuv411[j - 1].
y3;
6985 uint8_t u, v, h_u, h_v, y0;
6987 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
6989 while (yuv411 < end) {
6991 yuyv->
y0 = yuv411->
y0;
6992 yuyv->
u0 = yuv411->
u2;
6993 yuyv->
y1 = yuv411->
y1;
6994 yuyv->
v0 = yuv411->
v2;
6998 for (j = 1; j < width; j++) {
7003 y0 = yuv411[j - 1].
y2;
7005 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
7006 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
7012 u = avg_chromaf(h_u, yuv411[j - 1].u2);
7013 v = avg_chromaf(h_v, yuv411[j - 1].v2);
7024 u = avg_chromaf(h_u, yuv411[j].u2);
7025 v = avg_chromaf(h_v, yuv411[j].v2);
7039 yuyv->
y0 = yuv411[j - 1].
y2;
7040 yuyv->
u0 = yuv411[j - 1].
u2;
7041 yuyv->
y1 = yuv411[j - 1].
y3;
7042 yuyv->
v0 = yuv411[j - 1].
v2;
7051 static void convert_yuv411_to_yuv422_frame(
yuv411_macropixel *yuv411,
int width,
int height, uint8_t **dest,
int clamping) {
7056 uint8_t *d_y = dest[0];
7057 uint8_t *d_u = dest[1];
7058 uint8_t *d_v = dest[2];
7060 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
7062 while (yuv411 < end) {
7064 *(d_y++) = yuv411->
y0;
7065 *(d_y++) = yuv411->
y1;
7066 *(d_u++) = yuv411->
u2;
7067 *(d_v++) = yuv411->
v2;
7069 for (j = 1; j < width; j++) {
7074 *(d_y++) = yuv411[j - 1].y2;
7075 *(d_y++) = yuv411[j - 1].y3;
7077 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
7078 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
7084 *(d_u++) = avg_chromaf(h_u, yuv411[j - 1].u2);
7085 *(d_v++) = avg_chromaf(h_v, yuv411[j - 1].v2);
7089 *(d_y++) = yuv411[j].y0;
7090 *(d_y++) = yuv411[j].y1;
7092 *(d_u++) = avg_chromaf(h_u, yuv411[j].u2);
7093 *(d_v++) = avg_chromaf(h_v, yuv411[j].v2);
7097 *(d_y++) = yuv411[j - 1].y2;
7098 *(d_y++) = yuv411[j - 1].y3;
7099 *(d_u++) = yuv411[j - 1].u2;
7100 *(d_v++) = yuv411[j - 1].v2;
7107 static void convert_yuv411_to_yuv420_frame(
yuv411_macropixel *yuv411,
int width,
int height, uint8_t **dest,
7108 boolean is_yvu,
int clamping) {
7111 uint8_t h_u, h_v, u, v;
7113 uint8_t *d_y = dest[0];
7117 boolean chroma =
FALSE;
7119 size_t width2 = width << 1;
7129 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
7131 while (yuv411 < end) {
7133 *(d_y++) = yuv411->
y0;
7134 *(d_y++) = yuv411->
y1;
7143 *d_u = avg_chromaf(*d_u, u);
7144 *d_v = avg_chromaf(*d_v, v);
7147 for (j = 1; j < width; j++) {
7152 *(d_y++) = yuv411[j - 1].y2;
7153 *(d_y++) = yuv411[j - 1].y3;
7155 h_u = avg_chromaf(yuv411[j - 1].u2, yuv411[j].u2);
7156 h_v = avg_chromaf(yuv411[j - 1].v2, yuv411[j].v2);
7162 u = avg_chromaf(h_u, yuv411[j - 1].u2);
7163 v = avg_chromaf(h_v, yuv411[j - 1].v2);
7169 *d_u = avg_chromaf(*d_u, u);
7170 *d_v = avg_chromaf(*d_v, v);
7175 *(d_y++) = yuv411[j].y0;
7176 *(d_y++) = yuv411[j].y1;
7178 u = avg_chromaf(h_u, yuv411[j].u2);
7179 v = avg_chromaf(h_v, yuv411[j].v2);
7185 *d_u = avg_chromaf(*d_u, u);
7186 *d_v = avg_chromaf(*d_v, v);
7192 *(d_y++) = yuv411[j - 1].y2;
7193 *(d_y++) = yuv411[j - 1].y3;
7195 u = yuv411[j - 1].
u2;
7196 v = yuv411[j - 1].
v2;
7206 *d_u = avg_chromaf(*d_u, u);
7207 *d_v = avg_chromaf(*d_v, v);
7216 static void convert_yuv420_to_yuv411_frame(uint8_t **src,
int hsize,
int vsize,
yuv411_macropixel *dest,
7217 boolean is_422,
int clamping) {
7220 register int i = 0, j;
7221 uint8_t *y, *u, *v, *end;
7222 boolean chroma =
TRUE;
7224 size_t qwidth, hwidth;
7227 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
7233 end = y + hsize * vsize;
7235 hwidth = hsize >> 1;
7236 qwidth = hwidth >> 1;
7239 for (j = 0; j < qwidth; j++) {
7240 dest->
u2 = avg_chromaf(u[0], u[1]);
7243 dest->
v2 = avg_chromaf(v[0], v[1]);
7247 if (!is_422 && chroma && i > 0) {
7248 dest[-qwidth].
u2 = avg_chromaf(dest[-qwidth].u2, dest->
u2);
7249 dest[-qwidth].
v2 = avg_chromaf(dest[-qwidth].v2, dest->
v2);
7257 if (!chroma && !is_422) {
7266 static void convert_splitplanes_frame(uint8_t *src,
int width,
int height,
int irowstride,
int *orowstrides,
7267 uint8_t **dest,
boolean src_alpha,
boolean dest_alpha) {
7270 size_t size = width * height;
7273 uint8_t *y = dest[0];
7274 uint8_t *u = dest[1];
7275 uint8_t *v = dest[2];
7276 uint8_t *a = dest_alpha ? dest[3] : NULL;
7282 if (src_alpha) ipsize = 4;
7284 if (irowstride == ipsize * width && irowstride == orowstrides[0] && irowstride == orowstrides[1]
7285 && irowstride == orowstrides[2] && (!dest_alpha || irowstride == orowstrides[3])) {
7286 for (end = src + size * ipsize; src < end;) {
7291 if (src_alpha) *(a++) = *(src++);
7296 orowstrides[0] -= width;
7297 orowstrides[1] -= width;
7298 orowstrides[2] -= width;
7300 irowstride -= width;
7301 if (dest_alpha) orowstrides[3] -= width;
7302 for (i = 0; i < height; i++) {
7303 for (j = 0; j < width; j += ipsize) {
7308 if (src_alpha) *(a++) = *(src++);
7312 y += orowstrides[0];
7313 u += orowstrides[1];
7314 v += orowstrides[2];
7316 a += orowstrides[3];
7327 static void convert_swap3_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7328 uint8_t *dest, uint8_t *gamma_lut,
int thread_id) {
7330 uint8_t *end = src + height * irowstride;
7336 int dheight, xdheight;
7343 if ((src + dheight * i * irowstride) < end) {
7344 ccparams[i].
src = src + dheight * i * irowstride;
7345 ccparams[i].
hsize = width;
7346 ccparams[i].
dest = dest + dheight * i * orowstride;
7348 if (dheight * (i + 1) > (height - 4)) {
7349 dheight = height - (dheight * i);
7352 ccparams[i].
vsize = dheight;
7356 ccparams[i].
lut = gamma_lut;
7359 if (i == 0) convert_swap3_frame_thread(&ccparams[i]);
7367 for (i = 1; i < nthreads; i++) {
7371 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
7377 int width3 = width * 3;
7378 orowstride -= width3;
7379 for (; src < end; src += irowstride) {
7380 for (i = 0; i < width3; i += 3) {
7383 dest[0] = src[i + 2];
7386 dest[0] = gamma_lut[src[i + 2]];
7387 dest[1] = gamma_lut[src[i + 1]];
7388 dest[2] = gamma_lut[tmp];
7397 if ((irowstride == width * 3) && (orowstride == irowstride)) {
7401 oil_rgb2bgr(dest, src, width * height);
7405 for (; src < end; src += 3) {
7411 *(dest++) = gamma_lut[src[2]];
7412 *(dest++) = gamma_lut[src[1]];
7413 *(dest++) = gamma_lut[src[0]];
7417 int width3 = width * 3;
7418 orowstride -= width3;
7419 for (; src < end; src += irowstride) {
7420 for (i = 0; i < width3; i += 3) {
7422 *(dest++) = src[i + 2];
7423 *(dest++) = src[i + 1];
7426 *(dest++) = gamma_lut[src[2]];
7427 *(dest++) = gamma_lut[src[1]];
7428 *(dest++) = gamma_lut[src[0]];
7437 static void *convert_swap3_frame_thread(
void *data) {
7445 static void convert_swap4_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7446 uint8_t *dest,
int thread_id) {
7448 uint8_t *end = src + height * irowstride;
7454 int dheight, xdheight;
7461 if ((src + dheight * i * irowstride) < end) {
7462 ccparams[i].
src = src + dheight * i * irowstride;
7463 ccparams[i].
hsize = width;
7464 ccparams[i].
dest = dest + dheight * i * orowstride;
7466 if ((height - dheight * i) < dheight) dheight = height - (dheight * i);
7468 ccparams[i].
vsize = dheight;
7474 if (i == 0) convert_swap4_frame_thread(&ccparams[i]);
7482 for (i = 1; i < nthreads; i++) {
7491 int width4 = width * 4;
7492 orowstride -= width4;
7493 for (; src < end; src += irowstride) {
7494 for (i = 0; i < width4; i += 4) {
7495 tmp[0] = src[i + 3];
7496 tmp[1] = src[i + 2];
7497 tmp[2] = src[i + 1];
7507 if ((irowstride == width * 4) && (orowstride == irowstride)) {
7509 for (; src < end; src += 4) {
7516 int width4 = width * 4;
7517 orowstride -= width4;
7518 for (; src < end; src += irowstride) {
7519 for (i = 0; i < width4; i += 4) {
7520 *(dest++) = src[i + 3];
7521 *(dest++) = src[i + 2];
7522 *(dest++) = src[i + 1];
7531 static void *convert_swap4_frame_thread(
void *data) {
7539 static void convert_swap3addpost_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7540 uint8_t *dest,
int thread_id) {
7542 uint8_t *end = src + height * irowstride;
7548 int dheight, xdheight;
7555 if ((src + dheight * i * irowstride) < end) {
7556 ccparams[i].
src = src + dheight * i * irowstride;
7557 ccparams[i].
hsize = width;
7558 ccparams[i].
dest = dest + dheight * i * orowstride;
7560 if (dheight * (i + 1) > (height - 4)) {
7561 dheight = height - (dheight * i);
7564 ccparams[i].
vsize = dheight;
7570 if (i == 0) convert_swap3addpost_frame_thread(&ccparams[i]);
7578 for (i = 1; i < nthreads; i++) {
7585 if ((irowstride == width * 3) && (orowstride == width * 4)) {
7587 for (; src < end; src += 3) {
7594 int width3 = width * 3;
7595 orowstride -= width * 4;
7596 for (; src < end; src += irowstride) {
7597 for (i = 0; i < width3; i += 3) {
7598 *(dest++) = src[i + 2];
7599 *(dest++) = src[i + 1];
7609 static void *convert_swap3addpost_frame_thread(
void *data) {
7617 static void convert_swap3addpre_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7618 uint8_t *dest,
int thread_id) {
7620 uint8_t *end = src + height * irowstride;
7626 int dheight, xdheight;
7633 if ((src + dheight * i * irowstride) < end) {
7634 ccparams[i].
src = src + dheight * i * irowstride;
7635 ccparams[i].
hsize = width;
7636 ccparams[i].
dest = dest + dheight * i * orowstride;
7638 if (dheight * (i + 1) > (height - 4)) {
7639 dheight = height - (dheight * i);
7642 ccparams[i].
vsize = dheight;
7648 if (i == 0) convert_swap3addpre_frame_thread(&ccparams[i]);
7656 for (i = 1; i < nthreads; i++) {
7662 if ((irowstride == width * 3) && (orowstride == width * 4)) {
7664 for (; src < end; src += 3) {
7671 int width3 = width * 3;
7672 orowstride -= width * 4;
7673 for (; src < end; src += irowstride) {
7674 for (i = 0; i < width3; i += 3) {
7676 *(dest++) = src[i + 2];
7677 *(dest++) = src[i + 1];
7686 static void *convert_swap3addpre_frame_thread(
void *data) {
7694 static void convert_swap3postalpha_frame(uint8_t *src,
int width,
int height,
int rowstride,
7697 uint8_t *end = src + height * rowstride, tmp;
7703 int dheight, xdheight;
7710 if ((src + dheight * i * rowstride) < end) {
7711 ccparams[i].
src = src + dheight * i * rowstride;
7712 ccparams[i].
hsize = width;
7714 if (dheight * (i + 1) > (height - 4)) {
7715 dheight = height - (dheight * i);
7718 ccparams[i].
vsize = dheight;
7723 if (i == 0) convert_swap3postalpha_frame_thread(&ccparams[i]);
7731 for (i = 1; i < nthreads; i++) {
7738 rowstride -= width << 2;
7739 for (; src < end; src += rowstride) {
7740 for (i = 0; i < width; i++) {
7750 static void *convert_swap3postalpha_frame_thread(
void *data) {
7757 #ifdef WEED_ADVANCED_PALETTES
7758 static void convert_swap3prealpha_frame(uint8_t *src,
int width,
int height,
int rowstride,
7761 uint8_t *end = src + height * rowstride, tmp;
7767 int dheight, xdheight;
7774 if ((src + dheight * i * rowstride) < end) {
7775 ccparams[i].
src = src + dheight * i * rowstride;
7776 ccparams[i].
hsize = width;
7778 if (dheight * (i + 1) > (height - 4)) {
7779 dheight = height - (dheight * i);
7782 ccparams[i].
vsize = dheight;
7787 if (i == 0) convert_swap3prealpha_frame_thread(&ccparams[i]);
7795 for (i = 1; i < nthreads; i++) {
7802 rowstride -= width << 2;
7804 for (; src < end; src += rowstride) {
7805 for (i = 0; i < width; i++) {
7815 static void *convert_swap3prealpha_frame_thread(
void *data) {
7817 convert_swap3prealpha_frame((uint8_t *)ccparams->
src, ccparams->
hsize, ccparams->
vsize,
7823 static void convert_addpost_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7824 uint8_t *dest, uint8_t *gamma_lut,
int thread_id) {
7826 uint8_t *end = src + height * irowstride;
7832 int dheight, xdheight;
7839 if ((src + dheight * i * irowstride) < end) {
7840 ccparams[i].
src = src + dheight * i * irowstride;
7841 ccparams[i].
hsize = width;
7842 ccparams[i].
dest = dest + dheight * i * orowstride;
7844 if (dheight * (i + 1) > (height - 4)) {
7845 dheight = height - (dheight * i);
7848 ccparams[i].
vsize = dheight;
7852 ccparams[i].
lut = gamma_lut;
7855 if (i == 0) convert_addpost_frame_thread(&ccparams[i]);
7863 for (i = 1; i < nthreads; i++) {
7867 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
7871 if ((irowstride == width * 3) && (orowstride == width * 4)) {
7875 oil_rgb2rgba(dest, src, width * height);
7879 for (; src < end; src += 3) {
7884 *(dest++) = gamma_lut[src[0]];
7885 *(dest++) = gamma_lut[src[1]];
7886 *(dest++) = gamma_lut[src[2]];
7891 int width3 = width * 3;
7892 orowstride -= width * 4;
7893 for (; src < end; src += irowstride) {
7894 for (i = 0; i < width3; i += 3) {
7899 *(dest++) = gamma_lut[src[i]];
7900 *(dest++) = gamma_lut[src[i + 1]];
7901 *(dest++) = gamma_lut[src[i + 2]];
7911 static void *convert_addpost_frame_thread(
void *data) {
7919 static void convert_addpre_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7920 uint8_t *dest,
int thread_id) {
7922 uint8_t *end = src + height * irowstride;
7928 int dheight, xdheight;
7935 if ((src + dheight * i * irowstride) < end) {
7936 ccparams[i].
src = src + dheight * i * irowstride;
7937 ccparams[i].
hsize = width;
7938 ccparams[i].
dest = dest + dheight * i * orowstride;
7940 if (dheight * (i + 1) > (height - 4)) {
7941 dheight = height - (dheight * i);
7944 ccparams[i].
vsize = dheight;
7950 if (i == 0) convert_addpre_frame_thread(&ccparams[i]);
7958 for (i = 1; i < nthreads; i++) {
7965 if ((irowstride == width * 3) && (orowstride == width * 4)) {
7967 for (; src < end; src += 3) {
7973 int width3 = width * 3;
7974 orowstride -= width * 4;
7975 for (; src < end; src += irowstride) {
7976 for (i = 0; i < width3; i += 3) {
7987 static void *convert_addpre_frame_thread(
void *data) {
7995 static void convert_swap3delpost_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
7996 uint8_t *dest,
int thread_id) {
7998 uint8_t *end = src + height * irowstride;
8004 int dheight, xdheight;
8011 if ((src + dheight * i * irowstride) < end) {
8012 ccparams[i].
src = src + dheight * i * irowstride;
8013 ccparams[i].
hsize = width;
8014 ccparams[i].
dest = dest + dheight * i * orowstride;
8016 if (dheight * (i + 1) > (height - 4)) {
8017 dheight = height - (dheight * i);
8020 ccparams[i].
vsize = dheight;
8026 if (i == 0) convert_swap3delpost_frame_thread(&ccparams[i]);
8034 for (i = 1; i < nthreads; i++) {
8041 if ((irowstride == width * 4) && (orowstride == width * 3)) {
8043 for (; src < end; src += 4) {
8049 int width4 = width * 4;
8050 orowstride -= width * 3;
8051 for (; src < end; src += irowstride) {
8052 for (i = 0; i < width4; i += 4) {
8053 *(dest++) = src[i + 2];
8054 *(dest++) = src[i + 1];
8063 static void *convert_swap3delpost_frame_thread(
void *data) {
8071 static void convert_delpost_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
8072 uint8_t *dest, uint8_t *gamma_lut,
int thread_id) {
8074 uint8_t *end = src + height * irowstride;
8080 int dheight, xdheight;
8087 if ((src + dheight * i * irowstride) < end) {
8088 ccparams[i].
src = src + dheight * i * irowstride;
8089 ccparams[i].
hsize = width;
8090 ccparams[i].
dest = dest + dheight * i * orowstride;
8092 if (dheight * (i + 1) > (height - 4)) {
8093 dheight = height - (dheight * i);
8096 ccparams[i].
vsize = dheight;
8100 ccparams[i].
lut = gamma_lut;
8103 if (i == 0) convert_delpost_frame_thread(&ccparams[i]);
8111 for (i = 1; i < nthreads; i++) {
8115 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
8119 if ((irowstride == width * 4) && (orowstride == width * 3)) {
8121 for (; src < end; src += 4) {
8126 *(dest++) = gamma_lut[src[0]];
8127 *(dest++) = gamma_lut[src[1]];
8128 *(dest++) = gamma_lut[src[2]];
8132 int width4 = width * 4;
8133 orowstride -= width * 3;
8134 for (; src < end; src += irowstride) {
8135 for (i = 0; i < width4; i += 4) {
8140 *(dest++) = gamma_lut[src[i]];
8141 *(dest++) = gamma_lut[src[i + 1]];
8142 *(dest++) = gamma_lut[src[i + 2]];
8151 static void *convert_delpost_frame_thread(
void *data) {
8159 static void convert_delpre_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
8160 uint8_t *dest,
int thread_id) {
8162 uint8_t *end = src + height * irowstride;
8168 int dheight, xdheight;
8175 if ((src + dheight * i * irowstride) < end) {
8176 ccparams[i].
src = src + dheight * i * irowstride;
8177 ccparams[i].
hsize = width;
8178 ccparams[i].
dest = dest + dheight * i * orowstride;
8180 if (dheight * (i + 1) > (height - 4)) {
8181 dheight = height - (dheight * i);
8184 ccparams[i].
vsize = dheight;
8190 if (i == 0) convert_delpre_frame_thread(&ccparams[i]);
8198 for (i = 1; i < nthreads; i++) {
8207 if ((irowstride == width * 4) && (orowstride == width * 3)) {
8209 for (; src < end; src += 4) {
8214 int width4 = width * 4;
8215 orowstride -= width * 3;
8216 for (; src < end; src += irowstride) {
8217 for (i = 0; i < width4; i += 4) {
8227 static void *convert_delpre_frame_thread(
void *data) {
8235 static void convert_swap3delpre_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
8236 uint8_t *dest,
int thread_id) {
8238 uint8_t *end = src + height * irowstride;
8244 int dheight, xdheight;
8251 if ((src + dheight * i * irowstride) < end) {
8252 ccparams[i].
src = src + dheight * i * irowstride;
8253 ccparams[i].
hsize = width;
8254 ccparams[i].
dest = dest + dheight * i * orowstride;
8256 if (dheight * (i + 1) > (height - 4)) {
8257 dheight = height - (dheight * i);
8260 ccparams[i].
vsize = dheight;
8266 if (i == 0) convert_swap3delpre_frame_thread(&ccparams[i]);
8274 for (i = 1; i < nthreads; i++) {
8281 if ((irowstride == width * 4) && (orowstride == width * 3)) {
8283 for (; src < end; src += 4) {
8289 int width4 = width * 4;
8290 orowstride -= width * 3;
8291 for (; src < end; src += irowstride) {
8292 for (i = 0; i < width4; i += 4) {
8293 *(dest++) = src[i + 3];
8294 *(dest++) = src[i + 2];
8295 *(dest++) = src[i + 1];
8303 static void *convert_swap3delpre_frame_thread(
void *data) {
8311 static void convert_swapprepost_frame(uint8_t *src,
int width,
int height,
int irowstride,
int orowstride,
8312 uint8_t *dest,
int thread_id) {
8315 uint8_t *end = src + height * irowstride;
8321 int dheight, xdheight;
8328 if ((src + dheight * i * irowstride) < end) {
8329 ccparams[i].
src = src + dheight * i * irowstride;
8330 ccparams[i].
hsize = width;
8331 ccparams[i].
dest = dest + dheight * i * orowstride;
8333 if (dheight * (i + 1) > (height - 4)) {
8334 dheight = height - (dheight * i);
8337 ccparams[i].
vsize = dheight;
8343 if (i == 0) convert_swapprepost_frame_thread(&ccparams[i]);
8351 for (i = 1; i < nthreads; i++) {
8358 uup = (uint64_t *)src;
8359 if ((
void *)uup == (
void *)src) {
8361 int width8 = width >> 3;
8362 orowstride -= width * 4;
8363 for (; src < end; src += irowstride) {
8364 for (i = 0; i < width8; i++) {
8365 uu = ((*uup & 0xFF000000FF000000) >> 24);
8366 uu |= ((*uup & 0x00FFFFFF00FFFFFF) << 8);
8378 int width4 = width << 2;
8379 orowstride -= width4;
8380 for (; src < end; src += irowstride) {
8381 for (i = 0; i < width4; i += 4) {
8391 int width4 = width << 2;
8392 orowstride -= width4;
8393 for (; src < end; src += irowstride) {
8394 for (i = 0; i < width4; i += 4) {
8405 static void *convert_swapprepost_frame_thread(
void *data) {
8416 static void convert_swab_frame(uint8_t *src,
int width,
int height,
int irow,
int orow, uint8_t *dest,
int thread_id) {
8418 int width4 = width * 4;
8419 uint8_t *end = src + height * irow;
8424 int dheight, xdheight;
8431 if ((src + dheight * i * width4) < end) {
8432 ccparams[i].
src = src + dheight * i * irow;
8433 ccparams[i].
hsize = width;
8434 ccparams[i].
dest = dest + dheight * i * orow;
8436 if (dheight * (i + 1) > (height - 4)) {
8437 dheight = height - (dheight * i);
8440 ccparams[i].
vsize = dheight;
8446 if (i == 0) convert_swab_frame_thread(&ccparams[i]);
8454 for (i = 1; i < nthreads; i++) {
8461 for (; src < end; src += irow) {
8462 for (i = 0; i < width4; i += 4) {
8463 swab4(&src[i], &dest[i], 1);
8470 static void *convert_swab_frame_thread(
void *data) {
8472 convert_swab_frame((uint8_t *)ccparams->
src, ccparams->
hsize, ccparams->
vsize,
8479 static void convert_halve_chroma(uint8_t **src,
int width,
int height,
int *istrides,
int *ostrides, uint8_t **dest,
8488 uint8_t *d_u = dest[1], *d_v = dest[2], *s_u = src[1], *s_v = src[2];
8489 boolean chroma =
FALSE;
8491 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
8493 for (i = 0; i < height; i++) {
8494 for (j = 0; j < width; j++) {
8502 d_u[j] = avg_chromaf(d_u[j], s_u[j]);
8503 d_v[j] = avg_chromaf(d_v[j], s_v[j]);
8517 static void convert_double_chroma(uint8_t **src,
int width,
int height,
int *istrides,
int *ostrides, uint8_t **dest,
8523 uint8_t *d_u = dest[1], *d_v = dest[2], *s_u = src[1], *s_v = src[2];
8524 boolean chroma =
FALSE;
8525 int height2 = height << 1;
8527 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
8529 for (i = 0; i < height2; i++) {
8530 for (j = 0; j < width; j++) {
8534 if (!chroma && i > 0) {
8537 d_u[j - ostrides[1]] = avg_chromaf(s_u[j], d_u[j - ostrides[1]]);
8538 d_v[j - ostrides[2]] = avg_chromaf(s_v[j], d_v[j - ostrides[2]]);
8552 static void convert_quad_chroma(uint8_t **src,
int width,
int height,
int *istrides,
int ostride, uint8_t **dest,
8553 boolean add_alpha,
int sampling,
int clamping) {
8559 uint8_t *d_u = dest[1], *d_v = dest[2], *s_u = src[1], *s_v = src[2];
8560 int uv_offs, lastrow;
8562 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
8564 width = (width >> 1) << 1;
8565 lastrow = (height >> 1) << 1;
8567 for (i = 0; i < height; i++) {
8569 for (j = 0; j < width; j++) {
8570 if (!(i & 1) || i == lastrow) {
8573 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8574 d_u[j] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8575 d_v[j] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8581 d_u[j] = s_u[uv_offs];
8582 d_v[j] = s_v[uv_offs];
8586 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8587 d_u[j] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8588 d_v[j] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8595 int jj = j - (ostride << 1);
8596 d_u[jj] = avg_chromaf(d_u[jj + ostride], d_u[jj - ostride]);
8597 d_v[jj] = avg_chromaf(d_v[jj + ostride], d_v[jj - ostride]);
8599 d_u[jj] = avg_chromaf(d_u[jj + ostride], d_u[jj - ostride]);
8600 d_v[jj] = avg_chromaf(d_v[jj + ostride], d_v[jj - ostride]);
8615 for (j = 0; j < width; j++) {
8616 d_u[j - ostride * 2] = avg_chromaf(d_u[j - ostride * 3], d_u[j - ostride]);
8617 d_v[j - ostride * 2] = avg_chromaf(d_v[j - ostride * 3], d_v[j - ostride]);
8620 if (add_alpha)
lives_memset(dest[3], 255, ostride * height);
8624 static void convert_quad_chroma_packed(uint8_t **src,
int width,
int height,
int *istrides,
int ostride,
8625 uint8_t *dest,
boolean add_alpha,
int sampling,
int clamping) {
8633 int irow = istrides[0] - width;
8634 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
8635 int opsize = 3, uv_offs;
8636 int lastrow = (height >> 1) << 1;
8639 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
8641 if (add_alpha) opsize = 4;
8643 width = ((width >> 1) << 1) * opsize;
8645 for (i = 0; i < height; i++) {
8647 for (j = 0; j < width; j += opsize) {
8649 if (!(i & 1) || i == lastrow) {
8654 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8655 dest[j + 1] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8656 dest[j + 2] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8662 dest[j + 1] = s_u[uv_offs];
8663 dest[j + 2] = s_v[uv_offs];
8666 if (add_alpha) dest[j + 3] = 255;
8671 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8672 dest[j + 1] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8673 dest[j + 2] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8678 if (add_alpha) dest[j + 3] = 255;
8680 int jj = j - (ostride << 1);
8686 dest[jj + 1] =
avg_chroma(dest[jj + 1 + ostride], dest[jj + 1 - ostride]);
8687 dest[jj + 2] =
avg_chroma(dest[jj + 2 + ostride], dest[jj + 2 - ostride]);
8693 dest[jj + 1] =
avg_chroma(dest[jj + 1 + ostride], dest[jj + 1 - ostride]);
8694 dest[jj + 2] =
avg_chroma(dest[jj + 2 + ostride], dest[jj + 2 - ostride]);
8710 for (j = 0; j < width; j += opsize) {
8712 int jj = j - ostride;
8713 dest[jj + 1] = avg_chromaf(dest[jj + 1 + ostride], dest[jj + 1 - ostride]);
8714 dest[jj + 2] = avg_chromaf(dest[jj + 2 + ostride], dest[jj + 2 - ostride]);
8720 static void convert_double_chroma_packed(uint8_t **src,
int width,
int height,
int *istrides,
int ostride, uint8_t *dest,
8721 boolean add_alpha,
int sampling,
int clamping) {
8730 uint8_t *s_y = src[0], *s_u = src[1], *s_v = src[2];
8731 int irow = istrides[0] - width;
8732 int opsize = 3, uv_offs;
8734 set_conversion_arrays(clamping, WEED_YUV_SUBSPACE_YCBCR);
8736 if (add_alpha) opsize = 4;
8739 for (i = 0; i < height; i++) {
8741 for (j = 0; j < width; j += opsize) {
8745 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8746 dest[j + 1] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8747 dest[j + 2] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8753 dest[j + 1] = s_u[uv_offs];
8754 dest[j + 2] = s_v[uv_offs];
8756 if (add_alpha) dest[j + 3] = 255;
8764 if (sampling == WEED_YUV_SAMPLING_JPEG) {
8765 dest[j + 1] = avg_chromaf(s_u[uv_offs - 1], s_u[uv_offs]);
8766 dest[j + 2] = avg_chromaf(s_v[uv_offs - 1], s_v[uv_offs]);
8772 dest[j + 1] = s_u[uv_offs];
8773 dest[j + 2] = s_v[uv_offs];
8785 int sampling, clamping, subspace;
8789 unsigned char **pixel_data, *dst;
8790 register int i, j, k;
8792 if (
palette != WEED_PALETTE_YUV420P)
return;
8796 if (sampling == WEED_YUV_SAMPLING_MPEG) {
8807 for (k = 1; k < 3; k++) {
8808 dst = pixel_data[k];
8809 for (j = 0; j < height; j++) {
8810 for (i = 0; i < width; i++) {
8811 if (k == 1) dst[i] =
avg_chroma_3_1f(dst[i], avg_chromaf(dst[i], dst[i + 1]));
8812 else dst[i] =
avg_chroma_1_3f(avg_chromaf(dst[i], dst[i + 1]), dst[i + 1]);
8817 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_JPEG);
8818 }
else if (sampling == WEED_YUV_SAMPLING_JPEG) {
8821 for (k = 1; k < 3; k++) {
8822 dst = pixel_data[k];
8823 for (j = 0; j < height; j++) {
8824 for (i = 0; i < width; i++) {
8825 if (k == 2) dst[i] = avg_chromaf(dst[i], avg_chromaf(dst[i], dst[i + 1]));
8826 else dst[i] = avg_chromaf(avg_chromaf(dst[i], dst[i + 1]), dst[i + 1]);
8831 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_MPEG);
8837 static void switch_yuv_clamping_and_subspace(
weed_layer_t *layer,
int oclamping,
int osubspace) {
8840 int iclamping = weed_get_int_value(layer, WEED_LEAF_YUV_CLAMPING, NULL);
8841 int isubspace = weed_get_int_value(layer, WEED_LEAF_YUV_SUBSPACE, NULL);
8843 int palette = weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
8844 int height = weed_get_int_value(layer, WEED_LEAF_HEIGHT, NULL);
8846 void **pixel_data = weed_get_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, NULL);
8848 uint8_t *src, *src1, *src2, *end;
8850 get_YUV_to_YUV_conversion_arrays(iclamping, isubspace, oclamping, osubspace);
8853 case WEED_PALETTE_YUVA8888:
8854 src = (uint8_t *)pixel_data[0];
8855 end = src + height * rowstride;
8857 *src = Y_to_Y[*src];
8859 *src = U_to_U[*src];
8861 *src = V_to_V[*src];
8865 case WEED_PALETTE_YUV888:
8866 src = (uint8_t *)pixel_data[0];
8867 end = src + height * rowstride;
8869 *src = Y_to_Y[*src];
8871 *src = U_to_U[*src];
8873 *src = V_to_V[*src];
8877 case WEED_PALETTE_YUVA4444P:
8878 case WEED_PALETTE_YUV444P:
8879 src = (uint8_t *)pixel_data[0];
8880 src1 = (uint8_t *)pixel_data[1];
8881 src2 = (uint8_t *)pixel_data[2];
8882 end = src + height * rowstride;
8884 *src = Y_to_Y[*src];
8886 *src1 = U_to_U[*src1];
8888 *src2 = V_to_V[*src2];
8892 case WEED_PALETTE_UYVY:
8893 src = (uint8_t *)pixel_data[0];
8894 end = src + height * rowstride;
8896 *src = U_to_U[*src];
8898 *src = Y_to_Y[*src];
8900 *src = V_to_V[*src];
8902 *src = Y_to_Y[*src];
8906 case WEED_PALETTE_YUYV:
8907 src = (uint8_t *)pixel_data[0];
8908 end = src + height * rowstride;
8910 *src = Y_to_Y[*src];
8912 *src = U_to_U[*src];
8914 *src = Y_to_Y[*src];
8916 *src = V_to_V[*src];
8920 case WEED_PALETTE_YUV422P:
8921 src = (uint8_t *)pixel_data[0];
8922 src1 = (uint8_t *)pixel_data[1];
8923 src2 = (uint8_t *)pixel_data[2];
8924 end = src + height * rowstride;
8927 *src = Y_to_Y[*src];
8929 *src = Y_to_Y[*src];
8931 *src1 = U_to_U[*src1];
8933 *src2 = V_to_V[*src2];
8937 case WEED_PALETTE_YVU420P:
8938 src = (uint8_t *)pixel_data[0];
8939 src1 = (uint8_t *)pixel_data[2];
8940 src2 = (uint8_t *)pixel_data[1];
8941 end = src + height * rowstride;
8944 *src = Y_to_Y[*src];
8946 *src = Y_to_Y[*src];
8948 *src = Y_to_Y[*src];
8950 *src = Y_to_Y[*src];
8952 *src1 = U_to_U[*src1];
8954 *src2 = V_to_V[*src2];
8958 case WEED_PALETTE_YUV420P:
8959 src = (uint8_t *)pixel_data[0];
8960 src1 = (uint8_t *)pixel_data[1];
8961 src2 = (uint8_t *)pixel_data[2];
8962 end = src + height * rowstride;
8965 *src = Y_to_Y[*src];
8967 *src = Y_to_Y[*src];
8969 *src = Y_to_Y[*src];
8971 *src = Y_to_Y[*src];
8973 *src1 = U_to_U[*src1];
8975 *src2 = V_to_V[*src2];
8979 case WEED_PALETTE_YUV411:
8980 src = (uint8_t *)pixel_data[0];
8981 end = src + height * rowstride;
8983 *src = U_to_U[*src];
8985 *src = Y_to_Y[*src];
8987 *src = Y_to_Y[*src];
8989 *src = V_to_V[*src];
8991 *src = Y_to_Y[*src];
8993 *src = Y_to_Y[*src];
8998 weed_set_int_value(layer, WEED_LEAF_YUV_CLAMPING, oclamping);
9021 uint8_t *ptr2 = ptr;
9022 for (j = width; j > 0; j--) {
9026 ptr2 += rowstride - width * psize;
9027 for (i = height - 1; i > 0; i--) {
9034 #define SHIFTVAL sbits
9035 #define ALIGN_SIZE (1 << SHIFTVAL)
9062 int rowstride, *rowstrides;
9063 int *fixed_rs = NULL;
9066 int clamping = WEED_YUV_CLAMPING_CLAMPED;
9067 boolean compact =
FALSE;
9069 uint8_t *pixel_data = NULL;
9073 unsigned char black[6] = {0, 0, 0, 255, 255, 255};
9074 unsigned char yuv_black[6] = {16, 128, 128, 255, 255, 255};
9075 float blackf[4] = {0., 0., 0., 1.};
9077 size_t framesize, framesize2;
9080 int sbits = 7, al, r;
9081 int rowstride_alignment = 16;
9083 if (width <= 0 || height <= 0)
return FALSE;
9085 if (!weed_plant_has_leaf(layer, WEED_LEAF_NATURAL_SIZE)) {
9090 weed_set_int_array(layer, WEED_LEAF_NATURAL_SIZE, 2, nsize);
9098 rowstride_alignment =
THREADVAR(rowstride_alignment);
9100 if (
THREADVAR(rowstride_alignment_hint) > 0) {
9101 r = rowstride_alignment =
THREADVAR(rowstride_alignment_hint);
9102 for (al = 1 << sbits; (al >
ALIGN_MIN && !(al & r)); al >>= 1) sbits--;
9103 rowstride_alignment = al;
9107 rowstride_alignment = 1;
9109 THREADVAR(rowstride_alignment_hint) = 0;
9111 for (sbits = 7; (1 << sbits) > rowstride_alignment; sbits--);
9123 pflags = weed_leaf_get_flags(layer, WEED_LEAF_PIXEL_DATA);
9127 if (weed_plant_has_leaf(layer, WEED_LEAF_YUV_CLAMPING))
9128 clamping = weed_get_int_value(layer, WEED_LEAF_YUV_CLAMPING, NULL);
9129 if (clamping != WEED_YUV_CLAMPING_CLAMPED) yuv_black[0] = 0;
9133 case WEED_PALETTE_RGBA32:
9134 case WEED_PALETTE_BGRA32:
9135 case WEED_PALETTE_ARGB32:
9136 if (fixed_rs) rowstride = fixed_rs[0];
9138 rowstride = width * 4;
9139 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9143 if (!pixel_data)
return FALSE;
9144 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9145 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9147 if (
palette == WEED_PALETTE_ARGB32) {
9148 black[3] = black[0];
9151 fill_plane(pixel_data, 4, width, height, rowstride, black);
9153 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9154 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9157 case WEED_PALETTE_RGB24:
9158 case WEED_PALETTE_BGR24:
9159 if (fixed_rs) rowstride = fixed_rs[0];
9161 rowstride = width * 3;
9162 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9166 if (!pixel_data)
return FALSE;
9167 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9168 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9171 case WEED_PALETTE_YUV888:
9172 if (fixed_rs) rowstride = fixed_rs[0];
9174 rowstride = width * 3;
9175 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9179 if (!pixel_data)
return FALSE;
9180 if (black_fill)
fill_plane(pixel_data, 3, width, height, rowstride, yuv_black);
9181 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9182 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9185 case WEED_PALETTE_YUVA8888:
9186 if (fixed_rs) rowstride = fixed_rs[0];
9188 rowstride = width * 4;
9189 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9193 if (!pixel_data)
return FALSE;
9194 if (black_fill)
fill_plane(pixel_data, 4, width, height, rowstride, yuv_black);
9195 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9196 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9199 case WEED_PALETTE_UYVY:
9200 if (fixed_rs) rowstride = fixed_rs[0];
9202 rowstride = width * 4;
9203 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9207 if (!pixel_data)
return FALSE;
9209 yuv_black[1] = yuv_black[3] = yuv_black[0];
9210 yuv_black[0] = yuv_black[2];
9211 fill_plane(pixel_data, 4, width, height, rowstride, yuv_black);
9213 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9214 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9217 case WEED_PALETTE_YUYV:
9218 if (fixed_rs) rowstride = fixed_rs[0];
9220 rowstride = width * 4;
9221 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9225 if (!pixel_data)
return FALSE;
9227 yuv_black[2] = yuv_black[0];
9228 black[3] = yuv_black[1];
9229 fill_plane(pixel_data, 4, width, height, rowstride, yuv_black);
9231 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9232 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9235 case WEED_PALETTE_YUV420P:
9236 case WEED_PALETTE_YVU420P:
9237 width = (width >> 1) << 1;
9238 height = (height >> 1) << 1;
9240 if (fixed_rs) rowstride = fixed_rs[0];
9243 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9248 rowstrides[0] = fixed_rs[0];
9249 rowstride = rowstrides[1] = fixed_rs[1];
9250 rowstrides[2] = fixed_rs[2];
9252 rowstrides[0] = rowstride;
9254 rowstrides[1] = rowstrides[2] = rowstride;
9258 weed_set_int_array(layer, WEED_LEAF_ROWSTRIDES, 3, rowstrides);
9261 pd_array = (uint8_t **)
lives_malloc(3 *
sizeof(uint8_t *));
9286 if (!memblock)
return FALSE;
9287 pd_array[0] = (uint8_t *)memblock;
9288 pd_array[1] = (uint8_t *)(memblock + framesize);
9289 pd_array[2] = (uint8_t *)(memblock + framesize + framesize2);
9292 if (yuv_black[0] != 0)
lives_memset(pd_array[0], yuv_black[0], framesize);
9294 lives_memset(pd_array[1], yuv_black[1], framesize2 * 2);
9301 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)pd_array);
9305 case WEED_PALETTE_YUV422P:
9306 width = (width >> 1) << 1;
9308 if (fixed_rs) rowstride = fixed_rs[0];
9311 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9315 if (fixed_rs) rowstride = fixed_rs[1];
9317 rowstrides[0] = rowstride;
9318 rowstride = width >> 1;
9319 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9323 rowstrides[0] = fixed_rs[0];
9324 rowstrides[1] = fixed_rs[1];
9325 rowstrides[2] = fixed_rs[2];
9326 }
else rowstrides[1] = rowstrides[2] = rowstride;
9327 weed_set_int_array(layer, WEED_LEAF_ROWSTRIDES, 3, rowstrides);
9329 pd_array = (uint8_t **)
lives_malloc(3 *
sizeof(uint8_t *));
9354 if (!memblock)
return FALSE;
9355 pd_array[0] = (uint8_t *)memblock;
9356 pd_array[1] = (uint8_t *)(memblock + framesize);
9357 pd_array[2] = (uint8_t *)(memblock + framesize + framesize2);
9360 if (yuv_black[0] != 0)
lives_memset(pd_array[0], yuv_black[0], framesize);
9362 lives_memset(pd_array[1], yuv_black[1], framesize2 * 2);
9368 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)pd_array);
9372 case WEED_PALETTE_YUV444P:
9375 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9379 rowstride = rowstrides[0] = fixed_rs[0];
9380 rowstrides[1] = fixed_rs[1];
9381 rowstrides[2] = fixed_rs[2];
9382 }
else rowstrides[0] = rowstrides[1] = rowstrides[2] = rowstride;
9383 weed_set_int_array(layer, WEED_LEAF_ROWSTRIDES, 3, rowstrides);
9385 pd_array = (uint8_t **)
lives_malloc(3 *
sizeof(uint8_t *));
9411 if (!memblock)
return FALSE;
9412 pd_array[0] = memblock;
9413 pd_array[1] = memblock + framesize;
9414 pd_array[2] = memblock + framesize * 2;
9417 if (yuv_black[0] != 0)
lives_memset(pd_array[0], yuv_black[0], framesize);
9419 lives_memset(pd_array[1], yuv_black[1], framesize * 2);
9425 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)pd_array);
9429 case WEED_PALETTE_YUVA4444P:
9432 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9436 rowstride = rowstrides[0] = fixed_rs[0];
9437 rowstrides[1] = fixed_rs[1];
9438 rowstrides[2] = fixed_rs[2];
9439 rowstrides[3] = fixed_rs[3];
9440 }
else rowstrides[0] = rowstrides[1] = rowstrides[2] = rowstrides[3] = rowstride;
9441 weed_set_int_array(layer, WEED_LEAF_ROWSTRIDES, 4, rowstrides);
9443 pd_array = (uint8_t **)
lives_malloc(4 *
sizeof(uint8_t *));
9477 if (!memblock)
return FALSE;
9478 pd_array[0] = memblock;
9479 pd_array[1] = memblock + framesize;
9480 pd_array[2] = memblock + framesize * 2;
9481 pd_array[3] = memblock + framesize * 3;
9484 if (yuv_black[0] != 0) {
9485 lives_memset(pd_array[0], yuv_black[0], framesize * 2);
9488 lives_memset(pd_array[1], yuv_black[1], framesize * 2);
9495 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 4, (
void **)pd_array);
9499 case WEED_PALETTE_YUV411:
9500 if (fixed_rs) rowstride = fixed_rs[0];
9502 rowstride = width * 6;
9503 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9508 if (!pixel_data)
return FALSE;
9510 yuv_black[3] = yuv_black[1];
9511 yuv_black[1] = yuv_black[2] = yuv_black[4] = yuv_black[5] = yuv_black[0];
9512 yuv_black[0] = yuv_black[3];
9515 fill_plane(pixel_data, 6, width, height, rowstride, black);
9518 if (!pixel_data)
return FALSE;
9519 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9520 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9523 case WEED_PALETTE_RGBFLOAT:
9524 if (fixed_rs) rowstride = fixed_rs[0];
9526 rowstride = width * 3 *
sizeof(float);
9527 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9530 if (!pixel_data)
return FALSE;
9531 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9532 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9535 case WEED_PALETTE_RGBAFLOAT:
9536 if (fixed_rs) rowstride = fixed_rs[0];
9538 rowstride = width * 4 *
sizeof(float);
9539 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9543 fill_plane(pixel_data, 4 *
sizeof(
float), width, height, rowstride, (uint8_t *)blackf);
9545 if (!pixel_data)
return FALSE;
9546 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9547 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9550 case WEED_PALETTE_AFLOAT:
9551 if (fixed_rs) rowstride = fixed_rs[0];
9553 rowstride = width *
sizeof(float);
9554 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9557 if (!pixel_data)
return FALSE;
9560 fill_plane(pixel_data,
sizeof(
float), width, height, rowstride, (uint8_t *)blackf);
9562 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9563 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9566 case WEED_PALETTE_A8:
9567 if (fixed_rs) rowstride = fixed_rs[0];
9570 if (!compact) rowstride =
ALIGN_CEIL(rowstride, rowstride_alignment);
9574 if (!pixel_data)
return FALSE;
9578 if (!pixel_data)
return FALSE;
9579 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9580 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9583 case WEED_PALETTE_A1:
9584 if (fixed_rs) rowstride = fixed_rs[0];
9585 else rowstride = (width + 7) >> 3;
9588 if (!pixel_data)
return FALSE;
9590 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9591 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9595 lives_printerr(
"Warning: asked to create empty pixel_data for palette %d !\n",
palette);
9596 break_me(
"create_empty_pixel_data w. unknown pal");
9616 if (!width || !height) {
9627 if (!weed_plant_has_leaf(layer, WEED_LEAF_CURRENT_PALETTE)) {
9636 if (!weed_plant_has_leaf(layer, WEED_LEAF_GAMMA_TYPE)) {
9649 if (!n1_array || !n2_array || n1 != n2)
return TRUE;
9650 for (
int i = 0; i < n1; i++)
if (n1_array[i] != n2_array[i])
return TRUE;
9682 int arate,
int naudchans, weed_size_t nsamps) {
9684 weed_set_voidptr_array(layer, WEED_LEAF_AUDIO_DATA, naudchans, (
void **)data);
9685 weed_set_int_value(layer, WEED_LEAF_AUDIO_RATE, arate);
9686 weed_set_int_value(layer, WEED_LEAF_AUDIO_DATA_LENGTH, nsamps);
9687 weed_set_int_value(layer, WEED_LEAF_AUDIO_CHANNELS, naudchans);
9694 weed_set_int_value(layer, WEED_LEAF_FLAGS, flags);
9701 return weed_get_int_value(layer, WEED_LEAF_FLAGS, NULL);
9719 weed_set_int_value(layer, WEED_LEAF_WIDTH, width);
9726 weed_set_int_value(layer, WEED_LEAF_HEIGHT, height);
9741 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, nplanes, pixel_data);
9748 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
9755 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 0, NULL);
9765 weed_set_int_array(layer, WEED_LEAF_ROWSTRIDES, nplanes, rowstrides);
9772 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
9779 weed_set_int_value(layer, WEED_LEAF_CURRENT_PALETTE,
palette);
9786 weed_set_int_value(layer, WEED_LEAF_GAMMA_TYPE, gamma_type);
9793 weed_set_int_value(layer, WEED_LEAF_YUV_CLAMPING, clamping);
9800 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, sampling);
9807 weed_set_int_value(layer, WEED_LEAF_YUV_SUBSPACE, subspace);
9813 int clamping,
int sampling,
int subspace) {
9846 int numplanes, xheight, xwidth;
9848 void **pixel_data, **npixel_data;
9853 int i = numplanes, j;
9854 boolean newdata =
FALSE;
9856 if (alignment != 0 && !old_layer) {
9857 while (i > 0)
if (orowstrides[--i] % alignment != 0) i = -1;
9858 if (i == 0)
return TRUE;
9867 if (!pixel_data || !pixel_data[0]) {
9877 if (alignment != 0)
THREADVAR(rowstride_alignment_hint) = alignment;
9893 for (i = 0; i < numplanes; i++) {
9895 if (rowstrides[i] == orowstrides[i])
9896 lives_memcpy(npixel_data[i], pixel_data[i], xheight * rowstrides[i]);
9898 uint8_t *dst = (uint8_t *)npixel_data[i];
9899 uint8_t *src = (uint8_t *)pixel_data[i];
9901 for (j = 0; j < xheight; j++) {
9903 src += orowstrides[i];
9904 dst += rowstrides[i];
9909 weed_leaf_dup(layer, old_layer, WEED_LEAF_NATURAL_SIZE);
9926 int aoffs, coffs, psize, psizel, widthx;
9929 int width = weed_get_int_value(layer, WEED_LEAF_WIDTH, NULL);
9930 int height = weed_get_int_value(layer, WEED_LEAF_HEIGHT, NULL);
9931 int rowstride = weed_get_int_value(layer, WEED_LEAF_ROWSTRIDES, NULL);
9932 int pal = weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
9937 unsigned char **ptrp;
9943 if (!unal_inited) init_unal();
9945 if (weed_plant_has_leaf(layer, WEED_LEAF_YUV_CLAMPING))
9946 clamped = (weed_get_int_value(layer, WEED_LEAF_YUV_CLAMPING, &
error) == WEED_YUV_CLAMPING_CLAMPED);
9947 else clamped =
TRUE;
9950 case WEED_PALETTE_RGBA32:
9951 case WEED_PALETTE_BGRA32:
9953 case WEED_PALETTE_YUVA8888:
9960 case WEED_PALETTE_ARGB32:
9968 case WEED_PALETTE_YUVA4444P:
9970 ptrp = (
unsigned char **)weed_get_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, &
error);
9971 rows = weed_get_int_array(layer, WEED_LEAF_ROWSTRIDES, &
error);
9975 for (i = 0; i < height; i++) {
9976 for (j = 0; j < width; j++) {
9978 for (p = 0; p < 3; p++) {
9979 ptrp[p][j] = unal[alpha][ptrp[p][j]];
9982 for (p = 0; p < 4; p++) {
9987 for (i = 0; i < height; i++) {
9988 for (j = 0; j < width; j++) {
9990 for (p = 0; p < 3; p++) {
9991 ptrp[p][j] = al[alpha][ptrp[p][j]];
9994 for (p = 0; p < 4; p++) {
10001 for (i = 0; i < height; i++) {
10002 for (j = 0; j < width; j++) {
10003 alpha = ptrp[3][j];
10004 ptrp[0][j] = unalcy[alpha][ptrp[0][j]];
10005 ptrp[1][j] = unalcuv[alpha][ptrp[0][j]];
10006 ptrp[2][j] = unalcuv[alpha][ptrp[0][j]];
10008 for (p = 0; p < 4; p++) {
10009 ptrp[p] += rows[p];
10013 for (i = 0; i < height; i++) {
10014 for (j = 0; j < width; j++) {
10015 alpha = ptrp[3][j];
10016 ptrp[0][j] = alcy[alpha][ptrp[0][j]];
10017 ptrp[1][j] = alcuv[alpha][ptrp[0][j]];
10018 ptrp[2][j] = alcuv[alpha][ptrp[0][j]];
10020 for (p = 0; p < 4; p++) {
10021 ptrp[p] += rows[p];
10031 ptr = (
unsigned char *)weed_get_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, &
error);
10035 for (i = 0; i < height; i++) {
10036 for (j = 0; j < widthx; j += psize) {
10037 alpha = ptr[j + aoffs];
10038 for (p = coffs; p < psizel; p++) {
10039 ptr[j + p] = unal[alpha][ptr[j + p]];
10045 for (i = 0; i < height; i++) {
10046 for (j = 0; j < widthx; j += psize) {
10047 alpha = ptr[j + aoffs];
10048 for (p = coffs; p < psizel; p++) {
10049 ptr[j + p] = al[alpha][ptr[j + p]];
10058 for (i = 0; i < height; i++) {
10059 for (j = 0; j < widthx; j += psize) {
10060 alpha = ptr[j + 3];
10061 ptr[j] = unalcy[alpha][ptr[j]];
10062 ptr[j + 1] = unalcuv[alpha][ptr[j]];
10063 ptr[j + 2] = unalcuv[alpha][ptr[j]];
10068 for (i = 0; i < height; i++) {
10069 for (j = 0; j < widthx; j += psize) {
10070 alpha = ptr[j + 3];
10071 ptr[j] = alcy[alpha][ptr[j]];
10072 ptr[j + 1] = alcuv[alpha][ptr[j]];
10073 ptr[j + 2] = alcuv[alpha][ptr[j]];
10085 if (flags == 0) weed_leaf_delete(layer, WEED_LEAF_FLAGS);
10086 else weed_set_int_value(layer, WEED_LEAF_FLAGS, flags);
10093 int *rowstrides, rtmp;
10095 if (nplanes < 3)
return;
10097 pd_array[1] = pd_array[2];
10102 rtmp = rowstrides[1];
10103 rowstrides[1] = rowstrides[2];
10104 rowstrides[2] = rtmp;
10110 if (inpl == WEED_PALETTE_YUV420P || inpl == WEED_PALETTE_YUV420P || inpl == WEED_PALETTE_YUV420P) {
10111 if (opal == WEED_PALETTE_RGB24 || opal == WEED_PALETTE_BGR24 || opal == WEED_PALETTE_RGBA32
10112 || opal == WEED_PALETTE_ARGB32)
return TRUE;
10114 if (opal == WEED_PALETTE_UYVY || opal == WEED_PALETTE_YUYV) {
10115 if (inpl == WEED_PALETTE_RGB24 || inpl == WEED_PALETTE_RGBA32
10116 || inpl == WEED_PALETTE_BGR24 || inpl == WEED_PALETTE_BGRA32
10117 || inpl == WEED_PALETTE_ARGB32
10121 if ((inpl == WEED_PALETTE_RGB24 && opal == WEED_PALETTE_BGR24) || (inpl == WEED_PALETTE_BGR24
10122 && opal == WEED_PALETTE_RGB24))
return TRUE;
10123 if ((inpl == WEED_PALETTE_RGB24 && opal == WEED_PALETTE_RGBA32) || (inpl == WEED_PALETTE_BGR24
10124 && opal == WEED_PALETTE_BGRA32))
return TRUE;
10125 if ((inpl == WEED_PALETTE_RGBA32 && opal == WEED_PALETTE_RGB24) || (inpl == WEED_PALETTE_BGRA32
10126 && opal == WEED_PALETTE_BGR24))
return TRUE;
10163 uint8_t *gusrc = NULL, **gusrc_array = NULL, *gudest = NULL, **gudest_array = NULL, *tmp;
10164 int width, height, orowstride, irowstride, *istrides, *ostrides = NULL;
10166 int error, inpl, flags = 0;
10167 int isampling, isubspace;
10168 int new_gamma_type = WEED_GAMMA_UNKNOWN;
10170 boolean contig =
FALSE;
10176 if (weed_plant_has_leaf(layer, WEED_LEAF_YUV_SAMPLING))
10178 else isampling = WEED_YUV_SAMPLING_DEFAULT;
10180 if (weed_plant_has_leaf(layer, WEED_LEAF_YUV_CLAMPING))
10182 else iclamping = oclamping;
10184 if (weed_plant_has_leaf(layer, WEED_LEAF_YUV_SUBSPACE))
10186 else isubspace = WEED_YUV_SUBSPACE_YUV;
10193 g_print(
"converting %d X %d palette %s(%s) to %s(%s)\n", width, height,
weed_palette_get_name(inpl),
10200 if (!istrides)
return FALSE;
10203 if (isubspace == osubspace) {
10205 lives_printerr(
"converting clamping %d to %d\n", iclamping, oclamping);
10207 switch_yuv_clamping_and_subspace(layer, oclamping, osubspace);
10208 iclamping = oclamping;
10217 isubspace = osubspace;
10218 isampling = osampling;
10219 iclamping = oclamping;
10226 if (inpl == outpl) {
10228 lives_printerr(
"not converting palette\n");
10231 (isubspace == osubspace || (osubspace != WEED_YUV_SUBSPACE_BT709)))) {
10232 if (inpl == WEED_PALETTE_YUV420P && ((isampling == WEED_YUV_SAMPLING_JPEG
10233 && osampling == WEED_YUV_SAMPLING_MPEG) ||
10234 (isampling == WEED_YUV_SAMPLING_MPEG && osampling == WEED_YUV_SAMPLING_JPEG))) {
10235 switch_yuv_sampling(layer);
10237 char *tmp2 =
lives_strdup_printf(
"Switch sampling types (%d %d) or subspace(%d %d): (%d) conversion not yet written !\n",
10238 isampling, osampling, isubspace, osubspace, inpl);
10258 weed_set_int_value(layer, WEED_LEAF_FLAGS, flags);
10264 if (flags == 0) weed_leaf_delete(layer, WEED_LEAF_FLAGS);
10265 else weed_set_int_value(layer, WEED_LEAF_FLAGS, flags);
10276 if (tgamma != WEED_GAMMA_UNKNOWN) {
10277 new_gamma_type = tgamma;
10281 if (osubspace == WEED_YUV_SUBSPACE_BT709) {
10282 new_gamma_type = WEED_GAMMA_BT709;
10283 }
else new_gamma_type = WEED_GAMMA_SRGB;
10289 new_gamma_type = WEED_GAMMA_UNKNOWN;
10296 if (!istrides)
return FALSE;
10298 irowstride = istrides[0];
10305 #ifdef WEED_ADVANCED_PALETTES
10313 if (inpl == WEED_PALETTE_YVU420P) swap_chroma_planes(layer);
10319 #ifdef WEED_ADVANCED_PALETTES
10326 convert_swap3_frame(gusrc, width, height, irowstride, irowstride, gusrc,
10336 convert_swap3addpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10342 convert_addpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10353 convert_swap3addpre_frame(gusrc, width, height, irowstride, orowstride, gudest,
10359 convert_addpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10370 convert_swap3delpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10376 convert_delpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10382 convert_swap3postalpha_frame(gusrc, width, height, irowstride, -
USE_THREADS);
10388 convert_swap4_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10391 convert_swapprepost_frame(gusrc, width, height, irowstride, irowstride, gusrc,
10405 convert_swap3delpre_frame(gusrc, width, height, irowstride, orowstride, gudest,
10411 convert_delpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10416 convert_swap4_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10419 convert_swapprepost_frame(gusrc, width, height, irowstride, irowstride, gusrc,
10426 convert_swap3prealpha_frame(gusrc, width, height, irowstride, -
USE_THREADS);
10435 case WEED_PALETTE_BGR24:
10438 case WEED_PALETTE_RGBA32:
10442 convert_swap3addpost_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10444 case WEED_PALETTE_RGB24:
10445 convert_swap3_frame(gusrc, width, height, irowstride, irowstride, gusrc,
10450 case WEED_PALETTE_BGRA32:
10454 convert_addpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10458 case WEED_PALETTE_ARGB32:
10462 convert_swap3addpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10464 case WEED_PALETTE_UYVY8888:
10465 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10469 convert_bgr_to_uyvy_frame(gusrc, width, height, irowstride, orowstride,
10474 case WEED_PALETTE_YUYV8888:
10475 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10479 convert_bgr_to_yuyv_frame(gusrc, width, height, irowstride, orowstride,
10484 case WEED_PALETTE_YUV888:
10488 convert_bgr_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE,
FALSE,
10491 case WEED_PALETTE_YUVA8888:
10495 convert_bgr_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE,
TRUE,
10498 case WEED_PALETTE_YUV422P:
10500 gudest_array = (uint8_t **)weed_get_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, &
error);
10502 convert_bgr_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
10503 FALSE, WEED_YUV_SAMPLING_DEFAULT, oclamping);
10504 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10506 case WEED_PALETTE_YVU420P:
10507 case WEED_PALETTE_YUV420P:
10511 convert_bgr_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
10512 FALSE, osubspace, oclamping);
10513 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10515 case WEED_PALETTE_YUV444P:
10519 convert_bgr_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
FALSE,
10522 case WEED_PALETTE_YUVA4444P:
10526 convert_bgr_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
FALSE,
10529 case WEED_PALETTE_YUV411:
10530 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
10533 convert_bgr_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest,
10537 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
10543 case WEED_PALETTE_RGBA32:
10546 case WEED_PALETTE_BGR24:
10550 convert_swap3delpost_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10552 case WEED_PALETTE_RGB24:
10556 convert_delpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10560 case WEED_PALETTE_BGRA32:
10561 convert_swap3postalpha_frame(gusrc, width, height, irowstride, -
USE_THREADS);
10564 case WEED_PALETTE_ARGB32:
10565 convert_swapprepost_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10568 case WEED_PALETTE_UYVY8888:
10569 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10573 convert_rgb_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest,
TRUE,
10576 case WEED_PALETTE_YUYV8888:
10577 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10581 convert_rgb_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest,
TRUE,
10586 case WEED_PALETTE_YUV888:
10590 convert_rgb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE,
FALSE, oclamping, -
USE_THREADS);
10592 case WEED_PALETTE_YUVA8888:
10596 convert_rgb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE,
TRUE, oclamping, -
USE_THREADS);
10598 case WEED_PALETTE_YUV422P:
10602 convert_rgb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
TRUE,
10603 WEED_YUV_SAMPLING_DEFAULT, oclamping);
10604 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10606 case WEED_PALETTE_YUV420P:
10607 case WEED_PALETTE_YVU420P:
10611 convert_rgb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
TRUE, osubspace, oclamping);
10612 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10614 case WEED_PALETTE_YUV444P:
10618 convert_rgb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
TRUE,
FALSE, oclamping, -
USE_THREADS);
10620 case WEED_PALETTE_YUVA4444P:
10624 convert_rgb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
TRUE,
TRUE, oclamping, -
USE_THREADS);
10626 case WEED_PALETTE_YUV411:
10627 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
10630 convert_rgb_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest,
TRUE, oclamping);
10633 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
10638 case WEED_PALETTE_RGB24:
10641 case WEED_PALETTE_BGR24:
10642 convert_swap3_frame(gusrc, width, height, irowstride, irowstride, gusrc,
10646 case WEED_PALETTE_RGBA32:
10650 convert_addpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10653 case WEED_PALETTE_BGRA32:
10657 convert_swap3addpost_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10659 case WEED_PALETTE_ARGB32:
10663 convert_addpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10665 case WEED_PALETTE_UYVY8888:
10666 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10670 convert_rgb_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest,
FALSE,
10675 case WEED_PALETTE_YUYV8888:
10676 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10680 convert_rgb_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest,
FALSE,
10685 case WEED_PALETTE_YUV888:
10689 convert_rgb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE,
FALSE, oclamping, -
USE_THREADS);
10691 case WEED_PALETTE_YUVA8888:
10695 convert_rgb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE,
TRUE, oclamping, -
USE_THREADS);
10697 case WEED_PALETTE_YUV422P:
10701 convert_rgb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
FALSE, osubspace, oclamping);
10703 case WEED_PALETTE_YUV420P:
10704 case WEED_PALETTE_YVU420P:
10710 convert_rgb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
10711 FALSE, WEED_YUV_SAMPLING_DEFAULT, oclamping);
10712 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10714 case WEED_PALETTE_YUV444P:
10718 convert_rgb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
FALSE,
FALSE, oclamping, -
USE_THREADS);
10720 case WEED_PALETTE_YUVA4444P:
10724 convert_rgb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
FALSE,
TRUE, oclamping, -
USE_THREADS);
10726 case WEED_PALETTE_YUV411:
10727 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
10730 convert_rgb_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest,
FALSE, oclamping);
10733 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
10738 case WEED_PALETTE_BGRA32:
10741 case WEED_PALETTE_BGR24:
10745 convert_delpost_frame(gusrc, width, height, irowstride, orowstride, gudest,
10748 case WEED_PALETTE_RGB24:
10752 convert_swap3delpost_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10754 case WEED_PALETTE_RGBA32:
10755 convert_swap3postalpha_frame(gusrc, width, height, irowstride, -
USE_THREADS);
10758 case WEED_PALETTE_ARGB32:
10759 convert_swap4_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10762 case WEED_PALETTE_UYVY8888:
10763 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10767 convert_bgr_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest,
TRUE,
10772 case WEED_PALETTE_YUYV8888:
10773 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10777 convert_bgr_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest,
TRUE,
10782 case WEED_PALETTE_YUV888:
10786 convert_bgr_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE,
FALSE, oclamping, -
USE_THREADS);
10788 case WEED_PALETTE_YUVA8888:
10792 convert_bgr_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE,
TRUE, oclamping, -
USE_THREADS);
10794 case WEED_PALETTE_YUV422P:
10798 convert_bgr_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
TRUE,
10799 WEED_YUV_SAMPLING_DEFAULT, oclamping);
10800 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10802 case WEED_PALETTE_YVU420P:
10803 case WEED_PALETTE_YUV420P:
10807 convert_bgr_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
TRUE, osubspace, oclamping);
10808 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10810 case WEED_PALETTE_YUV444P:
10814 convert_bgr_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
TRUE,
FALSE, oclamping, -
USE_THREADS);
10816 case WEED_PALETTE_YUVA4444P:
10820 convert_bgr_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
TRUE,
TRUE, oclamping, -
USE_THREADS);
10822 case WEED_PALETTE_YUV411:
10823 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
10826 convert_bgr_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest,
TRUE, oclamping);
10829 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
10834 case WEED_PALETTE_ARGB32:
10837 case WEED_PALETTE_BGR24:
10841 convert_swap3delpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10843 case WEED_PALETTE_RGB24:
10847 convert_delpre_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
10849 case WEED_PALETTE_RGBA32:
10850 convert_swapprepost_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10853 case WEED_PALETTE_BGRA32:
10854 convert_swap4_frame(gusrc, width, height, irowstride, irowstride, gusrc, -
USE_THREADS);
10857 case WEED_PALETTE_UYVY8888:
10858 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10862 convert_argb_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest, oclamping,
10866 case WEED_PALETTE_YUYV8888:
10867 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10871 convert_argb_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest, oclamping,
10875 case WEED_PALETTE_YUV888:
10879 convert_argb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE, oclamping, -
USE_THREADS);
10881 case WEED_PALETTE_YUVA8888:
10885 convert_argb_to_yuv_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE, oclamping, -
USE_THREADS);
10887 case WEED_PALETTE_YUV444P:
10891 convert_argb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
FALSE, oclamping, -
USE_THREADS);
10893 case WEED_PALETTE_YUVA4444P:
10897 convert_argb_to_yuvp_frame(gusrc, width, height, irowstride, orowstride, gudest_array,
TRUE, oclamping, -
USE_THREADS);
10899 case WEED_PALETTE_YUV422P:
10903 convert_argb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
10904 WEED_YUV_SAMPLING_DEFAULT, oclamping);
10905 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10907 case WEED_PALETTE_YUV420P:
10908 case WEED_PALETTE_YVU420P:
10912 convert_argb_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE, osubspace, oclamping);
10913 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
10915 case WEED_PALETTE_YUV411:
10916 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
10919 convert_argb_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest, oclamping);
10922 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
10927 case WEED_PALETTE_YUV444P:
10930 case WEED_PALETTE_YUV422P:
10934 gudest_array[0] = gusrc_array[0];
10935 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
10937 convert_halve_chroma(gusrc_array, width, height, istrides, ostrides, gudest_array, iclamping);
10938 gusrc_array[0] = NULL;
10941 case WEED_PALETTE_RGB24:
10945 convert_yuv_planar_to_rgb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
FALSE, iclamping,
10948 case WEED_PALETTE_RGBA32:
10952 convert_yuv_planar_to_rgb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
TRUE, iclamping,
10955 case WEED_PALETTE_BGR24:
10959 convert_yuv_planar_to_bgr_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
FALSE, iclamping,
10962 case WEED_PALETTE_BGRA32:
10966 convert_yuv_planar_to_bgr_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
TRUE, iclamping,
10969 case WEED_PALETTE_ARGB32:
10973 convert_yuv_planar_to_argb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE, iclamping, -
USE_THREADS);
10975 case WEED_PALETTE_UYVY8888:
10976 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10980 convert_yuv_planar_to_uyvy_frame(gusrc_array, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest, iclamping);
10982 case WEED_PALETTE_YUYV8888:
10983 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
10987 convert_yuv_planar_to_yuyv_frame(gusrc_array, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest, iclamping);
10989 case WEED_PALETTE_YUV888:
10993 convert_combineplanes_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
FALSE);
10995 case WEED_PALETTE_YUVA8888:
10999 convert_combineplanes_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
FALSE,
TRUE);
11001 case WEED_PALETTE_YUVA4444P:
11005 convert_yuvp_to_yuvap_frame(gusrc_array, width, height, irowstride, orowstride, gudest_array);
11007 case WEED_PALETTE_YUV420P:
11008 case WEED_PALETTE_YVU420P:
11012 convert_yuvp_to_yuv420_frame(gusrc_array, width, height, istrides, ostrides, gudest_array, iclamping);
11013 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11015 case WEED_PALETTE_YUV411:
11016 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11019 convert_yuvp_to_yuv411_frame(gusrc_array, width, height, irowstride, (
yuv411_macropixel *)gudest, iclamping);
11022 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11027 case WEED_PALETTE_YUVA4444P:
11030 case WEED_PALETTE_YUV422P:
11034 gudest_array[0] = gusrc_array[0];
11035 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
11037 convert_halve_chroma(gusrc_array, width, height, istrides, ostrides, gudest_array, iclamping);
11038 gusrc_array[0] = NULL;
11041 case WEED_PALETTE_RGB24:
11045 convert_yuv_planar_to_rgb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
FALSE, iclamping,
11048 case WEED_PALETTE_RGBA32:
11052 convert_yuv_planar_to_rgb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
TRUE, iclamping,
11055 case WEED_PALETTE_BGR24:
11059 convert_yuv_planar_to_bgr_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
FALSE, iclamping,
11062 case WEED_PALETTE_BGRA32:
11066 convert_yuv_planar_to_bgr_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
TRUE, iclamping,
11069 case WEED_PALETTE_ARGB32:
11073 convert_yuv_planar_to_argb_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE, iclamping, -
USE_THREADS);
11075 case WEED_PALETTE_UYVY8888:
11076 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11080 convert_yuv_planar_to_uyvy_frame(gusrc_array, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest, iclamping);
11082 case WEED_PALETTE_YUYV8888:
11083 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11087 convert_yuv_planar_to_yuyv_frame(gusrc_array, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest, iclamping);
11089 case WEED_PALETTE_YUV888:
11093 convert_combineplanes_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
FALSE);
11095 case WEED_PALETTE_YUVA8888:
11099 convert_combineplanes_frame(gusrc_array, width, height, irowstride, orowstride, gudest,
TRUE,
TRUE);
11101 case WEED_PALETTE_YUV444P:
11105 convert_yuvap_to_yuvp_frame(gusrc_array, width, height, irowstride, orowstride, gudest_array);
11107 case WEED_PALETTE_YUV420P:
11108 case WEED_PALETTE_YVU420P:
11112 convert_yuvp_to_yuv420_frame(gusrc_array, width, height, istrides, ostrides, gudest_array, iclamping);
11113 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11115 case WEED_PALETTE_YUV411:
11116 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11119 convert_yuvp_to_yuv411_frame(gusrc_array, width, height, irowstride, (
yuv411_macropixel *)gudest, iclamping);
11122 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11127 case WEED_PALETTE_UYVY8888:
11130 case WEED_PALETTE_YUYV8888:
11134 convert_swab_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
11136 case WEED_PALETTE_YUV422P:
11137 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11140 convert_uyvy_to_yuv422_frame((
uyvy_macropixel *)gusrc, width, height, gudest_array);
11142 case WEED_PALETTE_RGB24:
11147 convert_uyvy_to_rgb_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11150 case WEED_PALETTE_RGBA32:
11151 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11155 convert_uyvy_to_rgb_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11158 case WEED_PALETTE_BGR24:
11159 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11163 convert_uyvy_to_bgr_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11166 case WEED_PALETTE_BGRA32:
11167 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11171 convert_uyvy_to_bgr_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11174 case WEED_PALETTE_ARGB32:
11175 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11179 convert_uyvy_to_argb_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride,
11182 case WEED_PALETTE_YUV444P:
11183 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11187 convert_uyvy_to_yuvp_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE);
11189 case WEED_PALETTE_YUVA4444P:
11190 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11194 convert_uyvy_to_yuvp_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE);
11196 case WEED_PALETTE_YUV888:
11197 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11201 convert_uyvy_to_yuv888_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
FALSE);
11203 case WEED_PALETTE_YUVA8888:
11204 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11208 convert_uyvy_to_yuv888_frame((
uyvy_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
TRUE);
11210 case WEED_PALETTE_YUV420P:
11211 case WEED_PALETTE_YVU420P:
11212 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11215 convert_uyvy_to_yuv420_frame((
uyvy_macropixel *)gusrc, width, height, gudest_array, iclamping);
11216 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11218 case WEED_PALETTE_YUV411:
11219 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11225 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11230 case WEED_PALETTE_YUYV8888:
11233 case WEED_PALETTE_UYVY8888:
11237 convert_swab_frame(gusrc, width, height, irowstride, orowstride, gudest, -
USE_THREADS);
11239 case WEED_PALETTE_YUV422P:
11240 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11243 convert_yuyv_to_yuv422_frame((
yuyv_macropixel *)gusrc, width, height, gudest_array);
11245 case WEED_PALETTE_RGB24:
11246 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11250 convert_yuyv_to_rgb_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11253 case WEED_PALETTE_RGBA32:
11254 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11258 convert_yuyv_to_rgb_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11261 case WEED_PALETTE_BGR24:
11262 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11266 convert_yuyv_to_bgr_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11269 case WEED_PALETTE_BGRA32:
11270 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11274 convert_yuyv_to_bgr_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
11277 case WEED_PALETTE_ARGB32:
11278 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11282 convert_yuyv_to_argb_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride,
11285 case WEED_PALETTE_YUV444P:
11286 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11290 convert_yuyv_to_yuvp_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE);
11292 case WEED_PALETTE_YUVA4444P:
11293 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11297 convert_yuyv_to_yuvp_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE);
11299 case WEED_PALETTE_YUV888:
11300 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11304 convert_yuyv_to_yuv888_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
FALSE);
11306 case WEED_PALETTE_YUVA8888:
11307 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11311 convert_yuyv_to_yuv888_frame((
yuyv_macropixel *)gusrc, width, height, irowstride, orowstride, gudest,
TRUE);
11313 case WEED_PALETTE_YUV420P:
11314 case WEED_PALETTE_YVU420P:
11315 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11318 convert_yuyv_to_yuv420_frame((
yuyv_macropixel *)gusrc, width, height, gudest_array, iclamping);
11319 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11321 case WEED_PALETTE_YUV411:
11322 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11328 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11333 case WEED_PALETTE_YUV888:
11337 case WEED_PALETTE_YUVA8888:
11341 convert_addpost_frame(gusrc, width, height, irowstride, orowstride, gudest, NULL, -
USE_THREADS);
11343 case WEED_PALETTE_YUV444P:
11347 convert_splitplanes_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
FALSE);
11349 case WEED_PALETTE_YUVA4444P:
11353 convert_splitplanes_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE,
TRUE);
11355 case WEED_PALETTE_RGB24:
11359 convert_yuv888_to_rgb_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE, iclamping, isampling, -
USE_THREADS);
11361 case WEED_PALETTE_RGBA32:
11365 convert_yuv888_to_rgb_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE, iclamping, isampling, -
USE_THREADS);
11367 case WEED_PALETTE_BGR24:
11371 convert_yuv888_to_bgr_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE, iclamping, isampling, -
USE_THREADS);
11373 case WEED_PALETTE_BGRA32:
11377 convert_yuv888_to_bgr_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE, iclamping, isampling, -
USE_THREADS);
11379 case WEED_PALETTE_ARGB32:
11383 convert_yuv888_to_argb_frame(gusrc, width, height, irowstride, orowstride, gudest, iclamping, isampling, -
USE_THREADS);
11385 case WEED_PALETTE_YVU420P:
11386 case WEED_PALETTE_YUV420P:
11389 ostrides = weed_get_int_array(layer, WEED_LEAF_ROWSTRIDES, &
error);
11390 convert_yuv888_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE, iclamping);
11391 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11394 case WEED_PALETTE_YUV422P:
11397 ostrides = weed_get_int_array(layer, WEED_LEAF_ROWSTRIDES, &
error);
11398 convert_yuv888_to_yuv422_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
FALSE, iclamping);
11400 case WEED_PALETTE_UYVY8888:
11401 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11405 convert_yuv888_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest,
FALSE, iclamping);
11407 case WEED_PALETTE_YUYV8888:
11408 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11412 convert_yuv888_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest,
FALSE, iclamping);
11414 case WEED_PALETTE_YUV411:
11415 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11421 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11426 case WEED_PALETTE_YUVA8888:
11429 case WEED_PALETTE_YUV888:
11433 convert_delpost_frame(gusrc, width, height, irowstride, orowstride, gudest, NULL, -
USE_THREADS);
11435 case WEED_PALETTE_YUVA4444P:
11439 convert_splitplanes_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
TRUE);
11441 case WEED_PALETTE_YUV444P:
11445 convert_splitplanes_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE,
FALSE);
11447 case WEED_PALETTE_RGB24:
11451 convert_yuva8888_to_rgba_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE, iclamping, isampling, -
USE_THREADS);
11453 case WEED_PALETTE_RGBA32:
11457 convert_yuva8888_to_rgba_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE, iclamping, isampling, -
USE_THREADS);
11459 case WEED_PALETTE_BGR24:
11463 convert_yuva8888_to_bgra_frame(gusrc, width, height, irowstride, orowstride, gudest,
TRUE, iclamping, isampling, -
USE_THREADS);
11465 case WEED_PALETTE_BGRA32:
11469 convert_yuva8888_to_bgra_frame(gusrc, width, height, irowstride, orowstride, gudest,
FALSE, iclamping, isampling, -
USE_THREADS);
11471 case WEED_PALETTE_ARGB32:
11475 convert_yuva8888_to_argb_frame(gusrc, width, height, irowstride, orowstride, gudest, iclamping, isampling, -
USE_THREADS);
11477 case WEED_PALETTE_YUV420P:
11478 case WEED_PALETTE_YVU420P:
11482 convert_yuv888_to_yuv420_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE, iclamping);
11483 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11486 case WEED_PALETTE_YUV422P:
11490 convert_yuv888_to_yuv422_frame(gusrc, width, height, irowstride, ostrides, gudest_array,
TRUE, iclamping);
11492 case WEED_PALETTE_UYVY8888:
11493 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11497 convert_yuv888_to_uyvy_frame(gusrc, width, height, irowstride, orowstride, (
uyvy_macropixel *)gudest,
TRUE, iclamping);
11499 case WEED_PALETTE_YUYV8888:
11500 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11504 convert_yuv888_to_yuyv_frame(gusrc, width, height, irowstride, orowstride, (
yuyv_macropixel *)gudest,
TRUE, iclamping);
11506 case WEED_PALETTE_YUV411:
11507 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11510 convert_yuv888_to_yuv411_frame(gusrc, width, height, irowstride, (
yuv411_macropixel *)gudest,
TRUE);
11513 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11518 case WEED_PALETTE_YVU420P:
11519 case WEED_PALETTE_YUV420P:
11522 case WEED_PALETTE_RGB24:
11526 convert_yuv420p_to_rgb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
FALSE,
FALSE,
11529 case WEED_PALETTE_RGBA32:
11533 convert_yuv420p_to_rgb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
TRUE,
FALSE,
11536 case WEED_PALETTE_BGR24:
11540 convert_yuv420p_to_bgr_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
FALSE,
FALSE,
11543 case WEED_PALETTE_BGRA32:
11547 convert_yuv420p_to_bgr_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
TRUE,
FALSE,
11550 case WEED_PALETTE_ARGB32:
11554 convert_yuv420p_to_argb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
FALSE,
11557 case WEED_PALETTE_UYVY8888:
11558 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11562 convert_yuv420_to_uyvy_frame(gusrc_array, width, height, istrides, orowstride, (
uyvy_macropixel *)gudest, iclamping);
11564 case WEED_PALETTE_YUYV8888:
11565 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11569 convert_yuv420_to_yuyv_frame(gusrc_array, width, height, istrides, orowstride, (
yuyv_macropixel *)gudest, iclamping);
11571 case WEED_PALETTE_YUV422P:
11575 gudest_array[0] = gusrc_array[0];
11576 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
11578 convert_double_chroma(gusrc_array, width >> 1, height >> 1, istrides, ostrides, gudest_array, iclamping);
11579 gusrc_array[0] = NULL;
11582 case WEED_PALETTE_YUV444P:
11586 gudest_array[0] = gusrc_array[0];
11587 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
11589 convert_quad_chroma(gusrc_array, width, height, istrides, orowstride, gudest_array,
FALSE, isampling, iclamping);
11590 gusrc_array[0] = NULL;
11593 case WEED_PALETTE_YUVA4444P:
11597 gudest_array[0] = gusrc_array[0];
11598 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 4, (
void **)gudest_array);
11600 convert_quad_chroma(gusrc_array, width, height, istrides, orowstride, gudest_array,
TRUE, isampling, iclamping);
11601 gusrc_array[0] = NULL;
11604 case WEED_PALETTE_YVU420P:
11605 case WEED_PALETTE_YUV420P:
11606 if (contig && istrides[1] != istrides[2]) {
11607 uint8_t *gd0, *gd1, *gd2, *gs0 = gusrc_array[0], *gs1 = gusrc_array[1], *gs2 = gusrc_array[2];
11608 size_t hwidth = width >> 1;
11609 size_t ir0 = istrides[0] - width, ir1 = istrides[1] - hwidth, ir2 = istrides[2] - hwidth, or0, or1, or2;
11612 or0 = ostrides[0] - width;
11613 or1 = ostrides[1] - hwidth;
11614 or2 = ostrides[2] - hwidth;
11616 gd0 = gudest_array[0];
11617 gd1 = gudest_array[1];
11618 gd2 = gudest_array[2];
11619 for (
int i = 0; i < height; i++) {
11637 size_t frmsz = istrides[1] * (height >> 1);
11639 swap_chroma_planes(layer);
11643 lives_memcpy(gusrc_array[1], (
void **)gusrc_array[2], frmsz);
11648 case WEED_PALETTE_YUV888:
11652 convert_quad_chroma_packed(gusrc_array, width, height, istrides, orowstride, gudest,
FALSE, isampling, iclamping);
11654 case WEED_PALETTE_YUVA8888:
11658 convert_quad_chroma_packed(gusrc_array, width, height, istrides, orowstride, gudest,
TRUE, isampling, iclamping);
11660 case WEED_PALETTE_YUV411:
11661 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11664 convert_yuv420_to_yuv411_frame(gusrc_array, width, height, (
yuv411_macropixel *)gudest,
FALSE, iclamping);
11667 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11672 case WEED_PALETTE_YUV422P:
11675 case WEED_PALETTE_RGB24:
11679 convert_yuv420p_to_rgb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
FALSE,
TRUE,
11682 case WEED_PALETTE_RGBA32:
11686 convert_yuv420p_to_rgb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
TRUE,
TRUE,
11689 case WEED_PALETTE_BGR24:
11693 convert_yuv420p_to_bgr_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
FALSE,
TRUE,
11696 case WEED_PALETTE_BGRA32:
11700 convert_yuv420p_to_bgr_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
TRUE,
TRUE,
11703 case WEED_PALETTE_ARGB32:
11707 convert_yuv420p_to_argb_frame(gusrc_array, width, height,
TRUE, istrides, orowstride, gudest,
TRUE,
11710 case WEED_PALETTE_UYVY8888:
11711 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11715 convert_yuv422p_to_uyvy_frame(gusrc_array, width, height, istrides, orowstride, gudest);
11717 case WEED_PALETTE_YUYV8888:
11718 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 1);
11722 convert_yuv422p_to_yuyv_frame(gusrc_array, width, height, istrides, orowstride, gudest);
11724 case WEED_PALETTE_YUV420P:
11725 case WEED_PALETTE_YVU420P:
11729 gudest_array[0] = gusrc_array[0];
11730 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
11732 convert_halve_chroma(gusrc_array, width >> 1, height >> 1, istrides, ostrides, gudest_array, iclamping);
11733 gusrc_array[0] = NULL;
11735 weed_set_int_value(layer, WEED_LEAF_YUV_SAMPLING, isampling);
11737 case WEED_PALETTE_YUV444P:
11741 gudest_array[0] = gusrc_array[0];
11742 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 3, (
void **)gudest_array);
11744 convert_double_chroma(gusrc_array, width >> 1, height >> 1, istrides, ostrides, gudest_array, iclamping);
11745 gusrc_array[0] = NULL;
11748 case WEED_PALETTE_YUVA4444P:
11752 gudest_array[0] = gusrc_array[0];
11753 weed_set_voidptr_array(layer, WEED_LEAF_PIXEL_DATA, 4, (
void **)gudest_array);
11755 convert_double_chroma(gusrc_array, width >> 1, height >> 1, istrides, ostrides, gudest_array, iclamping);
11757 gusrc_array[0] = NULL;
11760 case WEED_PALETTE_YUV888:
11764 convert_double_chroma_packed(gusrc_array, width, height, istrides, orowstride, gudest,
FALSE, isampling, iclamping);
11766 case WEED_PALETTE_YUVA8888:
11770 convert_double_chroma_packed(gusrc_array, width, height, istrides, orowstride, gudest,
TRUE, isampling, iclamping);
11772 case WEED_PALETTE_YUV411:
11773 weed_set_int_value(layer, WEED_LEAF_WIDTH, width >> 2);
11776 convert_yuv420_to_yuv411_frame(gusrc_array, width, height, (
yuv411_macropixel *)gudest,
TRUE, iclamping);
11779 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11784 case WEED_PALETTE_YUV411:
11787 case WEED_PALETTE_RGB24:
11788 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11792 convert_yuv411_to_rgb_frame((
yuv411_macropixel *)gusrc, width, height, orowstride, gudest,
FALSE, iclamping);
11794 case WEED_PALETTE_RGBA32:
11795 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11799 convert_yuv411_to_rgb_frame((
yuv411_macropixel *)gusrc, width, height, orowstride, gudest,
TRUE, iclamping);
11801 case WEED_PALETTE_BGR24:
11802 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11806 convert_yuv411_to_bgr_frame((
yuv411_macropixel *)gusrc, width, height, orowstride, gudest,
FALSE, iclamping);
11808 case WEED_PALETTE_BGRA32:
11809 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11813 convert_yuv411_to_bgr_frame((
yuv411_macropixel *)gusrc, width, height, orowstride, gudest,
TRUE, iclamping);
11815 case WEED_PALETTE_ARGB32:
11816 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11820 convert_yuv411_to_argb_frame((
yuv411_macropixel *)gusrc, width, height, orowstride, gudest, iclamping);
11822 case WEED_PALETTE_YUV888:
11823 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11828 case WEED_PALETTE_YUVA8888:
11829 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11832 convert_yuv411_to_yuv888_frame((
yuv411_macropixel *)gusrc, width, height, gudest,
TRUE, iclamping);
11834 case WEED_PALETTE_YUV444P:
11835 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11838 convert_yuv411_to_yuvp_frame((
yuv411_macropixel *)gusrc, width, height, gudest_array,
FALSE, iclamping);
11840 case WEED_PALETTE_YUVA4444P:
11841 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11844 convert_yuv411_to_yuvp_frame((
yuv411_macropixel *)gusrc, width, height, gudest_array,
TRUE, iclamping);
11846 case WEED_PALETTE_UYVY8888:
11847 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11852 case WEED_PALETTE_YUYV8888:
11853 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 1);
11858 case WEED_PALETTE_YUV422P:
11859 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11862 convert_yuv411_to_yuv422_frame((
yuv411_macropixel *)gusrc, width, height, gudest_array, iclamping);
11864 case WEED_PALETTE_YUV420P:
11865 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11868 convert_yuv411_to_yuv420_frame((
yuv411_macropixel *)gusrc, width, height, gudest_array,
FALSE, iclamping);
11870 case WEED_PALETTE_YVU420P:
11871 weed_set_int_value(layer, WEED_LEAF_WIDTH, width << 2);
11874 convert_yuv411_to_yuv420_frame((
yuv411_macropixel *)gusrc, width, height, gudest_array,
TRUE, iclamping);
11877 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11883 lives_printerr(
"Invalid palette conversion: %s to %s not written yet !!\n",
weed_palette_get_name(inpl),
11888 #ifdef WEED_ADVANCED_PALETTES
11899 if (new_gamma_type != WEED_GAMMA_UNKNOWN &&
can_inline_gamma(inpl, outpl)) {
11904 weed_leaf_delete(layer, WEED_LEAF_YUV_CLAMPING);
11905 weed_leaf_delete(layer, WEED_LEAF_YUV_SUBSPACE);
11906 weed_leaf_delete(layer, WEED_LEAF_YUV_SAMPLING);
11908 weed_set_int_value(layer, WEED_LEAF_YUV_CLAMPING, oclamping);
11911 weed_set_int_value(layer, WEED_LEAF_YUV_SUBSPACE, WEED_YUV_SUBSPACE_BT709);
11913 weed_set_int_value(layer, WEED_LEAF_YUV_SUBSPACE, WEED_YUV_SUBSPACE_YCBCR);
11915 if (!weed_plant_has_leaf(layer, WEED_LEAF_YUV_SAMPLING)) weed_set_int_value(layer,
11916 WEED_LEAF_YUV_SAMPLING, WEED_YUV_SAMPLING_DEFAULT);
11920 #ifdef WEED_ADVANCED_PALETTES
11923 if (outpl == WEED_PALETTE_YVU420P) swap_chroma_planes(layer);
11936 }
else if (gusrc_array) {
11947 WEED_GAMMA_UNKNOWN);
11954 LiVESPixbuf *pixbuf;
11960 case WEED_PALETTE_RGB24:
11961 case WEED_PALETTE_BGR24:
11968 case WEED_PALETTE_RGBA32:
11969 case WEED_PALETTE_BGRA32:
11976 case WEED_PALETTE_ARGB32:
11992 LiVESPixbuf *pixbuf;
11993 int channels = has_alpha ? 4 : 3;
11997 (LiVESPixbufDestroyNotify)lives_free_buffer, NULL);
12003 int gamma_type = WEED_GAMMA_UNKNOWN;
12006 if (weed_plant_has_leaf(layer, WEED_LEAF_GAMMA_TYPE)) {
12007 gamma_type = weed_get_int_value(layer, WEED_LEAF_GAMMA_TYPE, &
error);
12009 if (gamma_type == WEED_GAMMA_UNKNOWN) {
12010 break_me(
"weed_layer_get_gamma with unk. gamma");
12012 gamma_type = WEED_GAMMA_SRGB;
12025 uint8_t *gamma_lut = NULL;
12026 const char *type = is_in ? WEED_LEAF_IN_PARAMETERS : WEED_LEAF_OUT_PARAMETERS;
12029 int ogamma_type, oogamma_type = WEED_GAMMA_UNKNOWN;
12030 int pptype, pcspace, ptype, nvals, qvals;
12034 params = weed_get_plantptr_array_counted(inst, type, &nparms);
12035 if (!nparms)
return;
12037 for (
int i = 0; i < nparms; i++) {
12039 if (!(nvals = weed_leaf_num_elements(param, WEED_LEAF_VALUE)))
continue;
12040 ptmpl = weed_get_plantptr_value(param, WEED_LEAF_TEMPLATE, NULL);
12042 if (pptype != WEED_PARAM_COLOR)
continue;
12044 ptype = weed_leaf_seed_type(ptmpl, WEED_LEAF_DEFAULT);
12046 if (ptype != WEED_SEED_INT) gamma_type = WEED_GAMMA_SRGB;
12048 if (!
prefs->
apply_gamma || !weed_plant_has_leaf(param, WEED_LEAF_GAMMA_TYPE)) {
12049 ogamma_type = WEED_GAMMA_SRGB;
12051 ogamma_type = weed_get_int_value(param, WEED_LEAF_GAMMA_TYPE, NULL);
12054 if (ogamma_type != oogamma_type && gamma_type != ogamma_type) {
12055 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
12056 gamma_lut = create_gamma_lut(1.0, ogamma_type, gamma_type);
12057 if (!gamma_lut)
break;
12058 oogamma_type = ogamma_type;
12061 weed_set_int_value(param, WEED_LEAF_GAMMA_TYPE, gamma_type);
12062 weed_leaf_set_flags(param, WEED_LEAF_GAMMA_TYPE, (weed_leaf_get_flags(param, WEED_LEAF_GAMMA_TYPE) |
12063 WEED_FLAG_IMMUTABLE | WEED_FLAG_UNDELETABLE));
12066 if (gamma_type == ogamma_type)
continue;
12069 pcspace = weed_get_int_value(ptmpl, WEED_LEAF_COLORSPACE, NULL);
12070 if (pcspace == WEED_COLORSPACE_RGBA) qvals = 4;
12071 ivals = weed_get_int_array(param, WEED_LEAF_VALUE, NULL);
12073 for (
int j = 0; j < nvals; j += qvals) {
12074 for (
int k = 0; k < 3; k++) {
12075 ivals[j + k] = gamma_lut[ivals[j + k]];
12078 lives_gamma_lut_free(gamma_lut);
12079 weed_set_int_array(param, WEED_LEAF_VALUE, nvals, ivals);
12081 weed_set_int_value(param, WEED_LEAF_GAMMA_TYPE, gamma_type);
12082 weed_leaf_set_flags(param, WEED_LEAF_GAMMA_TYPE, (weed_leaf_get_flags(param, WEED_LEAF_GAMMA_TYPE) |
12083 WEED_FLAG_IMMUTABLE | WEED_FLAG_UNDELETABLE));
12087 if (gamma_lut) lives_gamma_lut_free(gamma_lut);
12092 static void *gamma_convert_layer_thread(
void *data) {
12094 uint8_t *pixels = (uint8_t *)ccparams->
src;
12096 uint8_t *end = pixels + ccparams->
vsize * rowstride;
12097 int psize = ccparams->
psize, px = 3;
12098 int widthx = ccparams->
hsize * psize;
12099 int start = ccparams->
xoffset;
12100 uint8_t *gamma_lut = ccparams->
lut;
12101 if (!gamma_lut)
return NULL;
12103 if (psize < px) px = psize;
12106 for (; pixels < end; pixels += rowstride) {
12108 for (
int j = start; j < widthx; j += psize) {
12109 for (
int k = 0; k < px; k++) {
12111 pixels[j + k] = gamma_lut[pixels[j + k]];
12125 boolean may_thread) {
12134 if (gamma_type == lgamma_type && fileg == 1.0)
return TRUE;
12139 uint8_t *gamma_lut;
12146 int xdheight =
CEIL((
double)height / (
double)nfx_threads, 4);
12147 uint8_t *end = pixels + (y + height) * orowstride;
12149 pixels += y * orowstride;
12152 gamma_lut = create_gamma_lut(fileg, lgamma_type, gamma_type);
12154 gamma_lut = create_gamma_lut(1.0, lgamma_type, gamma_type);
12157 for (
int i = nfx_threads - 1; i >= 0; i--) {
12158 dheight = xdheight;
12160 if ((pixels + dheight * i * orowstride) < end) {
12161 ccparams[i].
src = pixels + dheight * i * orowstride;
12162 ccparams[i].
hsize = width;
12163 ccparams[i].
xoffset = x * psize;
12165 if (dheight * (i + 1) > (height - 4)) {
12166 dheight = height - (dheight * i);
12168 ccparams[i].
vsize = dheight;
12169 ccparams[i].
psize = psize;
12172 ccparams[i].
lut = (
void *)gamma_lut;
12174 if (i == 0) gamma_convert_layer_thread(&ccparams[i]);
12181 for (
int i = 1; i < nthreads; i++) {
12185 lives_gamma_lut_free(gamma_lut);
12187 weed_set_int_value(layer, WEED_LEAF_GAMMA_TYPE, gamma_type);
12205 weed_set_int_value(layer, WEED_LEAF_GAMMA_TYPE, WEED_GAMMA_LINEAR);
12216 LiVESPixbuf *pixbuf;
12218 uint8_t *pixel_data, *pixels, *end;
12220 boolean cheat =
FALSE, done;
12226 int rowstride, orowstride;
12229 if (!layer)
return NULL;
12251 pixel_data = (uint8_t *)weed_get_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, NULL);
12257 xpalette = WEED_PALETTE_END;
12266 switch (xpalette) {
12267 case WEED_PALETTE_RGB24:
12268 case WEED_PALETTE_BGR24:
12269 case WEED_PALETTE_YUV888:
12283 case WEED_PALETTE_RGBA32:
12284 case WEED_PALETTE_BGRA32:
12286 case WEED_PALETTE_ARGB32:
12289 case WEED_PALETTE_ARGB32:
12292 case WEED_PALETTE_YUVA8888:
12308 palette = WEED_PALETTE_RGBA32;
12311 palette = WEED_PALETTE_RGB24;
12317 if (!cheat && LIVES_IS_PIXBUF(pixbuf)) {
12319 boolean done =
FALSE;
12323 if (irowstride > orowstride) rowstride = orowstride;
12324 else rowstride = irowstride;
12325 end = pixels + orowstride * height;
12327 for (; pixels < end && !done; pixels += orowstride) {
12328 if (pixels + orowstride >= end) {
12333 if (rowstride < orowstride)
lives_memset(pixels + rowstride, 255, orowstride - rowstride);
12334 pixel_data += irowstride;
12349 if (pal == WEED_PALETTE_YUV888 && clamped == WEED_YUV_CLAMPING_UNCLAMPED) pal = WEED_PALETTE_RGB24;
12350 if (pal == WEED_PALETTE_YUVA8888 && clamped == WEED_YUV_CLAMPING_UNCLAMPED) pal = WEED_PALETTE_RGBA32;
12353 if (in_out && sws_isSupportedInput(weed_palette_to_avi_pix_fmt(pal, &clamped)))
return TRUE;
12354 else if (sws_isSupportedOutput(weed_palette_to_avi_pix_fmt(pal, &clamped)))
return TRUE;
12356 if (pal == WEED_PALETTE_RGB24 || pal == WEED_PALETTE_RGBA32 || pal == WEED_PALETTE_BGR24 ||
12357 pal == WEED_PALETTE_BGRA32)
return TRUE;
12376 for (i = 0; i < height; i++) {
12377 for (j = offs; j < row; j += 4) {
12387 boolean planar =
FALSE;
12402 rowstride = rowstrides[offs];
12411 frsize = height * rowstride;
12413 for (
register int i = 0; i < frsize; i += rowstride) {
12414 for (
register int j = offs; j < width; j += psize) {
12415 pixel_data[i + j] = 255;
12425 void **pixel_data, **new_pixel_data;
12434 boolean needs_change =
FALSE;
12439 for (i = 0; i < nplanes; i++) {
12441 if (cxrow != rowstrides[i]) {
12443 needs_change =
TRUE;
12447 if (!needs_change) {
12454 if (!old_layer)
return FALSE;
12457 THREADVAR(rowstride_alignment_hint) = -1;
12469 if (!new_pixel_data) {
12478 for (i = 0; i < nplanes; i++) {
12481 for (j = 0; j < xheight; j++) {
12482 lives_memcpy((uint8_t *)new_pixel_data[i] + j * cxrow, (uint8_t *)pixel_data[i] + j * rowstrides[i], cxrow);
12499 static void *swscale_threadfunc(
void *arg) {
12500 lives_sw_params *swparams = (lives_sw_params *)arg;
12501 #ifdef USE_RESTHREAD
12503 if (swparams->layer) {
12504 int last = swparams->iheight * (swparams->thread_id + 1);
12511 swparams->ret = sws_scale(swparams->swscale, (
const uint8_t *
const *)swparams->ipd, swparams->irw,
12512 0, swparams->iheight, (uint8_t *
const *)swparams->opd, swparams->orw);
12514 if (swparams->file_gamma != 1.) {
12516 swparams->ret,
FALSE);
12540 LiVESPixbuf *pixbuf = NULL;
12541 LiVESPixbuf *new_pixbuf = NULL;
12543 boolean retval =
TRUE;
12554 boolean resolved =
FALSE;
12555 int xpalette, xopal_hint;
12557 #ifdef USE_RESTHREAD
12558 boolean progscan =
FALSE;
12561 if (!weed_plant_has_leaf(layer, WEED_LEAF_PIXEL_DATA)) {
12568 if (width <= 0 || height <= 0) {
12575 #ifdef DEBUG_RESIZE
12576 g_print(
"resizing layer size %d X %d with palette %s to %d X %d, hinted %s\n", iwidth, iheight,
12581 iwidth = (iwidth >> 1) << 1;
12582 iheight = (iheight >> 1) << 1;
12584 if (width < 4) width = 4;
12585 if (height < 4) height = 4;
12587 if (iwidth != width || iheight != height) {
12589 width = (width >> 1) << 1;
12590 height = (height >> 1) << 1;
12592 if (iwidth == width && iheight == height)
return TRUE;
12604 oclamp_hint = iclamping = (weed_get_int_value(layer, WEED_LEAF_YUV_CLAMPING, NULL));
12615 if (iwidth == width && iheight == height)
return TRUE;
12616 #ifdef DEBUG_RESIZE
12628 oclamp_hint = iclamping;
12636 oclamp_hint = iclamping;
12646 xopal_hint = opal_hint;
12648 if (
palette == WEED_PALETTE_YUV888) {
12649 if (opal_hint == WEED_PALETTE_YUV888 || opal_hint == WEED_PALETTE_YUVA8888) {
12650 if (iclamping == WEED_YUV_CLAMPING_CLAMPED) {
12653 #ifdef DEBUG_RESIZE
12657 if (iclamping == WEED_YUV_CLAMPING_UNCLAMPED) {
12658 xpalette = WEED_PALETTE_RGB24;
12659 oclamp_hint = WEED_YUV_CLAMPING_UNCLAMPED;
12661 if (opal_hint == WEED_PALETTE_YUV888) {
12662 xopal_hint = WEED_PALETTE_RGB24;
12664 xopal_hint = WEED_PALETTE_RGBA32;
12666 #ifdef DEBUG_RESIZE
12674 #ifdef DEBUG_RESIZE
12678 }
else if (
palette == WEED_PALETTE_YUVA8888) {
12679 if (opal_hint == WEED_PALETTE_YUV888 || opal_hint == WEED_PALETTE_YUVA8888) {
12680 if (iclamping == WEED_YUV_CLAMPING_CLAMPED) {
12684 if (iclamping == WEED_YUV_CLAMPING_UNCLAMPED) {
12685 xpalette = WEED_PALETTE_RGBA32;
12686 oclamp_hint = WEED_YUV_CLAMPING_UNCLAMPED;
12688 if (opal_hint == WEED_PALETTE_YUVA8888) {
12689 xopal_hint = WEED_PALETTE_RGBA32;
12691 xopal_hint = WEED_PALETTE_RGB24;
12693 #ifdef DEBUG_RESIZE
12701 #ifdef DEBUG_RESIZE
12710 if (iwidth == width && iheight == height)
return TRUE;
12712 if (opal_hint == WEED_PALETTE_YUV888) opal_hint = xopal_hint = WEED_PALETTE_YUV444P;
12713 else if (opal_hint == WEED_PALETTE_YUVA8888) opal_hint = xopal_hint = WEED_PALETTE_YUVA4444P;
12719 void **in_pixel_data, **out_pixel_data;
12721 int *irowstrides, *orowstrides;
12725 swpixfmt ipixfmt, opixfmt;
12729 const uint8_t *ipd[4], *opd[4];
12730 int irw[4], orw[4];
12734 lives_sw_params *swparams;
12736 swsctx_block *ctxblock;
12742 int subspace = WEED_YUV_SUBSPACE_YUV;
12743 int inplanes, oplanes;
12755 av_log_set_level(AV_LOG_FATAL);
12757 THREADVAR(rowstride_alignment_hint) = 16;
12759 if (interp == LIVES_INTERP_BEST) {
12760 if (width > iwidth || height > iheight)
12761 flags = SWS_LANCZOS;
12763 flags = SWS_BICUBIC;
12764 }
else if (interp == LIVES_INTERP_FAST) flags = SWS_FAST_BILINEAR;
12765 else flags = SWS_BILINEAR;
12767 ipixfmt = weed_palette_to_avi_pix_fmt(xpalette, &iclamping);
12768 opixfmt = weed_palette_to_avi_pix_fmt(xopal_hint, &oclamp_hint);
12770 for (i = 0; i < 4; i++) {
12772 if (i < inplanes) {
12773 ipd[i] = in_pixel_data[i];
12774 irw[i] = irowstrides[i];
12813 if (new_gamma_type == WEED_GAMMA_BT709) subspace = WEED_YUV_SUBSPACE_BT709;
12816 subspace = WEED_YUV_SUBSPACE_BT709;
12819 for (i = 0; i < 4; i++) {
12822 opd[i] = out_pixel_data[i];
12823 orw[i] = orowstrides[i];
12834 if ((height | iheight) & 3)
break;
12839 swparams = (lives_sw_params *)
lives_calloc(nthrds,
sizeof(lives_sw_params));
12843 swscale = sws_getCachedContext(swscale, iwidth, iheight, ipixfmt, width, height, opixfmt, flags, NULL, NULL, NULL);
12844 sws_setColorspaceDetails(swscale, sws_getCoefficients((subspace == WEED_YUV_SUBSPACE_BT709)
12845 ? SWS_CS_ITU709 : SWS_CS_ITU601), iclamping,
12846 sws_getCoefficients((subspace == WEED_YUV_SUBSPACE_BT709)
12847 ? SWS_CS_ITU709 : SWS_CS_ITU601), oclamp_hint, 0, 1 << 16, 1 << 16);
12854 #ifdef DEBUG_RESIZE
12855 g_print(
"before resize with swscale: layer size %d X %d with palette %s to %d X %d, hinted %s,\n"
12856 "masquerading as %s (avpixfmt %d to avpixfmt %d)\n",
12863 ctxblock = sws_getblock(nthrds, iwidth, iheight, irw, ipixfmt, width, height, orw, opixfmt, flags,
12864 subspace, iclamping, oclamp_hint);
12865 offset = ctxblock->offset;
12866 for (
int sl = 0; sl < nthrds; sl++) {
12867 swparams[sl].thread_id = sl;
12868 swparams[sl].iheight = iheight;
12869 swparams[sl].width = width;
12870 swparams[sl].file_gamma = 1.;
12871 swparams[sl].swscale = swscalep[sl + offset] =
12872 sws_getCachedContext(swscalep[sl + offset], iwidth, iheight, ipixfmt, width,
12873 height, opixfmt, flags, NULL, NULL, NULL);
12875 if (!swparams[sl].swscale) {
12879 swparams[sl].layer = layer;
12880 swparams[sl].file_gamma = weed_get_double_value(layer,
"file_gamma", NULL);
12881 if (swparams[sl].file_gamma == 0.) swparams[sl].file_gamma = 1.;
12883 sws_setColorspaceDetails(swparams[sl].swscale,
12884 sws_getCoefficients((subspace == WEED_YUV_SUBSPACE_BT709)
12885 ? SWS_CS_ITU709 : SWS_CS_ITU601), iclamping,
12886 sws_getCoefficients((subspace == WEED_YUV_SUBSPACE_BT709)
12887 ? SWS_CS_ITU709 : SWS_CS_ITU601), oclamp_hint, 0, 65536, 65536);
12888 for (i = 0; i < 4; i++) {
12890 swparams[sl].ipd[i] =
12891 ipd[i] + (size_t)(sl * irw[i] * iheight
12894 swparams[sl].ipd[i] = NULL;
12897 swparams[sl].opd[i] =
12898 opd[i] + (size_t)(sl * orw[i] * height
12901 swparams[sl].opd[i] = NULL;
12903 swparams[sl].irw = irw;
12904 swparams[sl].orw = orw;
12906 else swscale_threadfunc(&swparams[sl]);
12911 for (
int sl = 0; sl < nthrds - 1; sl++) {
12912 if (swparams[sl].swscale) {
12914 height += swparams[sl].ret;
12915 }
else height += iheight;
12918 sws_freeblock(ctxblock);
12922 #ifdef USE_RESTHREAD
12924 while ((scan = weed_get_int_value(layer,
WEED_LEAF_PROGSCAN, NULL)) > 0 && scan < iheight)
12927 height = sws_scale(swscale, (
const uint8_t *
const *)ipd, irw, 0, iheight,
12928 (uint8_t *
const *)opd, orw);
12932 #ifdef DEBUG_RESIZE
12933 g_print(
"after resize with swscale: layer size %d X %d, palette %s (assumed succesful)\n",
12957 if (iwidth == width && iheight == height)
return TRUE;
12962 case WEED_PALETTE_YUV888:
12963 case WEED_PALETTE_YUVA8888:
12964 if (iclamping == WEED_YUV_CLAMPING_CLAMPED) {
12972 case WEED_PALETTE_RGB24:
12973 case WEED_PALETTE_BGR24:
12974 case WEED_PALETTE_RGBA32:
12975 case WEED_PALETTE_BGRA32:
12993 lives_printerr(
"Warning: resizing unknown palette %d\n",
palette);
12994 break_me(
"resize_layer with unk. pal");
13000 lives_printerr(
"unable to scale layer to %d x %d for palette %d\n", width, height,
palette);
13016 LiVESInterpType interp,
int tpal,
int tclamp) {
13020 int *rowstrides, *irowstrides;
13022 void **new_pixel_data;
13023 uint8_t *dst, *src;
13024 int lwidth, lheight;
13025 int offs_x = 0, offs_y = 0;
13030 if (!width || !height || !nwidth || !nheight)
return TRUE;
13031 if (nwidth < width) nwidth = width;
13032 if (nheight < height) nheight = height;
13035 if (nheight == height && nwidth == width) {
13036 resize_layer(layer, width, height, interp, tpal, tclamp);
13044 if (lwidth != width || lheight != height) {
13055 if (!old_layer)
return FALSE;
13080 if (nwidth < width || nheight < height || !new_pixel_data) {
13085 offs_x = (nwidth - width + 1) >> 1;
13086 offs_y = (nheight - height + 1) >> 1;
13092 case WEED_PALETTE_RGB24:
13093 case WEED_PALETTE_BGR24:
13094 case WEED_PALETTE_YUV888:
13096 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x * 3;
13097 src = (uint8_t *)pixel_data[0];
13098 for (i = 0; i < height; i++) {
13100 dst += rowstrides[0];
13101 src += irowstrides[0];
13106 case WEED_PALETTE_UYVY:
13107 case WEED_PALETTE_YUYV:
13111 case WEED_PALETTE_RGBA32:
13112 case WEED_PALETTE_BGRA32:
13113 case WEED_PALETTE_ARGB32:
13114 case WEED_PALETTE_YUVA8888:
13117 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x * 4;
13118 src = (uint8_t *)pixel_data[0];
13119 for (i = 0; i < height; i++) {
13121 dst += rowstrides[0];
13122 src += irowstrides[0];
13126 case WEED_PALETTE_YUV411:
13128 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x * 6;
13129 src = (uint8_t *)pixel_data[0];
13130 for (i = 0; i < height; i++) {
13132 dst += rowstrides[0];
13133 src += irowstrides[0];
13137 case WEED_PALETTE_YUV444P:
13138 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x;
13139 src = (uint8_t *)pixel_data[0];
13140 for (i = 0; i < height; i++) {
13142 dst += rowstrides[0];
13143 src += irowstrides[0];
13145 dst = (uint8_t *)new_pixel_data[1] + offs_y * rowstrides[1] + offs_x;
13146 src = (uint8_t *)pixel_data[1];
13147 for (i = 0; i < height; i++) {
13149 dst += rowstrides[1];
13150 src += irowstrides[1];
13152 dst = (uint8_t *)new_pixel_data[2] + offs_y * rowstrides[2] + offs_x;
13153 src = (uint8_t *)pixel_data[2];
13154 for (i = 0; i < height; i++) {
13156 dst += rowstrides[2];
13157 src += irowstrides[2];
13161 case WEED_PALETTE_YUVA4444P:
13162 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x;
13163 src = (uint8_t *)pixel_data[0];
13164 for (i = 0; i < height; i++) {
13166 dst += rowstrides[0];
13167 src += irowstrides[0];
13169 dst = (uint8_t *)new_pixel_data[1] + offs_y * rowstrides[1] + offs_x;
13170 src = (uint8_t *)pixel_data[1];
13171 for (i = 0; i < height; i++) {
13173 dst += rowstrides[1];
13174 src += irowstrides[1];
13176 dst = (uint8_t *)new_pixel_data[2] + offs_y * rowstrides[2] + offs_x;
13177 src = (uint8_t *)pixel_data[2];
13178 for (i = 0; i < height; i++) {
13180 dst += rowstrides[2];
13181 src += irowstrides[2];
13183 dst = (uint8_t *)new_pixel_data[3] + offs_y * rowstrides[3] + offs_x;
13184 src = (uint8_t *)pixel_data[3];
13185 for (i = 0; i < height; i++) {
13187 dst += rowstrides[3];
13188 src += irowstrides[3];
13192 case WEED_PALETTE_YUV422P:
13193 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x;
13194 src = (uint8_t *)pixel_data[0];
13195 for (i = 0; i < height; i++) {
13197 dst += rowstrides[0];
13198 src += irowstrides[0];
13202 dst = (uint8_t *)new_pixel_data[1] + offs_y * rowstrides[1] + offs_x;
13203 src = (uint8_t *)pixel_data[1];
13204 for (i = 0; i < height; i++) {
13206 dst += rowstrides[1];
13207 src += irowstrides[1];
13209 dst = (uint8_t *)new_pixel_data[2] + offs_y * rowstrides[2] + offs_x;
13210 src = (uint8_t *)pixel_data[2];
13211 for (i = 0; i < height; i++) {
13213 dst += rowstrides[2];
13214 src += irowstrides[2];
13218 case WEED_PALETTE_YUV420P:
13219 case WEED_PALETTE_YVU420P:
13220 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x;
13221 src = (uint8_t *)pixel_data[0];
13222 for (i = 0; i < height; i++) {
13224 dst += rowstrides[0];
13225 src += irowstrides[0];
13231 dst = (uint8_t *)new_pixel_data[1] + offs_y * rowstrides[1] + offs_x;
13232 src = (uint8_t *)pixel_data[1];
13233 for (i = 0; i < height; i++) {
13235 dst += rowstrides[1];
13236 src += irowstrides[1];
13238 dst = (uint8_t *)new_pixel_data[2] + offs_y * rowstrides[2] + offs_x;
13239 src = (uint8_t *)pixel_data[2];
13240 for (i = 0; i < height; i++) {
13242 dst += rowstrides[2];
13243 src += irowstrides[2];
13247 case WEED_PALETTE_RGBFLOAT:
13248 width *= 3 *
sizeof(float);
13249 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x * 3 *
sizeof(
float);
13250 src = (uint8_t *)pixel_data[0];
13251 for (i = 0; i < height; i++) {
13253 dst += rowstrides[0];
13254 src += irowstrides[0];
13258 case WEED_PALETTE_RGBAFLOAT:
13259 width *= 4 *
sizeof(float);
13260 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x * 4 *
sizeof(
float);
13261 src = (uint8_t *)pixel_data[0];
13262 for (i = 0; i < height; i++) {
13264 dst += rowstrides[0];
13265 src += irowstrides[0];
13269 case WEED_PALETTE_AFLOAT:
13270 width *=
sizeof(float);
13271 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x *
sizeof(
float);
13272 src = (uint8_t *)pixel_data[0];
13273 for (i = 0; i < height; i++) {
13275 dst += rowstrides[0];
13276 src += irowstrides[0];
13280 case WEED_PALETTE_A8:
13281 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + offs_x;
13282 src = (uint8_t *)pixel_data[0];
13283 for (i = 0; i < height; i++) {
13285 dst += rowstrides[0];
13286 src += irowstrides[0];
13291 case WEED_PALETTE_A1:
13293 dst = (uint8_t *)new_pixel_data[0] + offs_y * rowstrides[0] + (offs_x >> 3);
13294 src = (uint8_t *)pixel_data[0];
13295 for (i = 0; i < height; i++) {
13297 dst += rowstrides[0];
13298 src += irowstrides[0];
13350 void *in_pixel_data;
13356 if (!LIVES_IS_PIXBUF(pixbuf)) {
13358 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, 0);
13370 weed_set_int_value(layer, WEED_LEAF_ROWSTRIDES, rowstride);
13372 if (!weed_plant_has_leaf(layer, WEED_LEAF_CURRENT_PALETTE)) {
13374 if (nchannels == 4) weed_set_int_value(layer, WEED_LEAF_CURRENT_PALETTE, WEED_PALETTE_RGBA32);
13375 else weed_set_int_value(layer, WEED_LEAF_CURRENT_PALETTE, WEED_PALETTE_RGB24);
13382 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, in_pixel_data);
13384 palette = weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
13389 framesize =
ALIGN_CEIL(rowstride * height, 32);
13394 lives_memcpy(pixel_data, in_pixel_data, rowstride * (height - 1));
13397 lives_memcpy((uint8_t *)pixel_data + rowstride * (height - 1), (uint8_t *)in_pixel_data + rowstride * (height - 1),
13402 weed_set_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, pixel_data);
13404 palette = weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
13412 if (pal == WEED_PALETTE_RGB24)
return WEED_PALETTE_BGR24;
13413 if (pal == WEED_PALETTE_RGBA32)
return WEED_PALETTE_BGRA32;
13414 if (pal == WEED_PALETTE_BGR24)
return WEED_PALETTE_RGB24;
13415 if (pal == WEED_PALETTE_BGRA32)
return WEED_PALETTE_RGBA32;
13416 return WEED_PALETTE_END;
13428 if (*inpal == *outpal)
return FALSE;
13431 case WEED_PALETTE_RGB24:
13432 case WEED_PALETTE_RGBA32:
13434 case WEED_PALETTE_BGR24:
13435 case WEED_PALETTE_BGRA32:
13438 default:
return FALSE;
13440 case WEED_PALETTE_BGR24:
13441 case WEED_PALETTE_BGRA32:
13443 case WEED_PALETTE_RGB24:
13444 case WEED_PALETTE_RGBA32:
13445 case WEED_PALETTE_ARGB32:
13448 default:
return FALSE;
13450 case WEED_PALETTE_ARGB32:
13453 case WEED_PALETTE_BGR24:
13454 case WEED_PALETTE_BGRA32:
13457 default:
return FALSE;
13474 lives_painter_surface_t *surf;
13475 lives_painter_t *cairo;
13476 lives_painter_format_t cform;
13477 uint8_t *src, *dst, *pixel_data;
13479 int irowstride, orowstride;
13490 if (pal == WEED_PALETTE_A8) {
13491 cform = LIVES_PAINTER_FORMAT_A8;
13493 }
else if (pal == WEED_PALETTE_A1) {
13494 cform = LIVES_PAINTER_FORMAT_A1;
13495 widthx = width >> 3;
13499 cform = LIVES_PAINTER_FORMAT_ARGB32;
13500 widthx = width << 2;
13512 dst = pixel_data = (uint8_t *)
lives_calloc(1, height * orowstride);
13513 if (!pixel_data)
return NULL;
13514 for (i = 0; i < height; i++) {
13525 int flags = weed_get_int_value(layer, WEED_LEAF_FLAGS, NULL);
13530 weed_set_int_value(layer, WEED_LEAF_FLAGS, flags);
13535 if (!surf)
return NULL;
13538 #ifdef DEBUG_CAIRO_SURFACE
13539 g_print(
"VALaa1 = %d %p\n", cairo_surface_get_reference_count(surf), surf);
13553 lives_painter_format_t cform;
13555 int width, height, rowstride;
13570 #ifdef DEBUG_CAIRO_SURFACE
13571 g_print(
"VALaa2 = %d %p\n", cairo_surface_get_reference_count(surface), surface);
13586 case LIVES_PAINTER_FORMAT_ARGB32:
13604 case LIVES_PAINTER_FORMAT_A8:
13608 case LIVES_PAINTER_FORMAT_A1:
13623 LiVESPixbuf *pixbuf;
13624 LiVESError *
error = NULL;
13629 int miss = 0, bad = 0;
13636 for (
int i = 0; i < sfile->
frames; i++) {
13640 ximgtype = imgtype;
13642 if (!lives_file_test(fname, LIVES_FILE_TEST_EXISTS)) {
13644 for (j = 1; j < nimty; j++) {
13646 if (ximgtype == imgtype)
continue;
13649 if (lives_file_test(fname, LIVES_FILE_TEST_EXISTS))
break;
13673 if (!
resize_layer(layer, width, height, LIVES_INTERP_BEST, WEED_PALETTE_END,
13674 WEED_YUV_CLAMPING_UNCLAMPED)) {
13684 if (lives_file_test(fname_bak, LIVES_FILE_TEST_EXISTS))
lives_rm(fname_bak);
13690 lives_error_free(
error);
13700 if (nbad) *nbad = bad;
13701 if (nmiss) *nmiss = miss;
13714 if (
palette != WEED_PALETTE_END) {
13723 int YUV_clamping,
int YUV_sampling,
int YUV_subspace,
int gamma_type) {
13741 void **pd_array = NULL;
13769 weed_leaf_dup(layer, slayer, WEED_LEAF_ROWSTRIDES);
13770 weed_leaf_dup(layer, slayer, WEED_LEAF_PIXEL_DATA);
13771 weed_leaf_dup(layer, slayer, WEED_LEAF_NATURAL_SIZE);
13782 if (weed_leaf_set_flags(layer, WEED_LEAF_PIXEL_DATA,
13783 weed_leaf_get_flags(slayer, WEED_LEAF_PIXEL_DATA)));
13801 if (!layer)
return 0;
13823 if (!layer)
return;
13837 if (pd_elements > 0) {
13843 lives_painter_surface_t *surface = (lives_painter_surface_t *)weed_get_voidptr_value(layer,
13848 #ifdef DEBUG_CAIRO_SURFACE
13849 g_print(
"VALaa23rrr = %d %p\n", cairo_surface_get_reference_count(surface), surface);
13860 for (
int i = 0; i < pd_elements; i++) {
13861 if (pixel_data[i])
lives_free(pixel_data[i]);
13890 if (!layer)
return 0;
13893 if (refs > 0)
return refs;
13895 weed_plant_free(layer);
13901 if (!layer)
return 0;
13909 if (nplanes) *nplanes = 0;
13910 if (!layer)
return NULL;
13911 return weed_get_voidptr_array_counted(layer, WEED_LEAF_PIXEL_DATA, nplanes);
13916 if (!layer)
return NULL;
13917 return (uint8_t *)weed_get_voidptr_value(layer, WEED_LEAF_PIXEL_DATA, NULL);
13922 if (naudchans) *naudchans = 0;
13923 if (!layer)
return NULL;
13924 return (
float **)weed_get_voidptr_array_counted(layer, WEED_LEAF_AUDIO_DATA, naudchans);
13929 if (nplanes) *nplanes = 0;
13930 if (!layer)
return NULL;
13931 return weed_get_int_array_counted(layer, WEED_LEAF_ROWSTRIDES, nplanes);
13936 if (!layer)
return 0;
13937 return weed_get_int_value(layer, WEED_LEAF_ROWSTRIDES, NULL);
13942 if (!layer)
return -1;
13943 return weed_get_int_value(layer, WEED_LEAF_WIDTH, NULL);
13948 if (!layer)
return -1;
13954 if (!layer)
return -1;
13955 return weed_get_int_value(layer, WEED_LEAF_HEIGHT, NULL);
13960 if (!layer)
return 0;
13961 return weed_get_int_value(layer, WEED_LEAF_YUV_CLAMPING, NULL);
13966 if (!layer)
return 0;
13967 return weed_get_int_value(layer, WEED_LEAF_YUV_SAMPLING, NULL);
13972 if (!layer)
return 0;
13973 return weed_get_int_value(layer, WEED_LEAF_YUV_SUBSPACE, NULL);
13978 if (!layer)
return WEED_PALETTE_END;
13979 return weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
13984 if (!layer)
return WEED_PALETTE_END;
13988 return weed_get_int_value(layer, WEED_LEAF_CURRENT_PALETTE, NULL);
13994 return weed_get_int_value(layer, WEED_LEAF_AUDIO_RATE, NULL);
14000 return weed_get_int_value(layer, WEED_LEAF_AUDIO_CHANNELS, NULL);
14006 return weed_get_int_value(layer, WEED_LEAF_AUDIO_DATA_LENGTH, NULL);