6
#define COG_ENABLE_UNSTABLE_API 1
8
#include <cog/cogvirtframe.h>
17
extern gint8 cog_resample_table_4tap[256][4];
20
cog_frame_new_virtual (CogMemoryDomain * domain, CogFrameFormat format,
21
int width, int height)
23
CogFrame *frame = cog_frame_new ();
30
frame->format = format;
32
frame->height = height;
33
frame->domain = domain;
35
if (COG_FRAME_IS_PACKED (format)) {
36
frame->components[0].format = format;
37
frame->components[0].width = width;
38
frame->components[0].height = height;
39
if (format == COG_FRAME_FORMAT_AYUV) {
40
frame->components[0].stride = width * 4;
41
} else if (format == COG_FRAME_FORMAT_v216) {
42
frame->components[0].stride = ROUND_UP_POW2 (width, 1) * 4;
43
} else if (format == COG_FRAME_FORMAT_v210) {
44
frame->components[0].stride = ((width + 47) / 48) * 128;
46
frame->components[0].stride = ROUND_UP_POW2 (width, 1) * 2;
48
frame->components[0].length = frame->components[0].stride * height;
50
frame->components[0].data = frame->regions[0];
51
frame->components[0].v_shift = 0;
52
frame->components[0].h_shift = 0;
55
malloc (frame->components[0].stride * COG_FRAME_CACHE_SIZE);
56
for (i = 0; i < COG_FRAME_CACHE_SIZE; i++) {
57
frame->cached_lines[0][i] = 0;
59
frame->cache_offset[0] = 0;
60
frame->is_virtual = TRUE;
65
switch (COG_FRAME_FORMAT_DEPTH (format)) {
66
case COG_FRAME_FORMAT_DEPTH_U8:
69
case COG_FRAME_FORMAT_DEPTH_S16:
72
case COG_FRAME_FORMAT_DEPTH_S32:
76
g_return_val_if_reached (NULL);
81
h_shift = COG_FRAME_FORMAT_H_SHIFT (format);
82
v_shift = COG_FRAME_FORMAT_V_SHIFT (format);
83
chroma_width = ROUND_UP_SHIFT (width, h_shift);
84
chroma_height = ROUND_UP_SHIFT (height, v_shift);
86
frame->components[0].format = format;
87
frame->components[0].width = width;
88
frame->components[0].height = height;
89
frame->components[0].stride = ROUND_UP_4 (width * bytes_pp);
90
frame->components[0].length =
91
frame->components[0].stride * frame->components[0].height;
92
frame->components[0].v_shift = 0;
93
frame->components[0].h_shift = 0;
95
frame->components[1].format = format;
96
frame->components[1].width = chroma_width;
97
frame->components[1].height = chroma_height;
98
frame->components[1].stride = ROUND_UP_4 (chroma_width * bytes_pp);
99
frame->components[1].length =
100
frame->components[1].stride * frame->components[1].height;
101
frame->components[1].v_shift = v_shift;
102
frame->components[1].h_shift = h_shift;
104
frame->components[2].format = format;
105
frame->components[2].width = chroma_width;
106
frame->components[2].height = chroma_height;
107
frame->components[2].stride = ROUND_UP_4 (chroma_width * bytes_pp);
108
frame->components[2].length =
109
frame->components[2].stride * frame->components[2].height;
110
frame->components[2].v_shift = v_shift;
111
frame->components[2].h_shift = h_shift;
113
for (i = 0; i < 3; i++) {
114
CogFrameData *comp = &frame->components[i];
117
frame->regions[i] = malloc (comp->stride * COG_FRAME_CACHE_SIZE);
118
for (j = 0; j < COG_FRAME_CACHE_SIZE; j++) {
119
frame->cached_lines[i][j] = 0;
121
frame->cache_offset[i] = 0;
123
frame->is_virtual = TRUE;
129
cog_virt_frame_get_line (CogFrame * frame, int component, int i)
131
CogFrameData *comp = &frame->components[component];
134
g_return_val_if_fail (i >= 0, NULL);
135
g_return_val_if_fail (i < comp->height, NULL);
137
if (!frame->is_virtual) {
138
return COG_FRAME_DATA_GET_LINE (&frame->components[component], i);
141
if (i < frame->cache_offset[component]) {
142
g_warning ("cache failure: %d outside [%d,%d]", i,
143
frame->cache_offset[component],
144
frame->cache_offset[component] + COG_FRAME_CACHE_SIZE - 1);
146
frame->cache_offset[component] = i;
147
for (j = 0; j < COG_FRAME_CACHE_SIZE; j++) {
148
frame->cached_lines[component][j] = 0;
152
while (i >= frame->cache_offset[component] + COG_FRAME_CACHE_SIZE) {
153
j = frame->cache_offset[component] & (COG_FRAME_CACHE_SIZE - 1);
154
frame->cached_lines[component][j] = 0;
156
frame->cache_offset[component]++;
159
j = i & (COG_FRAME_CACHE_SIZE - 1);
160
if (!frame->cached_lines[component][j]) {
161
cog_virt_frame_render_line (frame,
162
COG_OFFSET (frame->regions[component], comp->stride * j), component, i);
163
frame->cached_lines[component][j] = 1;
166
return COG_OFFSET (frame->regions[component], comp->stride * j);
170
cog_virt_frame_render_line (CogFrame * frame, void *dest, int component, int i)
172
frame->render_line (frame, dest, component, i);
176
copy (CogFrame * frame, void *_dest, int component, int i)
178
uint8_t *dest = _dest;
181
src = cog_virt_frame_get_line (frame, component, i);
182
switch (COG_FRAME_FORMAT_DEPTH (frame->format)) {
183
case COG_FRAME_FORMAT_DEPTH_U8:
184
orc_memcpy (dest, src, frame->components[component].width);
186
case COG_FRAME_FORMAT_DEPTH_S16:
187
orc_memcpy (dest, src, frame->components[component].width * 2);
190
g_return_if_reached ();
196
cog_virt_frame_render (CogFrame * frame, CogFrame * dest)
200
g_return_if_fail (frame->width == dest->width);
201
g_return_if_fail (frame->height >= dest->height);
203
if (frame->is_virtual) {
204
for (k = 0; k < 3; k++) {
205
CogFrameData *comp = dest->components + k;
207
for (i = 0; i < dest->components[k].height; i++) {
208
cog_virt_frame_render_line (frame,
209
COG_FRAME_DATA_GET_LINE (comp, i), k, i);
213
for (k = 0; k < 3; k++) {
214
CogFrameData *comp = dest->components + k;
216
for (i = 0; i < dest->components[k].height; i++) {
217
copy (frame, COG_FRAME_DATA_GET_LINE (comp, i), k, i);
224
cog_virt_frame_render_downsample_horiz_cosite_3tap (CogFrame * frame,
225
void *_dest, int component, int i)
227
uint8_t *dest = _dest;
231
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
232
n_src = frame->virt_frame1->components[component].width;
234
cogorc_downsample_horiz_cosite_3tap (dest + 1,
235
(uint16_t *) (src + 1), (uint16_t *) (src + 3),
236
frame->components[component].width - 1);
243
x = 1 * src[CLAMP (j * 2 - 1, 0, n_src - 1)];
244
x += 2 * src[CLAMP (j * 2 + 0, 0, n_src - 1)];
245
x += 1 * src[CLAMP (j * 2 + 1, 0, n_src - 1)];
246
dest[j] = CLAMP ((x + 2) >> 2, 0, 255);
249
j = frame->components[component].width - 1;
250
x = 1 * src[CLAMP (j * 2 - 1, 0, n_src - 1)];
251
x += 2 * src[CLAMP (j * 2 + 0, 0, n_src - 1)];
252
x += 1 * src[CLAMP (j * 2 + 1, 0, n_src - 1)];
253
dest[j] = CLAMP ((x + 2) >> 2, 0, 255);
259
cog_virt_frame_render_downsample_horiz_halfsite (CogFrame * frame,
260
void *_dest, int component, int i)
262
uint8_t *dest = _dest;
269
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
270
n_src = frame->virt_frame1->components[component].width;
274
for (j = 0; j < frame->components[component].width; j++) {
276
x += 6 * src[CLAMP (j * 2 - 1, 0, n_src - 1)];
277
x += 26 * src[CLAMP (j * 2 + 0, 0, n_src - 1)];
278
x += 26 * src[CLAMP (j * 2 + 1, 0, n_src - 1)];
279
x += 6 * src[CLAMP (j * 2 + 2, 0, n_src - 1)];
280
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
284
for (j = 0; j < frame->components[component].width; j++) {
286
x += -3 * src[CLAMP (j * 2 - 2, 0, n_src - 1)];
287
x += 8 * src[CLAMP (j * 2 - 1, 0, n_src - 1)];
288
x += 27 * src[CLAMP (j * 2 + 0, 0, n_src - 1)];
289
x += 27 * src[CLAMP (j * 2 + 1, 0, n_src - 1)];
290
x += 8 * src[CLAMP (j * 2 + 2, 0, n_src - 1)];
291
x += -3 * src[CLAMP (j * 2 + 3, 0, n_src - 1)];
292
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
295
for (j = 0; j < frame->components[component].width; j++) {
297
const int taps8[8] = { -2, -4, 9, 29, 29, 9, -4, -2 };
298
for (k = 0; k < 8; k++) {
299
x += taps8[k] * src[CLAMP (j * 2 - 3 + k, 0, n_src - 1)];
301
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
305
for (j = 0; j < frame->components[component].width; j++) {
307
const int taps10[10] = { 1, -2, -5, 9, 29, 29, 9, -5, -2, 1 };
308
for (k = 0; k < 10; k++) {
309
x += taps10[k] * src[CLAMP (j * 2 - 4 + k, 0, n_src - 1)];
311
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
320
cog_virt_frame_new_horiz_downsample (CogFrame * vf, int n_taps)
322
CogFrame *virt_frame;
325
cog_frame_new_virtual (NULL, vf->format, vf->width / 2, vf->height);
326
virt_frame->virt_frame1 = vf;
327
virt_frame->param1 = n_taps;
330
virt_frame->render_line =
331
cog_virt_frame_render_downsample_horiz_cosite_3tap;
337
virt_frame->render_line = cog_virt_frame_render_downsample_horiz_halfsite;
340
g_return_val_if_reached (NULL);
347
cog_virt_frame_render_downsample_vert_cosite (CogFrame * frame,
348
void *_dest, int component, int i)
350
uint8_t *dest = _dest;
356
n_src = frame->virt_frame1->components[component].height;
357
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
358
CLAMP (i * 2 - 1, 0, n_src - 1));
359
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
360
CLAMP (i * 2 + 0, 0, n_src - 1));
361
src3 = cog_virt_frame_get_line (frame->virt_frame1, component,
362
CLAMP (i * 2 + 1, 0, n_src - 1));
364
cogorc_downsample_vert_cosite_3tap (dest, src1, src2, src3,
365
frame->components[component].width);
369
cog_virt_frame_render_downsample_vert_halfsite_2tap (CogFrame * frame,
370
void *_dest, int component, int i)
372
uint8_t *dest = _dest;
377
n_src = frame->virt_frame1->components[component].height;
378
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
379
CLAMP (i * 2, 0, n_src - 1));
380
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
381
CLAMP (i * 2 + 1, 0, n_src - 1));
383
cogorc_downsample_vert_halfsite_2tap (dest, src1, src2,
384
frame->components[component].width);
388
cog_virt_frame_render_downsample_vert_halfsite_4tap (CogFrame * frame,
389
void *_dest, int component, int i)
391
uint8_t *dest = _dest;
398
n_src = frame->virt_frame1->components[component].height;
399
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
400
CLAMP (i * 2 - 1, 0, n_src - 1));
401
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
402
CLAMP (i * 2, 0, n_src - 1));
403
src3 = cog_virt_frame_get_line (frame->virt_frame1, component,
404
CLAMP (i * 2 + 1, 0, n_src - 1));
405
src4 = cog_virt_frame_get_line (frame->virt_frame1, component,
406
CLAMP (i * 2 + 2, 0, n_src - 1));
408
cogorc_downsample_vert_halfsite_4tap (dest, src1, src2, src3, src4,
409
frame->components[component].width);
414
cog_virt_frame_render_downsample_vert_halfsite (CogFrame * frame,
415
void *_dest, int component, int i)
417
uint8_t *dest = _dest;
421
int taps = frame->param1;
424
n_src = frame->virt_frame1->components[component].height;
425
for (j = 0; j < taps; j++) {
426
src[j] = cog_virt_frame_get_line (frame->virt_frame1, component,
427
CLAMP (i * 2 - (taps - 2) / 2 + j, 0, n_src - 1));
432
for (j = 0; j < frame->components[component].width; j++) {
438
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
442
for (j = 0; j < frame->components[component].width; j++) {
450
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
454
for (j = 0; j < frame->components[component].width; j++) {
456
const int taps8[8] = { -2, -4, 9, 29, 29, 9, -4, -2 };
457
for (k = 0; k < 8; k++) {
458
x += taps8[k] * src[k][j];
460
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
464
for (j = 0; j < frame->components[component].width; j++) {
466
const int taps10[10] = { 1, -2, -5, 9, 29, 29, 9, -5, -2, 1 };
467
for (k = 0; k < 10; k++) {
468
x += taps10[k] * src[k][j];
470
dest[j] = CLAMP ((x + 32) >> 6, 0, 255);
474
g_return_if_reached ();
480
cog_virt_frame_new_vert_downsample (CogFrame * vf, int n_taps)
482
CogFrame *virt_frame;
485
cog_frame_new_virtual (NULL, vf->format, vf->width, vf->height / 2);
486
virt_frame->virt_frame1 = vf;
487
virt_frame->param1 = n_taps;
490
virt_frame->render_line =
491
cog_virt_frame_render_downsample_vert_halfsite_2tap;
494
virt_frame->render_line = cog_virt_frame_render_downsample_vert_cosite;
497
virt_frame->render_line =
498
cog_virt_frame_render_downsample_vert_halfsite_4tap;
501
virt_frame->render_line = cog_virt_frame_render_downsample_vert_halfsite;
509
cog_virt_frame_render_resample_vert_1tap (CogFrame * frame, void *_dest,
510
int component, int i)
512
uint8_t *dest = _dest;
515
int scale = frame->param1;
524
n_src = frame->virt_frame1->components[component].height;
525
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
526
CLAMP (src_i + 0, 0, n_src - 1));
528
orc_memcpy (dest, src1, frame->components[component].width);
532
cog_virt_frame_render_resample_vert_2tap (CogFrame * frame, void *_dest,
533
int component, int i)
535
uint8_t *dest = _dest;
539
int scale = frame->param1;
548
n_src = frame->virt_frame1->components[component].height;
549
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
550
CLAMP (src_i + 0, 0, n_src - 1));
551
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
552
CLAMP (src_i + 1, 0, n_src - 1));
555
memcpy (dest, src1, frame->components[component].width);
557
cogorc_combine2_u8 (dest, src1, src2,
558
256 - x, x, frame->components[component].width);
563
cog_virt_frame_render_resample_vert_4tap (CogFrame * frame, void *_dest,
564
int component, int i)
566
uint8_t *dest = _dest;
572
int scale = frame->param1;
581
n_src = frame->virt_frame1->components[component].height;
582
if (src_i < 1 || src_i >= n_src - 3) {
583
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
584
CLAMP (src_i - 1, 0, n_src - 1));
585
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
586
CLAMP (src_i + 0, 0, n_src - 1));
587
src3 = cog_virt_frame_get_line (frame->virt_frame1, component,
588
CLAMP (src_i + 1, 0, n_src - 1));
589
src4 = cog_virt_frame_get_line (frame->virt_frame1, component,
590
CLAMP (src_i + 2, 0, n_src - 1));
592
src1 = cog_virt_frame_get_line (frame->virt_frame1, component, src_i - 1);
593
src2 = cog_virt_frame_get_line (frame->virt_frame1, component, src_i + 0);
594
src3 = cog_virt_frame_get_line (frame->virt_frame1, component, src_i + 1);
595
src4 = cog_virt_frame_get_line (frame->virt_frame1, component, src_i + 2);
598
cogorc_combine4_u8 (dest, src1, src2, src3, src4,
599
cog_resample_table_4tap[x][0],
600
cog_resample_table_4tap[x][1],
601
cog_resample_table_4tap[x][2],
602
cog_resample_table_4tap[x][3], frame->components[component].width);
606
cog_virt_frame_new_vert_resample (CogFrame * vf, int height, int n_taps)
608
CogFrame *virt_frame;
610
virt_frame = cog_frame_new_virtual (NULL, vf->format, vf->width, height);
611
virt_frame->virt_frame1 = vf;
613
virt_frame->render_line = cog_virt_frame_render_resample_vert_1tap;
614
} else if (n_taps == 2) {
615
virt_frame->render_line = cog_virt_frame_render_resample_vert_2tap;
617
virt_frame->render_line = cog_virt_frame_render_resample_vert_4tap;
620
virt_frame->param1 = 256 * vf->height / height;
626
cog_virt_frame_render_resample_horiz_1tap (CogFrame * frame, void *_dest,
627
int component, int i)
629
uint8_t *dest = _dest;
633
int scale = frame->param1;
636
n_src = frame->virt_frame1->components[component].width;
637
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
640
for (j = 0; j < frame->components[component].width; j++) {
641
dest[j] = src[(acc >> 8)];
647
cog_virt_frame_render_resample_horiz_2tap (CogFrame * frame, void *_dest,
648
int component, int i)
650
uint8_t *dest = _dest;
654
int scale = frame->param1;
657
n_src = frame->virt_frame1->components[component].width;
658
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
661
for (j = 0; j < frame->components[component].width - 2; j++) {
670
z += (256 - y) * src[src_i + 0];
671
z += y * src[src_i + 1];
673
dest[j] = CLAMP (z, 0, 255);
676
for (; j < frame->components[component].width; j++) {
685
z += (256 - y) * src[CLAMP (src_i + 0, 0, n_src - 1)];
686
z += y * src[CLAMP (src_i + 1, 0, n_src - 1)];
688
dest[j] = CLAMP (z, 0, 255);
694
cog_virt_frame_render_resample_horiz_4tap (CogFrame * frame, void *_dest,
695
int component, int i)
697
uint8_t *dest = _dest;
701
int scale = frame->param1;
704
n_src = frame->virt_frame1->components[component].width;
705
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
708
for (j = 0; j < 1; j++) {
717
z += cog_resample_table_4tap[y][0] * src[CLAMP (src_i - 1, 0, n_src - 1)];
718
z += cog_resample_table_4tap[y][1] * src[CLAMP (src_i + 0, 0, n_src - 1)];
719
z += cog_resample_table_4tap[y][2] * src[CLAMP (src_i + 1, 0, n_src - 1)];
720
z += cog_resample_table_4tap[y][3] * src[CLAMP (src_i + 2, 0, n_src - 1)];
722
dest[j] = CLAMP (z, 0, 255);
725
for (; j < frame->components[component].width - 2; j++) {
734
z += cog_resample_table_4tap[y][0] * src[src_i - 1];
735
z += cog_resample_table_4tap[y][1] * src[src_i + 0];
736
z += cog_resample_table_4tap[y][2] * src[src_i + 1];
737
z += cog_resample_table_4tap[y][3] * src[src_i + 2];
739
dest[j] = CLAMP (z, 0, 255);
742
for (; j < frame->components[component].width; j++) {
751
z += cog_resample_table_4tap[y][0] * src[CLAMP (src_i - 1, 0, n_src - 1)];
752
z += cog_resample_table_4tap[y][1] * src[CLAMP (src_i + 0, 0, n_src - 1)];
753
z += cog_resample_table_4tap[y][2] * src[CLAMP (src_i + 1, 0, n_src - 1)];
754
z += cog_resample_table_4tap[y][3] * src[CLAMP (src_i + 2, 0, n_src - 1)];
756
dest[j] = CLAMP (z, 0, 255);
762
cog_virt_frame_new_horiz_resample (CogFrame * vf, int width, int n_taps)
764
CogFrame *virt_frame;
766
virt_frame = cog_frame_new_virtual (NULL, vf->format, width, vf->height);
767
virt_frame->virt_frame1 = vf;
769
virt_frame->render_line = cog_virt_frame_render_resample_horiz_1tap;
770
} else if (n_taps == 2) {
771
virt_frame->render_line = cog_virt_frame_render_resample_horiz_2tap;
773
virt_frame->render_line = cog_virt_frame_render_resample_horiz_4tap;
776
virt_frame->param1 = 256 * vf->width / width;
782
unpack_yuyv (CogFrame * frame, void *_dest, int component, int i)
784
uint8_t *dest = _dest;
787
src = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
791
orc_unpack_yuyv_y (dest, (void *) src, frame->width);
794
orc_unpack_yuyv_u (dest, (void *) src, frame->width / 2);
797
orc_unpack_yuyv_v (dest, (void *) src, frame->width / 2);
803
unpack_uyvy (CogFrame * frame, void *_dest, int component, int i)
805
uint8_t *dest = _dest;
808
src = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
812
orc_unpack_uyvy_y (dest, (void *) src, frame->width);
815
cogorc_unpack_axyz_0 (dest, (void *) src, frame->width / 2);
818
cogorc_unpack_axyz_2 (dest, (void *) src, frame->width / 2);
824
unpack_axyz (CogFrame * frame, void *_dest, int component, int i)
826
uint8_t *dest = _dest;
829
src = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
831
switch ((frame->param1 >> (12 - component * 4)) & 0xf) {
833
cogorc_unpack_axyz_0 (dest, src, frame->width);
836
cogorc_unpack_axyz_1 (dest, src, frame->width);
839
cogorc_unpack_axyz_2 (dest, src, frame->width);
842
cogorc_unpack_axyz_3 (dest, src, frame->width);
848
unpack_v210 (CogFrame * frame, void *_dest, int component, int i)
850
uint8_t *dest = _dest;
854
src = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
856
#define READ_UINT32_LE(a) (((uint8_t *)(a))[0] | (((uint8_t *)(a))[1]<<8) | \
857
(((uint8_t *)(a))[2]<<16) | (((uint8_t *)(a))[3]<<24))
860
for (j = 0; j < frame->width / 6; j++) {
862
((READ_UINT32_LE (src + j * 16 + 0) >> 10) & 0x3ff) >> 2;
864
((READ_UINT32_LE (src + j * 16 + 4) >> 0) & 0x3ff) >> 2;
866
((READ_UINT32_LE (src + j * 16 + 4) >> 20) & 0x3ff) >> 2;
868
((READ_UINT32_LE (src + j * 16 + 8) >> 10) & 0x3ff) >> 2;
870
((READ_UINT32_LE (src + j * 16 + 12) >> 0) & 0x3ff) >> 2;
872
((READ_UINT32_LE (src + j * 16 + 12) >> 20) & 0x3ff) >> 2;
874
if (j * 6 + 0 < frame->width) {
876
((READ_UINT32_LE (src + j * 16 + 0) >> 10) & 0x3ff) >> 2;
878
if (j * 6 + 1 < frame->width) {
880
((READ_UINT32_LE (src + j * 16 + 4) >> 0) & 0x3ff) >> 2;
882
if (j * 6 + 2 < frame->width) {
884
((READ_UINT32_LE (src + j * 16 + 4) >> 20) & 0x3ff) >> 2;
886
if (j * 6 + 3 < frame->width) {
888
((READ_UINT32_LE (src + j * 16 + 8) >> 10) & 0x3ff) >> 2;
890
if (j * 6 + 4 < frame->width) {
892
((READ_UINT32_LE (src + j * 16 + 12) >> 0) & 0x3ff) >> 2;
894
if (j * 6 + 5 < frame->width) {
896
((READ_UINT32_LE (src + j * 16 + 12) >> 20) & 0x3ff) >> 2;
900
for (j = 0; j < frame->width / 6; j++) {
902
((READ_UINT32_LE (src + j * 16 + 0) >> 0) & 0x3ff) >> 2;
904
((READ_UINT32_LE (src + j * 16 + 4) >> 10) & 0x3ff) >> 2;
906
((READ_UINT32_LE (src + j * 16 + 8) >> 20) & 0x3ff) >> 2;
908
if (j * 6 + 0 < frame->width) {
910
((READ_UINT32_LE (src + j * 16 + 0) >> 0) & 0x3ff) >> 2;
912
if (j * 6 + 2 < frame->width) {
914
((READ_UINT32_LE (src + j * 16 + 4) >> 10) & 0x3ff) >> 2;
916
if (j * 6 + 4 < frame->width) {
918
((READ_UINT32_LE (src + j * 16 + 8) >> 20) & 0x3ff) >> 2;
922
for (j = 0; j < frame->width / 6; j++) {
924
((READ_UINT32_LE (src + j * 16 + 0) >> 20) & 0x3ff) >> 2;
926
((READ_UINT32_LE (src + j * 16 + 8) >> 0) & 0x3ff) >> 2;
928
((READ_UINT32_LE (src + j * 16 + 12) >> 10) & 0x3ff) >> 2;
930
if (j * 6 + 0 < frame->width) {
932
((READ_UINT32_LE (src + j * 16 + 0) >> 20) & 0x3ff) >> 2;
934
if (j * 6 + 2 < frame->width) {
936
((READ_UINT32_LE (src + j * 16 + 8) >> 0) & 0x3ff) >> 2;
938
if (j * 6 + 4 < frame->width) {
940
((READ_UINT32_LE (src + j * 16 + 12) >> 10) & 0x3ff) >> 2;
947
unpack_v216 (CogFrame * frame, void *_dest, int component, int i)
949
uint8_t *dest = _dest;
953
src = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
957
for (j = 0; j < frame->width; j++) {
958
dest[j] = src[j * 4 + 2 + 1];
962
for (j = 0; j < frame->width / 2; j++) {
963
dest[j] = src[j * 8 + 0 + 1];
967
for (j = 0; j < frame->width / 2; j++) {
968
dest[j] = src[j * 8 + 4 + 1];
974
cog_virt_frame_new_unpack (CogFrame * vf)
976
CogFrame *virt_frame;
977
CogFrameFormat format;
978
CogFrameRenderFunc render_line;
981
if (!COG_FRAME_IS_PACKED (vf->format))
984
switch (vf->format) {
985
case COG_FRAME_FORMAT_YUYV:
986
format = COG_FRAME_FORMAT_U8_422;
987
render_line = unpack_yuyv;
989
case COG_FRAME_FORMAT_UYVY:
990
format = COG_FRAME_FORMAT_U8_422;
991
render_line = unpack_uyvy;
993
case COG_FRAME_FORMAT_v210:
994
format = COG_FRAME_FORMAT_U8_422;
995
render_line = unpack_v210;
997
case COG_FRAME_FORMAT_v216:
998
format = COG_FRAME_FORMAT_U8_422;
999
render_line = unpack_v216;
1001
case COG_FRAME_FORMAT_RGBx:
1002
case COG_FRAME_FORMAT_RGBA:
1003
format = COG_FRAME_FORMAT_U8_444;
1004
render_line = unpack_axyz;
1007
case COG_FRAME_FORMAT_BGRx:
1008
case COG_FRAME_FORMAT_BGRA:
1009
format = COG_FRAME_FORMAT_U8_444;
1010
render_line = unpack_axyz;
1013
case COG_FRAME_FORMAT_xRGB:
1014
case COG_FRAME_FORMAT_ARGB:
1015
case COG_FRAME_FORMAT_AYUV:
1016
format = COG_FRAME_FORMAT_U8_444;
1017
render_line = unpack_axyz;
1020
case COG_FRAME_FORMAT_xBGR:
1021
case COG_FRAME_FORMAT_ABGR:
1022
format = COG_FRAME_FORMAT_U8_444;
1023
render_line = unpack_axyz;
1027
g_return_val_if_reached (NULL);
1030
virt_frame = cog_frame_new_virtual (NULL, format, vf->width, vf->height);
1031
virt_frame->virt_frame1 = vf;
1032
virt_frame->render_line = render_line;
1033
virt_frame->param1 = param1;
1040
pack_yuyv (CogFrame * frame, void *_dest, int component, int i)
1042
uint32_t *dest = _dest;
1047
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1048
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1049
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1051
orc_pack_yuyv (dest, src_y, src_u, src_v, frame->width / 2);
1056
cog_virt_frame_new_pack_YUY2 (CogFrame * vf)
1058
CogFrame *virt_frame;
1060
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_YUYV,
1061
vf->width, vf->height);
1062
virt_frame->virt_frame1 = vf;
1063
virt_frame->render_line = pack_yuyv;
1069
pack_uyvy (CogFrame * frame, void *_dest, int component, int i)
1071
uint32_t *dest = _dest;
1076
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1077
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1078
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1080
orc_pack_uyvy (dest, src_y, src_u, src_v, frame->width / 2);
1084
cog_virt_frame_new_pack_UYVY (CogFrame * vf)
1086
CogFrame *virt_frame;
1088
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_YUYV,
1089
vf->width, vf->height);
1090
virt_frame->virt_frame1 = vf;
1091
virt_frame->render_line = pack_uyvy;
1097
pack_v216 (CogFrame * frame, void *_dest, int component, int i)
1099
uint8_t *dest = _dest;
1105
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1106
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1107
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1109
for (j = 0; j < frame->width / 2; j++) {
1110
dest[j * 8 + 0] = src_u[j];
1111
dest[j * 8 + 1] = src_u[j];
1112
dest[j * 8 + 2] = src_y[j * 2 + 0];
1113
dest[j * 8 + 3] = src_y[j * 2 + 0];
1114
dest[j * 8 + 4] = src_v[j];
1115
dest[j * 8 + 5] = src_v[j];
1116
dest[j * 8 + 6] = src_y[j * 2 + 1];
1117
dest[j * 8 + 7] = src_y[j * 2 + 1];
1122
cog_virt_frame_new_pack_v216 (CogFrame * vf)
1124
CogFrame *virt_frame;
1126
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_v216,
1127
vf->width, vf->height);
1128
virt_frame->virt_frame1 = vf;
1129
virt_frame->render_line = pack_v216;
1135
pack_v210 (CogFrame * frame, void *_dest, int component, int i)
1137
uint8_t *dest = _dest;
1144
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1145
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1146
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1148
#define TO_10(x) (((x)<<2) | ((x)>>6))
1149
#define WRITE_UINT32_LE(a,b) do { \
1150
((uint8_t *)(a))[0] = (b)&0xff; \
1151
((uint8_t *)(a))[1] = ((b)>>8)&0xff; \
1152
((uint8_t *)(a))[2] = ((b)>>16)&0xff; \
1153
((uint8_t *)(a))[3] = ((b)>>24)&0xff; \
1155
for (j = 0; j < frame->width / 6; j++) {
1156
int y0, y1, y2, y3, y4, y5;
1160
y0 = TO_10 (src_y[j * 6 + 0]);
1161
y1 = TO_10 (src_y[j * 6 + 1]);
1162
y2 = TO_10 (src_y[j * 6 + 2]);
1163
y3 = TO_10 (src_y[j * 6 + 3]);
1164
y4 = TO_10 (src_y[j * 6 + 4]);
1165
y5 = TO_10 (src_y[j * 6 + 5]);
1166
cb0 = TO_10 (src_u[j * 3 + 0]);
1167
cb1 = TO_10 (src_u[j * 3 + 1]);
1168
cb2 = TO_10 (src_u[j * 3 + 2]);
1169
cr0 = TO_10 (src_v[j * 3 + 0]);
1170
cr1 = TO_10 (src_v[j * 3 + 1]);
1171
cr2 = TO_10 (src_v[j * 3 + 2]);
1173
val = (cr0 << 20) | (y0 << 10) | (cb0);
1174
WRITE_UINT32_LE (dest + j * 16 + 0, val);
1176
val = (y2 << 20) | (cb1 << 10) | (y1);
1177
WRITE_UINT32_LE (dest + j * 16 + 4, val);
1179
val = (cb2 << 20) | (y3 << 10) | (cr1);
1180
WRITE_UINT32_LE (dest + j * 16 + 8, val);
1182
val = (y5 << 20) | (cr2 << 10) | (y4);
1183
WRITE_UINT32_LE (dest + j * 16 + 12, val);
1185
if (j * 6 < frame->width) {
1186
int y0, y1, y2, y3, y4, y5;
1190
y0 = ((j * 6 + 0) < frame->width) ? TO_10 (src_y[j * 6 + 0]) : 0;
1191
y1 = ((j * 6 + 1) < frame->width) ? TO_10 (src_y[j * 6 + 1]) : 0;
1192
y2 = ((j * 6 + 2) < frame->width) ? TO_10 (src_y[j * 6 + 2]) : 0;
1193
y3 = ((j * 6 + 3) < frame->width) ? TO_10 (src_y[j * 6 + 3]) : 0;
1194
y4 = ((j * 6 + 4) < frame->width) ? TO_10 (src_y[j * 6 + 4]) : 0;
1195
y5 = ((j * 6 + 5) < frame->width) ? TO_10 (src_y[j * 6 + 5]) : 0;
1196
cb0 = ((j * 6 + 0) < frame->width) ? TO_10 (src_u[j * 3 + 0]) : 0;
1197
cb1 = ((j * 6 + 2) < frame->width) ? TO_10 (src_u[j * 3 + 1]) : 0;
1198
cb2 = ((j * 6 + 4) < frame->width) ? TO_10 (src_u[j * 3 + 2]) : 0;
1199
cr0 = ((j * 6 + 0) < frame->width) ? TO_10 (src_v[j * 3 + 0]) : 0;
1200
cr1 = ((j * 6 + 2) < frame->width) ? TO_10 (src_v[j * 3 + 1]) : 0;
1201
cr2 = ((j * 6 + 4) < frame->width) ? TO_10 (src_v[j * 3 + 2]) : 0;
1203
val = (cr0 << 20) | (y0 << 10) | (cb0);
1204
WRITE_UINT32_LE (dest + j * 16 + 0, val);
1206
val = (y2 << 20) | (cb1 << 10) | (y1);
1207
WRITE_UINT32_LE (dest + j * 16 + 4, val);
1209
val = (cb2 << 20) | (y3 << 10) | (cr1);
1210
WRITE_UINT32_LE (dest + j * 16 + 8, val);
1212
val = (y5 << 20) | (cr2 << 10) | (y4);
1213
WRITE_UINT32_LE (dest + j * 16 + 12, val);
1219
cog_virt_frame_new_pack_v210 (CogFrame * vf)
1221
CogFrame *virt_frame;
1223
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_v210,
1224
vf->width, vf->height);
1225
virt_frame->virt_frame1 = vf;
1226
virt_frame->render_line = pack_v210;
1232
pack_ayuv (CogFrame * frame, void *_dest, int component, int i)
1234
uint32_t *dest = _dest;
1239
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1240
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1241
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1243
orc_pack_x123 (dest, src_y, src_u, src_v, 0xff, frame->width);
1247
cog_virt_frame_new_pack_AYUV (CogFrame * vf)
1249
CogFrame *virt_frame;
1251
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_AYUV,
1252
vf->width, vf->height);
1253
virt_frame->virt_frame1 = vf;
1254
virt_frame->render_line = pack_ayuv;
1260
pack_rgb (CogFrame * frame, void *_dest, int component, int i)
1262
uint8_t *dest = _dest;
1268
src_y = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1269
src_u = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1270
src_v = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1272
for (j = 0; j < frame->width; j++) {
1273
dest[j * 3 + 0] = src_y[j];
1274
dest[j * 3 + 1] = src_u[j];
1275
dest[j * 3 + 2] = src_v[j];
1280
cog_virt_frame_new_pack_RGB (CogFrame * vf)
1282
CogFrame *virt_frame;
1284
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_RGB,
1285
vf->width, vf->height);
1286
virt_frame->virt_frame1 = vf;
1287
virt_frame->render_line = pack_rgb;
1293
static const int cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = {
1295
-38, -74, 112, 32768,
1296
112, -94, -18, 32768,
1299
static const int cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = {
1301
-26, -87, 112, 32768,
1302
112, -102, -10, 32768,
1306
color_matrix_RGB_to_YCbCr (CogFrame * frame, void *_dest, int component, int i)
1308
uint8_t *dest = _dest;
1312
int *matrix = frame->virt_priv2;
1314
src1 = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1315
src2 = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1316
src3 = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1318
/* for RGB -> YUV */
1319
switch (component) {
1321
orc_matrix3_000_u8 (dest, src1, src2, src3,
1322
matrix[0], matrix[1], matrix[2], (16 << 8) + 128, 8, frame->width);
1325
orc_matrix3_000_u8 (dest, src1, src2, src3,
1326
matrix[4], matrix[5], matrix[6], (128 << 8) + 128, 8, frame->width);
1329
orc_matrix3_000_u8 (dest, src1, src2, src3,
1330
matrix[8], matrix[9], matrix[10], (128 << 8) + 128, 8, frame->width);
1339
static const int cog_ycbcr_to_rgb_matrix_6bit_sdtv[] = {
1345
static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = {
1347
42, -100, -208, 34707,
1351
static const int cog_ycbcr_to_rgb_matrix_6bit_hdtv[] = {
1357
static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = {
1359
42, -55, -136, 19681,
1364
color_matrix_YCbCr_to_RGB_6bit (CogFrame * frame, void *_dest, int component,
1367
uint8_t *dest = _dest;
1371
int *matrix = frame->virt_priv2;
1373
src1 = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1374
src2 = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1375
src3 = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1377
switch (component) {
1379
orc_matrix2_u8 (dest, src1, src3, matrix[0], matrix[2], matrix[3] + 32,
1383
orc_matrix3_u8 (dest, src1, src2, src3, matrix[4], matrix[5], matrix[6],
1384
matrix[7] + 32, frame->width);
1387
orc_matrix2_u8 (dest, src1, src2,
1388
matrix[8], matrix[9], matrix[11] + 32, frame->width);
1396
color_matrix_YCbCr_to_RGB_8bit (CogFrame * frame, void *_dest, int component,
1399
uint8_t *dest = _dest;
1403
int *matrix = frame->virt_priv2;
1405
src1 = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1406
src2 = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1407
src3 = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1409
switch (component) {
1411
orc_matrix2_11_u8 (dest, src1, src3,
1412
matrix[0], matrix[2], 128, 8, frame->width);
1415
orc_matrix3_100_u8 (dest, src1, src2, src3,
1416
matrix[4], matrix[5], matrix[6], 128, 8, frame->width);
1419
orc_matrix2_12_u8 (dest, src1, src2,
1420
matrix[8], matrix[9], 128, 8, frame->width);
1428
cog_virt_frame_new_color_matrix_YCbCr_to_RGB (CogFrame * vf,
1429
CogColorMatrix color_matrix, int bits)
1431
CogFrame *virt_frame;
1432
//int *matrix = frame->virt_priv2;
1434
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_U8_444,
1435
vf->width, vf->height);
1436
virt_frame->virt_frame1 = vf;
1438
virt_frame->render_line = color_matrix_YCbCr_to_RGB_6bit;
1439
if (color_matrix == COG_COLOR_MATRIX_HDTV) {
1440
virt_frame->virt_priv2 = (void *) cog_ycbcr_to_rgb_matrix_6bit_hdtv;
1442
virt_frame->virt_priv2 = (void *) cog_ycbcr_to_rgb_matrix_6bit_sdtv;
1445
virt_frame->render_line = color_matrix_YCbCr_to_RGB_8bit;
1446
if (color_matrix == COG_COLOR_MATRIX_HDTV) {
1447
virt_frame->virt_priv2 = (void *) cog_ycbcr_to_rgb_matrix_8bit_hdtv;
1449
virt_frame->virt_priv2 = (void *) cog_ycbcr_to_rgb_matrix_8bit_sdtv;
1457
cog_virt_frame_new_color_matrix_RGB_to_YCbCr (CogFrame * vf,
1458
CogColorMatrix color_matrix, int coefficient_bits)
1460
CogFrame *virt_frame;
1462
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_U8_444,
1463
vf->width, vf->height);
1464
virt_frame->virt_frame1 = vf;
1465
virt_frame->render_line = color_matrix_RGB_to_YCbCr;
1466
if (color_matrix == COG_COLOR_MATRIX_HDTV) {
1467
virt_frame->virt_priv2 = (void *) cog_rgb_to_ycbcr_matrix_8bit_hdtv;
1469
virt_frame->virt_priv2 = (void *) cog_rgb_to_ycbcr_matrix_8bit_sdtv;
1476
convert_444_422 (CogFrame * frame, void *_dest, int component, int i)
1478
uint8_t *dest = _dest;
1482
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1483
n_src = frame->virt_frame1->components[component].width;
1485
if (component == 0) {
1486
orc_memcpy (dest, src, frame->width);
1488
cogorc_downsample_horiz_cosite_1tap (dest + 1,
1489
(uint16_t *) (src + 2), frame->components[component].width - 1);
1496
x = 1 * src[CLAMP (j * 2 - 1, 0, n_src - 1)];
1497
x += 2 * src[CLAMP (j * 2 + 0, 0, n_src - 1)];
1498
x += 1 * src[CLAMP (j * 2 + 1, 0, n_src - 1)];
1499
dest[j] = CLAMP ((x + 2) >> 2, 0, 255);
1505
convert_422_420 (CogFrame * frame, void *_dest, int component, int i)
1507
uint8_t *dest = _dest;
1510
if (component == 0) {
1511
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1512
orc_memcpy (dest, src, frame->components[component].width);
1514
uint8_t *dest = _dest;
1519
n_src = frame->virt_frame1->components[component].height;
1520
src1 = cog_virt_frame_get_line (frame->virt_frame1, component,
1521
CLAMP (i * 2 + 0, 0, n_src - 1));
1522
src2 = cog_virt_frame_get_line (frame->virt_frame1, component,
1523
CLAMP (i * 2 + 1, 0, n_src - 1));
1525
cogorc_downsample_vert_halfsite_2tap (dest, src1, src2,
1526
frame->components[component].width);
1533
convert_422_444 (CogFrame * frame, void *_dest, int component, int i)
1535
uint8_t *dest = _dest;
1538
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1540
if (component == 0) {
1541
orc_memcpy (dest, src, frame->width);
1543
cogorc_upsample_horiz_cosite_1tap (dest, src,
1544
frame->components[component].width / 2 - 1);
1546
cogorc_upsample_horiz_cosite (dest, src, src + 1,
1547
frame->components[component].width / 2 - 1);
1549
dest[frame->components[component].width - 2] =
1550
src[frame->components[component].width / 2 - 1];
1551
dest[frame->components[component].width - 1] =
1552
src[frame->components[component].width / 2 - 1];
1557
convert_420_422 (CogFrame * frame, void *_dest, int component, int i)
1559
uint8_t *dest = _dest;
1562
if (component == 0) {
1563
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1564
orc_memcpy (dest, src, frame->components[component].width);
1567
if ((i & 1) && i < frame->components[component].height - 1) {
1570
src = cog_virt_frame_get_line (frame->virt_frame1, component, i >> 1);
1571
src2 = cog_virt_frame_get_line (frame->virt_frame1,
1572
component, (i >> 1) + 1);
1573
cogorc_upsample_vert_avgub (dest, src, src2,
1574
frame->components[component].width);
1576
src = cog_virt_frame_get_line (frame->virt_frame1, component, i >> 1);
1577
orc_memcpy (dest, src, frame->components[component].width);
1580
src = cog_virt_frame_get_line (frame->virt_frame1, component, i >> 1);
1581
orc_memcpy (dest, src, frame->components[component].width);
1587
cog_virt_frame_new_subsample (CogFrame * vf, CogFrameFormat format)
1589
CogFrame *virt_frame;
1590
CogFrameRenderFunc render_line;
1592
if (vf->format == format) {
1595
if (vf->format == COG_FRAME_FORMAT_U8_422 &&
1596
format == COG_FRAME_FORMAT_U8_420) {
1597
render_line = convert_422_420;
1598
} else if (vf->format == COG_FRAME_FORMAT_U8_444 &&
1599
format == COG_FRAME_FORMAT_U8_420) {
1600
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_U8_422,
1601
vf->width, vf->height);
1602
virt_frame->virt_frame1 = vf;
1603
virt_frame->render_line = convert_444_422;
1606
render_line = convert_422_420;
1607
} else if (vf->format == COG_FRAME_FORMAT_U8_444 &&
1608
format == COG_FRAME_FORMAT_U8_422) {
1609
render_line = convert_444_422;
1610
} else if (vf->format == COG_FRAME_FORMAT_U8_420 &&
1611
format == COG_FRAME_FORMAT_U8_422) {
1612
render_line = convert_420_422;
1613
} else if (vf->format == COG_FRAME_FORMAT_U8_420 &&
1614
format == COG_FRAME_FORMAT_U8_444) {
1615
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_U8_422,
1616
vf->width, vf->height);
1617
virt_frame->virt_frame1 = vf;
1618
virt_frame->render_line = convert_420_422;
1621
render_line = convert_422_444;
1622
} else if (vf->format == COG_FRAME_FORMAT_U8_422 &&
1623
format == COG_FRAME_FORMAT_U8_444) {
1624
render_line = convert_422_444;
1626
GST_ERROR ("trying to subsample from %d to %d", vf->format, format);
1627
g_return_val_if_reached (NULL);
1629
virt_frame = cog_frame_new_virtual (NULL, format, vf->width, vf->height);
1630
virt_frame->virt_frame1 = vf;
1631
virt_frame->render_line = render_line;
1638
convert_u8_s16 (CogFrame * frame, void *_dest, int component, int i)
1640
uint8_t *dest = _dest;
1643
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1644
orc_addc_convert_u8_s16 (dest, frame->virt_priv,
1645
frame->components[component].width);
1649
cog_virt_frame_new_convert_u8 (CogFrame * vf)
1651
CogFrame *virt_frame;
1652
CogFrameFormat format;
1654
format = (vf->format & 3) | COG_FRAME_FORMAT_U8_444;
1656
virt_frame = cog_frame_new_virtual (NULL, format, vf->width, vf->height);
1657
virt_frame->virt_frame1 = vf;
1658
virt_frame->render_line = convert_u8_s16;
1659
virt_frame->virt_priv = g_malloc (sizeof (int16_t) * vf->width);
1665
convert_s16_u8 (CogFrame * frame, void *_dest, int component, int i)
1667
int16_t *dest = _dest;
1670
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1672
orc_subc_convert_s16_u8 (dest, src, frame->components[component].width);
1676
cog_virt_frame_new_convert_s16 (CogFrame * vf)
1678
CogFrame *virt_frame;
1679
CogFrameFormat format;
1681
format = (vf->format & 3) | COG_FRAME_FORMAT_S16_444;
1683
virt_frame = cog_frame_new_virtual (NULL, format, vf->width, vf->height);
1684
virt_frame->virt_frame1 = vf;
1685
virt_frame->render_line = convert_s16_u8;
1691
crop_u8 (CogFrame * frame, void *_dest, int component, int i)
1693
uint8_t *dest = _dest;
1696
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1697
orc_memcpy (dest, src, frame->components[component].width);
1701
crop_s16 (CogFrame * frame, void *_dest, int component, int i)
1703
int16_t *dest = _dest;
1706
src = cog_virt_frame_get_line (frame->virt_frame1, component, i);
1707
orc_memcpy (dest, src, frame->components[component].width * sizeof (int16_t));
1711
cog_virt_frame_new_crop (CogFrame * vf, int width, int height)
1713
CogFrame *virt_frame;
1715
if (width == vf->width && height == vf->height)
1718
g_return_val_if_fail (width <= vf->width, NULL);
1719
g_return_val_if_fail (height <= vf->height, NULL);
1721
virt_frame = cog_frame_new_virtual (NULL, vf->format, width, height);
1722
virt_frame->virt_frame1 = vf;
1723
switch (COG_FRAME_FORMAT_DEPTH (vf->format)) {
1724
case COG_FRAME_FORMAT_DEPTH_U8:
1725
virt_frame->render_line = crop_u8;
1727
case COG_FRAME_FORMAT_DEPTH_S16:
1728
virt_frame->render_line = crop_s16;
1731
g_return_val_if_reached (NULL);
1739
edge_extend_u8 (CogFrame * frame, void *_dest, int component, int i)
1741
uint8_t *dest = _dest;
1743
CogFrame *srcframe = frame->virt_frame1;
1745
src = cog_virt_frame_get_line (frame->virt_frame1, component,
1746
MIN (i, srcframe->components[component].height - 1));
1747
orc_memcpy (dest, src, srcframe->components[component].width);
1748
orc_splat_u8_ns (dest + srcframe->components[component].width,
1749
dest[srcframe->components[component].width - 1],
1750
frame->components[component].width -
1751
srcframe->components[component].width);
1755
edge_extend_s16 (CogFrame * frame, void *_dest, int component, int i)
1757
int16_t *dest = _dest;
1759
CogFrame *srcframe = frame->virt_frame1;
1761
src = cog_virt_frame_get_line (frame->virt_frame1, component,
1762
MIN (i, srcframe->components[component].height - 1));
1763
orc_memcpy (dest, src,
1764
srcframe->components[component].width * sizeof (int16_t));
1765
orc_splat_s16_ns (dest + srcframe->components[component].width,
1766
dest[srcframe->components[component].width - 1],
1767
frame->components[component].width -
1768
srcframe->components[component].width);
1772
cog_virt_frame_new_edgeextend (CogFrame * vf, int width, int height)
1774
CogFrame *virt_frame;
1776
if (width == vf->width && height == vf->height)
1779
g_return_val_if_fail (width >= vf->width, NULL);
1780
g_return_val_if_fail (height >= vf->height, NULL);
1782
virt_frame = cog_frame_new_virtual (NULL, vf->format, width, height);
1783
virt_frame->virt_frame1 = vf;
1784
switch (COG_FRAME_FORMAT_DEPTH (vf->format)) {
1785
case COG_FRAME_FORMAT_DEPTH_U8:
1786
virt_frame->render_line = edge_extend_u8;
1788
case COG_FRAME_FORMAT_DEPTH_S16:
1789
virt_frame->render_line = edge_extend_s16;
1792
g_return_val_if_reached (NULL);
1802
pack_RGBx (CogFrame * frame, void *_dest, int component, int i)
1804
uint32_t *dest = _dest;
1809
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1810
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1811
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1813
orc_pack_123x (dest, src_r, src_g, src_b, 0xff, frame->width);
1817
cog_virt_frame_new_pack_RGBx (CogFrame * vf)
1819
CogFrame *virt_frame;
1821
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_RGBx,
1822
vf->width, vf->height);
1823
virt_frame->virt_frame1 = vf;
1824
virt_frame->render_line = pack_RGBx;
1830
pack_xRGB (CogFrame * frame, void *_dest, int component, int i)
1832
uint32_t *dest = _dest;
1837
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1838
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1839
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1841
orc_pack_x123 (dest, src_r, src_g, src_b, 0xff, frame->width);
1845
cog_virt_frame_new_pack_xRGB (CogFrame * vf)
1847
CogFrame *virt_frame;
1849
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_xRGB,
1850
vf->width, vf->height);
1851
virt_frame->virt_frame1 = vf;
1852
virt_frame->render_line = pack_xRGB;
1858
pack_BGRx (CogFrame * frame, void *_dest, int component, int i)
1860
uint32_t *dest = _dest;
1865
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1866
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1867
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1869
orc_pack_123x (dest, src_b, src_g, src_r, 0xff, frame->width);
1873
cog_virt_frame_new_pack_BGRx (CogFrame * vf)
1875
CogFrame *virt_frame;
1877
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_BGRx,
1878
vf->width, vf->height);
1879
virt_frame->virt_frame1 = vf;
1880
virt_frame->render_line = pack_BGRx;
1886
pack_xBGR (CogFrame * frame, void *_dest, int component, int i)
1888
uint32_t *dest = _dest;
1893
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1894
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1895
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1897
orc_pack_x123 (dest, src_b, src_g, src_r, 0xff, frame->width);
1901
cog_virt_frame_new_pack_xBGR (CogFrame * vf)
1903
CogFrame *virt_frame;
1905
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_xBGR,
1906
vf->width, vf->height);
1907
virt_frame->virt_frame1 = vf;
1908
virt_frame->render_line = pack_xBGR;
1914
pack_RGBA (CogFrame * frame, void *_dest, int component, int i)
1916
uint32_t *dest = _dest;
1921
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1922
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1923
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1925
orc_pack_123x (dest, src_r, src_g, src_b, 0xff, frame->width);
1929
cog_virt_frame_new_pack_RGBA (CogFrame * vf)
1931
CogFrame *virt_frame;
1933
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_RGBA,
1934
vf->width, vf->height);
1935
virt_frame->virt_frame1 = vf;
1936
virt_frame->render_line = pack_RGBA;
1942
pack_ARGB (CogFrame * frame, void *_dest, int component, int i)
1944
uint32_t *dest = _dest;
1949
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1950
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1951
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1953
orc_pack_x123 (dest, src_r, src_g, src_b, 0xff, frame->width);
1957
cog_virt_frame_new_pack_ARGB (CogFrame * vf)
1959
CogFrame *virt_frame;
1961
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_ARGB,
1962
vf->width, vf->height);
1963
virt_frame->virt_frame1 = vf;
1964
virt_frame->render_line = pack_ARGB;
1970
pack_BGRA (CogFrame * frame, void *_dest, int component, int i)
1972
uint32_t *dest = _dest;
1977
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
1978
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
1979
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
1981
orc_pack_123x (dest, src_b, src_g, src_r, 0xff, frame->width);
1985
cog_virt_frame_new_pack_BGRA (CogFrame * vf)
1987
CogFrame *virt_frame;
1989
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_BGRA,
1990
vf->width, vf->height);
1991
virt_frame->virt_frame1 = vf;
1992
virt_frame->render_line = pack_BGRA;
1998
pack_ABGR (CogFrame * frame, void *_dest, int component, int i)
2000
uint32_t *dest = _dest;
2005
src_r = cog_virt_frame_get_line (frame->virt_frame1, 0, i);
2006
src_g = cog_virt_frame_get_line (frame->virt_frame1, 1, i);
2007
src_b = cog_virt_frame_get_line (frame->virt_frame1, 2, i);
2009
orc_pack_x123 (dest, src_b, src_g, src_r, 0xff, frame->width);
2013
cog_virt_frame_new_pack_ABGR (CogFrame * vf)
2015
CogFrame *virt_frame;
2017
virt_frame = cog_frame_new_virtual (NULL, COG_FRAME_FORMAT_ABGR,
2018
vf->width, vf->height);
2019
virt_frame->virt_frame1 = vf;
2020
virt_frame->render_line = pack_ABGR;