19a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin/*
29a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Copyright (C) 2007 Google Inc.
39a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *
49a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Licensed under the Apache License, Version 2.0 (the "License");
59a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * you may not use this file except in compliance with the License.
69a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * You may obtain a copy of the License at
79a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *
89a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *      http://www.apache.org/licenses/LICENSE-2.0
99a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *
109a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Unless required by applicable law or agreed to in writing, software
119a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * distributed under the License is distributed on an "AS IS" BASIS,
129a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * See the License for the specific language governing permissions and
149a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * limitations under the License.
159a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin */
169a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
179a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <stdlib.h>
189a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <unistd.h>
199a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <fcntl.h>
209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <stdio.h>
219a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/ioctl.h>
229a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/mman.h>
2340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin#include <sys/stat.h>
249a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/types.h>
259a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
269a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <linux/fb.h>
279a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <linux/msm_mdp.h>
289a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
299a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic struct fb_var_screeninfo vi;
309a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
3140e98c72f0aed307a63ff533ab15940c188a160eDima Zavinstatic int open_file(char *name, int *fd, int *len, int *fmt)
3240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin{
3340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    struct stat stat;
3440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    char *type, *fn;
3540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
3640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    type = name;
3740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    fn = strchr(name, ':');
3840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!fn)
3940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
4040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *(fn++) = '\0';
4140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
4240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!strncmp(type, "yuv420", 6))
4340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        *fmt = MDP_Y_CBCR_H2V2;
4440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    else if (!strncmp(type, "rgb565", 6))
4540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        *fmt = MDP_RGB_565;
4640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    else {
4740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        fprintf(stderr, "Unsupported image type: %s\n", type);
4840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
4940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
5040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
5140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *fd = open(fn, O_RDONLY);
5240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (*fd < 0) {
5340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        perror("cannot open file");
5440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
5540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
5640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
5740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (fstat(*fd, &stat) < 0) {
5840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        perror("cannot fstat file");
5940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        goto err;
6040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
6140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
6240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *len = stat.st_size;
6340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
6440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    printf("Successfully opened file %s (fmt=%d len=%d fd=%d)\n", fn, *fmt,
6540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin           *len, *fd);
6640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    return 0;
6740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
6840e98c72f0aed307a63ff533ab15940c188a160eDima Zavinerr:
6940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    close(*fd);
7040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    return -1;
7140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin}
7240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
7340e98c72f0aed307a63ff533ab15940c188a160eDima Zavinstatic int get_pmem(int *fd, void **data, int sz)
7440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin{
7540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *fd = open("/dev/pmem", O_RDWR | O_NONBLOCK | O_SYNC);
7640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (*fd < 0) {
7740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        perror("cannot open /dev/pmem");
7840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
7940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
8040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
8140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    sz = (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
8240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *data = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0);
8340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (*data == MAP_FAILED) {
8440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        perror("pmem mmap");
8540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        goto err_pmem_mmap;
8640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
8740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
8840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    return 0;
8940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
9040e98c72f0aed307a63ff533ab15940c188a160eDima Zavinerr_pmem_mmap:
9140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin   close(*fd);
9240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin   return -1;
9340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin}
9440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
959a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic int get_framebuffer(int *fd, char **fb, int *width, int *height)
969a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin{
979a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    struct fb_fix_screeninfo fi;
989a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    void *bits;
999a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1009a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    *fd = open("/dev/graphics/fb0", O_RDWR);
1019a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(*fd < 0) {
1029a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        perror("cannot open fb0");
1039a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        return -1;
1049a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
1059a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1069a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(ioctl(*fd, FBIOGET_FSCREENINFO, &fi) < 0) {
1079a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        perror("failed to get fb0 info");
1089a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        return -1;
1099a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
1109a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1119a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(ioctl(*fd, FBIOGET_VSCREENINFO, &vi) < 0) {
1129a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        perror("failed to get fb0 info");
1139a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        return -1;
1149a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
1159a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1169a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0);
1179a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(bits == MAP_FAILED) {
1189a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        perror("failed to mmap framebuffer");
1199a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        return -1;
1209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
1219a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1229a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    *width = vi.xres;
1239a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    *height = vi.yres;
1249a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    *fb = bits;
1259a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    return 0;
1269a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin}
1279a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1289a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic void set_active_framebuffer(int fd, unsigned n)
1299a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin{
1309a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1319a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(n > 1) return;
1329a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    vi.yres_virtual = vi.yres * 2;
1339a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    vi.yoffset = n * vi.yres;
1349a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    if(ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
1359a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        fprintf(stderr,"active fb swap failed!\n");
1369a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
1379a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin}
1389a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
13940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin/* geometry: WxH+X+Y */
14040e98c72f0aed307a63ff533ab15940c188a160eDima Zavinint parse_geometry(char *geom, int *w, int *h, int *x, int *y)
14140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin{
14240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    char *ptr;
14340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
14440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *w = *h = 0;
14540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
14640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!(ptr = strchr(geom, 'x')))
14740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
14840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *ptr = '\0';
14940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *w = atoi(geom);
15040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    geom = ptr + 1;
15140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
15240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    ptr = strchr(geom, '+');
15340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (ptr)
15440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        *ptr = '\0';
15540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *h = atoi(geom);
15640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!ptr)
15740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return 0;
15840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
15940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    geom = ptr + 1;
16040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
16140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!x || !y || !(ptr = strchr(geom, '+')))
16240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        return -1;
16340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *ptr = '\0';
16440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *x = atoi(geom);
16540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    geom = ptr + 1;
16640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
16740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    *y = atoi(geom);
16840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
16940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    return 0;
17040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin}
17140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
17240e98c72f0aed307a63ff533ab15940c188a160eDima Zavinint main(int argc, const char *argv[])
17340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin{
17440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int fb_fd, width, height;
1759a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    char* fb;
1769a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    struct mdp_blit_req_list *req_list;
1779a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    struct mdp_blit_req *req;
17840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int opt;
17940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int srcw = 0, srch = 0, dstw = 0, dsth = 0;
1809a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    int srcx = 0; int srcy = 0;
1819a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    int dstx = 10; int dsty = 10;
18240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int src_imgw = 0, src_imgh = 0, dst_imgw = 0, dst_imgh = 0;
18340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int from;
18440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int src_fmt;
18540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int dst_fmt = MDP_RGB_565;
18640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    int src_fd = -1;
18740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    void *src_data;
1889a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1899a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req_list = malloc(sizeof(struct mdp_blit_req_list) +
1909a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin                      sizeof(struct mdp_blit_req));
1919a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req_list->count = 1;
1929a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req = req_list->req;
1939a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
1949a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
19540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    while ((opt = getopt(argc, argv, "s:d:f:t:u:v:")) != -1) {
19640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        switch (opt) {
19740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 's':
19840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            if (parse_geometry(optarg, &srcw, &srch, &srcx, &srcy)) {
19940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                fprintf(stderr, "Can't parse source\n");
20040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                exit(-1);
20140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            }
20240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            printf("Got source: w=%d h=%d x=%d y=%d\n", srcw, srch, srcx, srcy);
20340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
2049a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
20540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 'd':
20640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            if (parse_geometry(optarg, &dstw, &dsth, &dstx, &dsty)) {
20740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                fprintf(stderr, "Can't parse dest\n");
20840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                exit(-1);
20940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            }
21040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            printf("Got dest: w=%d h=%d x=%d y=%d\n", dstw, dsth, dstx, dsty);
21140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
21240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
21340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 'u':
21440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            if (parse_geometry(optarg, &src_imgw, &src_imgh, NULL, NULL)) {
21540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                fprintf(stderr, "Can't parse src image size\n");
21640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                exit(-1);
21740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            }
21840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            printf("Got src img sz: w=%d h=%d\n", src_imgw, src_imgh);
21940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
2209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
22140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 'v':
22240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            if (parse_geometry(optarg, &dst_imgw, &dst_imgh, NULL, NULL)) {
22340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                fprintf(stderr, "Can't parse dst image size\n");
22440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                exit(-1);
22540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            }
22640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            printf("Got dst img sz: w=%d h=%d\n", dst_imgw, dst_imgh);
22740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
2289a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
22940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 'f':
23040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            {
23140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                int file_fd;
23240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                int file_len;
23340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                int bytes;
23440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                void *ptr;
23540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                if (open_file(optarg, &file_fd, &file_len, &src_fmt) < 0) {
23640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    fprintf(stderr, "Can't open source file\n");
23740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    exit(-1);
23840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                }
23940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
24040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                if (get_pmem(&src_fd, &src_data, file_len) < 0) {
24140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    close(file_fd);
24240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    exit(-1);
24340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                }
24440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
24540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                ptr = src_data;
24640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                while (file_len) {
24740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    bytes = read(file_fd, ptr, file_len);
24840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    if (bytes < 0) {
24940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                        perror("Could not read data from file");
25040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                        exit(-1);
25140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    }
25240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    file_len -= bytes;
25340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                    ptr += bytes;
25440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                }
25540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            }
25640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
25740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
25840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        case 't':
25940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            if (!strncmp(optarg, "yuv420", 6))
26040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                dst_fmt = MDP_Y_CBCR_H2V2;
26140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin#if 0
26240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            else if (!strncmp(optarg, "rgb565", 6))
26340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin                dst_fmt = MDP_RGB_565;
26440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin#endif
26540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            break;
26640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
26740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        default:
26840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            fprintf(stderr, "Usage: %s -s source -d dest\n", argv[0]);
26940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin            exit(-1);
27040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        }
27140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
27240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
27340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (get_framebuffer(&fb_fd, &fb, &width, &height)) {
2749a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        printf("couldnt' get fb\n");
2759a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        return -1;
2769a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    }
27740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
27840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    set_active_framebuffer(fb_fd, 0);
27940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
28040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!src_imgw || !src_imgh) {
28140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        src_imgw = width;
28240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        src_imgh = height;
28340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
28440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
28540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (!dst_imgw || !dst_imgh) {
28640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        dst_imgw = width;
28740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        dst_imgh = height;
28840e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
28940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
29040e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if (src_fd < 0) {
29140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        src_fd = fb_fd;
29240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin        src_fmt = MDP_RGB_565;
29340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    }
29440e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
29540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src.width = src_imgw;
29640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src.height = src_imgh;
29740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src.format = src_fmt;
2989a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->src.offset = 0;
29940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src.memory_id = src_fd;
3009a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->src_rect.x = srcx;
3019a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->src_rect.y = srcy;
30240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src_rect.w = srcw;
30340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->src_rect.h = srch;
3049a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
30540e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst.width = dst_imgw;
30640e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst.height = dst_imgh;
30740e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst.format = dst_fmt;
3089a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->dst.offset = 0;
30940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst.memory_id = fb_fd;
3109a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->dst_rect.x = dstx;
3119a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->dst_rect.y = dsty;
31240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst_rect.w = dstw;
31340e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    req->dst_rect.h = dsth;
3149a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->alpha = MDP_ALPHA_NOP;
3159a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->transp_mask = MDP_TRANSP_NOP;
3169a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin//    req->flags = MDP_ROT_90;
3179a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    req->flags = MDP_ROT_NOP;
3189a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin
31940e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    if(ioctl(fb_fd, MSMFB_BLIT, req_list))
3209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin        fprintf(stderr, "crap, failed blit\n");
32140e98c72f0aed307a63ff533ab15940c188a160eDima Zavin
32240e98c72f0aed307a63ff533ab15940c188a160eDima Zavin    printf("Done\n");
3239a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin    return 0;
3249a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin}
325