8
8
#include "schrovirtframe.h"
9
9
#include <schroedinger/schro.h>
10
10
#include <schroedinger/schroutils.h>
11
#include <liboil/liboil.h>
12
#include <schroedinger/schrooil.h>
11
13
#include <string.h>
15
#include <schroedinger/schroorc.h>
53
52
frame->regions[0] = malloc (frame->components[0].stride * SCHRO_FRAME_CACHE_SIZE);
54
53
for(i=0;i<SCHRO_FRAME_CACHE_SIZE;i++){
55
frame->cached_lines[0][i] = 0;
54
frame->cached_lines[0][i] = -1;
57
56
frame->is_virtual = TRUE;
114
113
frame->regions[i] = malloc (comp->stride * SCHRO_FRAME_CACHE_SIZE);
115
114
for(j=0;j<SCHRO_FRAME_CACHE_SIZE;j++){
116
frame->cached_lines[i][j] = 0;
115
frame->cached_lines[i][j] = -1;
119
118
frame->is_virtual = TRUE;
125
schro_virt_frame_prep_cache_line (SchroFrame *frame, int component, int i)
129
if (i < frame->cache_offset[component]) {
130
SCHRO_ERROR ("cache failure: %d outside [%d,%d]", i,
131
frame->cache_offset[component],
132
frame->cache_offset[component] + SCHRO_FRAME_CACHE_SIZE - 1);
134
frame->cache_offset[component] = i;
135
for(j=0;j<SCHRO_FRAME_CACHE_SIZE; j++) {
136
frame->cached_lines[component][j] = 0;
140
while (i >= frame->cache_offset[component] + SCHRO_FRAME_CACHE_SIZE) {
141
j = frame->cache_offset[component] & (SCHRO_FRAME_CACHE_SIZE - 1);
142
frame->cached_lines[component][j] = 0;
144
frame->cache_offset[component]++;
149
schro_virt_frame_get_line_unrendered (SchroFrame *frame, int component, int i)
151
SchroFrameData *comp = &frame->components[component];
154
//SCHRO_ASSERT(i >= 0);
155
//SCHRO_ASSERT(i < comp->height);
157
if (!frame->is_virtual) {
158
return SCHRO_FRAME_DATA_GET_LINE(&frame->components[component], i);
161
schro_virt_frame_prep_cache_line (frame, component, i);
162
j = i & (SCHRO_FRAME_CACHE_SIZE - 1);
164
return SCHRO_OFFSET (frame->regions[component], comp->stride * j);
168
124
schro_virt_frame_get_line (SchroFrame *frame, int component, int i)
170
126
SchroFrameData *comp = &frame->components[component];
173
131
//SCHRO_ASSERT(i >= 0);
174
132
//SCHRO_ASSERT(i < comp->height);
177
135
return SCHRO_FRAME_DATA_GET_LINE(&frame->components[component], i);
180
schro_virt_frame_prep_cache_line (frame, component, i);
181
j = i & (SCHRO_FRAME_CACHE_SIZE - 1);
183
if (!frame->cached_lines[component][j]) {
184
schro_virt_frame_render_line (frame,
185
SCHRO_OFFSET (frame->regions[component], comp->stride * j), component, i);
186
frame->cached_lines[component][j] = 1;
189
return SCHRO_OFFSET (frame->regions[component], comp->stride * j);
193
schro_virt_frame_set_line_rendered (SchroFrame *frame, int component, int i)
197
//SCHRO_ASSERT(i >= 0);
198
//SCHRO_ASSERT(i < comp->height);
199
//SCHRO_ASSERT(frame->is_virtual);
201
j = i & (SCHRO_FRAME_CACHE_SIZE - 1);
202
frame->cached_lines[component][j] = 1;
138
for(j=0;j<SCHRO_FRAME_CACHE_SIZE;j++){
139
if (frame->cached_lines[component][j] == i) {
140
return SCHRO_OFFSET(frame->regions[component], comp->stride * j);
145
min = frame->cached_lines[component][0];
146
for(j=1;j<SCHRO_FRAME_CACHE_SIZE;j++){
147
if (frame->cached_lines[component][j] < min) {
148
min = frame->cached_lines[component][j];
152
frame->cached_lines[component][min_j] = i;
154
schro_virt_frame_render_line (frame,
155
SCHRO_OFFSET(frame->regions[component], comp->stride * min_j),
158
return SCHRO_OFFSET(frame->regions[component], comp->stride * min_j);
218
174
src = schro_virt_frame_get_line (frame, component, i);
219
175
switch (SCHRO_FRAME_FORMAT_DEPTH(frame->format)) {
220
176
case SCHRO_FRAME_FORMAT_DEPTH_U8:
221
178
orc_memcpy (dest, src, frame->components[component].width);
180
oil_memcpy (dest, src, frame->components[component].width);
223
183
case SCHRO_FRAME_FORMAT_DEPTH_S16:
224
185
orc_memcpy (dest, src, frame->components[component].width * 2);
187
oil_memcpy (dest, src, frame->components[component].width * 2);
613
577
uint8_t *dest = _dest;
616
583
src = schro_virt_frame_get_line (frame->virt_frame1, 0, i);
618
585
switch (component) {
620
588
orc_unpack_yuyv_y (dest, (void *)src, frame->width);
590
for(j=0;j<frame->width;j++){
623
597
orc_unpack_yuyv_u (dest, (void *)src, frame->width/2);
599
for(j=0;j<frame->width/2;j++){
600
dest[j] = src[j*4 + 1];
626
606
orc_unpack_yuyv_v (dest, (void *)src, frame->width/2);
608
for(j=0;j<frame->width/2;j++){
609
dest[j] = src[j*4 + 3];
636
618
uint8_t *dest = _dest;
639
624
src = schro_virt_frame_get_line (frame->virt_frame1, 0, i);
641
626
switch (component) {
643
629
orc_unpack_uyvy_y (dest, (void *)src, frame->width);
631
for(j=0;j<frame->width;j++){
632
dest[j] = src[j*2 + 1];
646
638
orc_unpack_uyvy_u (dest, (void *)src, frame->width/2);
640
for(j=0;j<frame->width/2;j++){
641
dest[j] = src[j*4 + 0];
649
647
orc_unpack_uyvy_v (dest, (void *)src, frame->width/2);
649
for(j=0;j<frame->width/2;j++){
650
dest[j] = src[j*4 + 2];
842
834
src_u = schro_virt_frame_get_line (frame->virt_frame1, 1, i);
843
835
src_v = schro_virt_frame_get_line (frame->virt_frame1, 2, i);
845
838
orc_packyuyv (dest, src_y, src_u, src_v, frame->width/2);
840
oil_packyuyv (dest, src_y, src_u, src_v, frame->width/2);
1263
1259
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1265
1261
if (component == 0) {
1266
1263
orc_memcpy (dest, src, frame->width);
1265
oil_memcpy (dest, src, frame->width);
1268
1268
for(j=0;j<frame->components[component].width;j++){
1269
1269
dest[j] = src[j*2];
1281
1281
if (component == 0) {
1282
1282
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1283
1284
orc_memcpy (dest, src, frame->components[component].width);
1286
oil_memcpy (dest, src, frame->components[component].width);
1285
1289
src = schro_virt_frame_get_line (frame->virt_frame1, component, i*2);
1286
1290
for(j=0;j<frame->components[component].width;j++){
1301
1305
src = schro_virt_frame_get_line (frame->virt_frame1, component, i*2);
1303
1308
orc_memcpy (dest, src, frame->components[component].width);
1310
oil_memcpy (dest, src, frame->components[component].width);
1315
1323
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1317
1325
if (component == 0) {
1318
1327
orc_memcpy (dest, src, frame->width);
1329
oil_memcpy (dest, src, frame->width);
1320
1332
for(j=0;j<frame->components[component].width;j++){
1321
1333
dest[j] = src[j>>1];
1333
1345
if (component == 0) {
1334
1346
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1335
1348
orc_memcpy (dest, src, frame->components[component].width);
1350
oil_memcpy (dest, src, frame->components[component].width);
1337
1353
src = schro_virt_frame_get_line (frame->virt_frame1, component, i>>1);
1338
1354
for(j=0;j<frame->components[component].width;j++){
1353
1369
src = schro_virt_frame_get_line (frame->virt_frame1, component, i>>1);
1355
1372
orc_memcpy (dest, src, frame->components[component].width);
1374
oil_memcpy (dest, src, frame->components[component].width);
1510
1530
uint8_t *dest = _dest;
1513
1536
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1514
1538
orc_offsetconvert_u8_s16 (dest, src, frame->components[component].width);
1540
oil_addc_s16 (frame->virt_priv, src, &c,
1541
frame->components[component].width);
1542
oil_convert_u8_s16 (dest, frame->virt_priv,
1543
frame->components[component].width);
1536
1566
int16_t *dest = _dest;
1539
1572
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1541
1575
orc_offsetconvert_s16_u8 (dest, src, frame->components[component].width);
1577
oil_convert_s16_u8 (dest, src, frame->components[component].width);
1578
oil_addc_s16 (dest, dest, &c, frame->components[component].width);
1565
1603
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1566
1605
orc_memcpy (dest, src, frame->components[component].width);
1607
oil_memcpy (dest, src, frame->components[component].width);
1575
1617
src = schro_virt_frame_get_line (frame->virt_frame1, component, i);
1576
1619
orc_memcpy (dest, src, frame->components[component].width * sizeof(int16_t));
1621
oil_memcpy (dest, src, frame->components[component].width * sizeof(int16_t));
1613
1659
src = schro_virt_frame_get_line (frame->virt_frame1, component,
1614
1660
MIN(i,srcframe->components[component].height-1));
1615
1662
orc_memcpy (dest, src, srcframe->components[component].width);
1616
1663
orc_splat_u8_ns (dest + srcframe->components[component].width,
1617
1664
dest[srcframe->components[component].width - 1],
1618
1665
frame->components[component].width -
1619
1666
srcframe->components[component].width);
1668
oil_memcpy (dest, src, srcframe->components[component].width);
1669
oil_splat_u8_ns (dest + srcframe->components[component].width,
1670
dest + srcframe->components[component].width - 1,
1671
frame->components[component].width -
1672
srcframe->components[component].width);
1629
1683
src = schro_virt_frame_get_line (frame->virt_frame1, component,
1630
1684
MIN(i,srcframe->components[component].height-1));
1631
1686
orc_memcpy (dest, src,
1632
1687
srcframe->components[component].width * sizeof(int16_t));
1633
1688
orc_splat_s16_ns (dest + srcframe->components[component].width,
1634
1689
dest[srcframe->components[component].width - 1],
1635
1690
frame->components[component].width -
1636
1691
srcframe->components[component].width);
1693
oil_memcpy (dest, src,
1694
srcframe->components[component].width * sizeof(int16_t));
1695
oil_splat_s16_ns (dest + srcframe->components[component].width,
1696
dest + srcframe->components[component].width - 1,
1697
frame->components[component].width -
1698
srcframe->components[component].width);