X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_openvuplus_3.0;a=blobdiff_plain;f=meta-openvuplus%2Frecipes-vuplus%2Faio-grab%2Faio-grab%2Faio-grab_vuplus_22f13d68e322e0609f457282ed5bf19376397f29.patch;fp=meta-openvuplus%2Frecipes-vuplus%2Faio-grab%2Faio-grab%2Faio-grab_vuplus_22f13d68e322e0609f457282ed5bf19376397f29.patch;h=be80466bcf24ff721cde3a0c99259f60cb8d6bc0;hp=0000000000000000000000000000000000000000;hb=2186911eda18e0c8182881ba322524d9ba4f756f;hpb=9b256d49c210722f5d12b26c9e5284cd88ea4b12 diff --git a/meta-openvuplus/recipes-vuplus/aio-grab/aio-grab/aio-grab_vuplus_22f13d68e322e0609f457282ed5bf19376397f29.patch b/meta-openvuplus/recipes-vuplus/aio-grab/aio-grab/aio-grab_vuplus_22f13d68e322e0609f457282ed5bf19376397f29.patch new file mode 100644 index 0000000..be80466 --- /dev/null +++ b/meta-openvuplus/recipes-vuplus/aio-grab/aio-grab/aio-grab_vuplus_22f13d68e322e0609f457282ed5bf19376397f29.patch @@ -0,0 +1,327 @@ +diff --git a/.gitignore b/.gitignore +index ccfb515..a6f8d11 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -16,3 +16,4 @@ install-sh + *.o + missing + stamp-h1 ++aio-grab_vuplus_* +diff --git a/main.c b/main.c +index 190ff5f..c6cb750 100644 +--- a/main.c ++++ b/main.c +@@ -1,5 +1,5 @@ + /* +-AiO Dreambox Screengrabber v0.83a ++AiO Screengrabber v0.83a + + written 2006 - 2009 by Seddi + Contact: seddi@ihad.tv / http://www.ihad.tv +@@ -38,6 +38,7 @@ Feel free to use the code for your own projects. See LICENSE file for details. + #include + #include + #include ++#include + + #include + +@@ -80,6 +81,8 @@ static const int yuv2rgbtable_bv[256] = { + }; + + static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yres); ++static bool getvideo2(unsigned char *video, unsigned int *xres, unsigned int *yres); ++ + static bool getosd(unsigned char *osd, unsigned int *xres, unsigned int *yres); + + static void smooth_resize(const unsigned char *source, unsigned char *dest, +@@ -101,10 +104,24 @@ static void combine(unsigned char *output, + const unsigned char *video, const unsigned char *osd, + unsigned int xres, unsigned int yres); + ++#define IS_VUPLUS 1 ++#if IS_VUPLUS ++enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405,BRCM7335,BRCM7325,BRCM7346,BRCM7425,BRCM7362,BRCM73625,BRCM_ARM}; ++char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405","Brcm7335","Brcm7325","Brcm7346","Brcm7425\/7241","Brcm7362", "Brcm73625", "Brcm_ARM"}; ++#else + enum {UNKNOWN,PALLAS,VULCAN,XILLEON,BRCM7401,BRCM7400,BRCM7405}; + static const char *stb_name[]={"unknown","Pallas","Vulcan","Xilleon","Brcm7401","Brcm7400","Brcm7405"}; ++#endif + static int stb_type=UNKNOWN; + ++char* upcase(char* mixedstr) ++{ ++ size_t j; ++ for (j=0; j< strlen(mixedstr); ++j) ++ mixedstr[j]=toupper(mixedstr[j]); ++ return mixedstr; ++} ++ + static const char *file_getline(const char *filename) + { + static char *line = NULL; +@@ -184,10 +201,9 @@ static int file_scanf_lines(const char *filename, const char *fmt, ...) + } + + // main program +- + int main(int argc, char **argv) { + +- printf("AiO Dreambox Screengrabber " PACKAGE_VERSION "\n\n"); ++ printf("AiO Screengrabber " PACKAGE_VERSION "\n\n"); + + unsigned int xres_v = 0,yres_v = 0,xres_o,yres_o,xres,yres,aspect,width; + int c,osd_only,video_only,use_osd_res,use_png,use_jpg,jpg_quality,no_aspect,use_letterbox; +@@ -205,11 +221,47 @@ int main(int argc, char **argv) { + char filename[256] = { "/tmp/screenshot.bmp" }; + + // detect STB +- const char *line = file_getline("/proc/fb"); ++ char *line = (char*)file_getline("/proc/fb"); + if (line == NULL) + return 1; + + if (strstr(line, "bcmfb")) { ++#if IS_VUPLUS ++ if((line=(char*)file_getline("/proc/stb/info/chipset")) == NULL) ++ return 1; ++ if (strstr(upcase(line),"7335")) ++ stb_type=BRCM7335; ++ else if (strstr(upcase(line),"7325")) ++ stb_type=BRCM7325; ++ else if (strstr(upcase(line),"7405")) ++ stb_type=BRCM7405; ++ else if (strstr(upcase(line),"7356")) ++ stb_type=BRCM7346; ++ else if (strstr(upcase(line),"7346")) ++ stb_type=BRCM7346; ++ else if (strstr(upcase(line),"7424")) ++ stb_type=BRCM7425; ++ else if (strstr(upcase(line),"7425")) ++ stb_type=BRCM7425; ++ else if (strstr(upcase(line),"7241")) ++ stb_type=BRCM7425; ++ else if (strstr(upcase(line),"73625")) ++ stb_type=BRCM73625; ++ else if (strstr(upcase(line),"7362")) ++ stb_type=BRCM7362; ++ else if (strstr(upcase(line),"7366")) ++ stb_type=BRCM_ARM; ++ else if (strstr(upcase(line),"7376")) ++ stb_type=BRCM_ARM; ++ else if (strstr(upcase(line),"7444")) ++ stb_type=BRCM_ARM; ++ else if (strstr(upcase(line),"7252")) ++ stb_type=BRCM_ARM; ++ else if (strstr(upcase(line),"7260")) ++ stb_type=BRCM_ARM; ++ else if (strstr(upcase(line),"7278")) ++ stb_type=BRCM_ARM; ++#else + line = file_getline("/proc/stb/info/model"); + if (line == NULL) + return 1; +@@ -221,6 +273,7 @@ int main(int argc, char **argv) { + !strcmp(line, "dm800se") || + !strcmp(line, "dm7020hd")) + stb_type = BRCM7405; ++#endif + } else if (strstr(line, "xilleonfb")) { + stb_type = XILLEON; + } else if (strstr(line, "Pallas FB")) { +@@ -325,9 +378,18 @@ int main(int argc, char **argv) { + if (!video_only && !getosd(osd, &xres_o, &yres_o)) + return 1; + +- // get video +- if (!osd_only && !getvideo(video, &xres_v, &yres_v)) +- return 1; ++ if (stb_type == BRCM_ARM) ++ { ++ if (!osd_only && !getvideo2(video, &xres_v, &yres_v)) ++ return 1; ++ } ++ else ++ { ++ if (!osd_only && !getvideo(video, &xres_v, &yres_v)) ++ return 1; ++ } ++ ++ + + // get aspect ratio + if (stb_type == VULCAN || stb_type == PALLAS) +@@ -549,6 +611,22 @@ int main(int argc, char **argv) { + } + + // grabing the video picture ++static bool getvideo2(unsigned char *video, unsigned int *xres, unsigned int *yres) ++{ ++ int fd_video = open("/dev/dvb/adapter0/video0", O_RDONLY); ++ if (fd_video < 0) { ++ perror("/dev/dvb/adapter0/video0"); ++ return false; ++ } ++ ++ ssize_t r = read(fd_video, video, 1920 * 1080 * 3); ++ close(fd_video); ++ ++ *xres = 1920; ++ *yres = 1080; ++ ++ return true; ++} + + static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yres) + { +@@ -563,16 +641,34 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + perror("/dev/mem"); + return false; + } +- ++#if IS_VUPLUS ++ if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425 || stb_type == BRCM7362 || stb_type == BRCM73625) ++#else + if (stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405) ++#endif + { + // grab brcm7401 pic from decoder memory ++#if IS_VUPLUS ++ off_t offset_addr = 0x10600000; ++ switch(stb_type) { ++ case BRCM7401: ++ case BRCM7400: ++ case BRCM7405: ++ case BRCM7335: ++ case BRCM7325: offset_addr = 0x10100000; break; ++ } ++ unsigned char *memory = mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, offset_addr); ++ if (memory == MAP_FAILED) { ++ perror("mmap"); ++ return false; ++ } ++#else + unsigned char *memory = mmap(0, 100, PROT_READ, MAP_SHARED, mem_fd, 0x10100000); + if (memory == MAP_FAILED) { + perror("mmap"); + return false; + } +- ++#endif + unsigned char data[100]; + + unsigned int adr,adr2,ofs,ofs2,offset/*,vert_start,vert_end*/; +@@ -582,12 +678,37 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + memcpy(data,memory,100); + //vert_start=data[0x1B]<<8|data[0x1A]; + //vert_end=data[0x19]<<8|data[0x18]; ++#if IS_VUPLUS ++ if(stb_type == BRCM7401 || stb_type == BRCM7400 || stb_type == BRCM7405 || stb_type == BRCM7335 || stb_type == BRCM7325) { ++ stride=data[0x15]<<8|data[0x14]; ++ ofs=(data[0x28]<<8|data[0x27])>>4; ++ ofs2=(data[0x2c]<<8|data[0x2b])>>4; ++ adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00; ++ adr2=(data[0x23]<<24|data[0x22]<<16|data[0x21]<<8|data[0x20])&0xFFFFFF00; ++ offset=adr2-adr; ++ } else if(stb_type == BRCM73625) { ++ stride=data[0x19]<<8|data[0x18]; ++ ofs=(data[0x54]<<8|data[0x53])>>4; ++ ofs2=(data[0x58]<<8|data[0x57])>>4; ++ adr=(data[0x37]<<24|data[0x36]<<16|data[0x35]<<8|data[0x34])&0xFFFFFF00; ++ adr2=(data[0x3f]<<24|data[0x3e]<<16|data[0x3d]<<8|data[0x3c])&0xFFFFFF00; ++ offset=adr2-adr; ++ } else { ++ stride=data[0x15]<<8|data[0x14]; ++ ofs=(data[0x3c]<<8|data[0x3b])>>4; ++ ofs2=(data[0x40]<<8|data[0x3f])>>4; ++ adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00; ++ adr2=(data[0x37]<<24|data[0x36]<<16|data[0x35]<<8|data[0x34])&0xFFFFFF00; ++ offset=adr2-adr; ++ } ++#else + stride=data[0x15]<<8|data[0x14]; + ofs=(data[0x28]<<8|data[0x27])>>4; + ofs2=(data[0x2c]<<8|data[0x2b])>>4; + adr=(data[0x1f]<<24|data[0x1e]<<16|data[0x1d]<<8|data[0x1c])&0xFFFFFF00; + adr2=(data[0x23]<<24|data[0x22]<<16|data[0x21]<<8|data[0x20])&0xFFFFFF00; + offset=adr2-adr; ++#endif + + munmap(memory, 100); + +@@ -609,7 +730,11 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + assert(chroma); + + // grabbing luma & chroma plane from the decoder memory ++#if IS_VUPLUS ++ if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425 || stb_type == BRCM7362 || stb_type == BRCM73625) { ++#else + if (stb_type == BRCM7401 || stb_type == BRCM7405) { ++#endif + // on dm800/dm500hd we have direct access to the decoder memory + memory = mmap(0, offset + stride*(ofs2+64), PROT_READ, MAP_SHARED, mem_fd, adr); + if (memory == MAP_FAILED) { +@@ -620,7 +745,11 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + usleep(50000); // we try to get a full picture, its not possible to get a sync from the decoder so we use a delay + // and hope we get a good timing. dont ask me why, but every DM800 i tested so far produced a good + // result with a 50ms delay ++#if IS_VUPLUS ++ } else if (stb_type == BRCM7400 || stb_type == BRCM7335) { ++#else + } else if (stb_type == BRCM7400) { ++#endif + // on dm8000 we have to use dma, so dont change anything here until you really know what you are doing ! + + unsigned int i = 0; +@@ -639,7 +768,11 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + } + + volatile unsigned long *mem_dma; ++#if IS_VUPLUS ++ mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, (stb_type==BRCM7400)?0x10c02000:0x10c01000); ++#else + mem_dma = mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10c02000); ++#endif + if (mem_dma == MAP_FAILED) { + perror("mmap"); + return false; +@@ -675,8 +808,11 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + unsigned int t = 0, t2 = 0, dat1 = 0; + unsigned int chr_luma_stride = 0x40; + unsigned int sw; +- ++#if IS_VUPLUS ++ if (stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425) ++#else + if (stb_type == BRCM7405) ++#endif + chr_luma_stride *= 2; + + xsub=chr_luma_stride; +@@ -692,6 +828,7 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + for (ytmp = 0; ytmp < ofs; ytmp++) + { + memcpy(luma + dat1, memory + t, xsub); // luma ++ + t += chr_luma_stride; + + switch (ofs2-ytmp) // the two switch commands are much faster than one if statement +@@ -710,10 +847,17 @@ static bool getvideo(unsigned char *video, unsigned int *xres, unsigned int *yre + dat1+=stride; + } + } +- ++#if IS_VUPLUS ++ if (stb_type == BRCM7401 || stb_type == BRCM7405 || stb_type == BRCM7325 || stb_type == BRCM7346 || stb_type == BRCM7425 || stb_type == BRCM7362 || stb_type == BRCM73625) { ++#else + if (stb_type == BRCM7401 || stb_type == BRCM7405) ++#endif + munmap(memory, offset + stride * (ofs2 + 64)); ++#if IS_VUPLUS ++ } else if (stb_type == BRCM7400 || stb_type == BRCM7335) { ++#else + else if (stb_type == BRCM7400) { ++#endif + memory -= 0x1000; + munmap(memory, DMA_BLOCKSIZE + 0x1000); + }