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