From 68f67473d7a9a3a5ee5c0fa03e9afb6b7fd65813 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Mon, 14 Mar 2022 22:05:31 +0100 Subject: [PATCH] - aio-grab: add pip patches --- ...for-pip-devices-with-new-parameter-x.patch | 383 ++++++++++++++++++ ...-aio-grab-arm-short-help-for-x-added.patch | 24 ++ 2 files changed, 407 insertions(+) create mode 100644 package/aio-grab/patches/0001-add-screenshots-for-pip-devices-with-new-parameter-x.patch create mode 100644 package/aio-grab/patches/0002-aio-grab-arm-short-help-for-x-added.patch diff --git a/package/aio-grab/patches/0001-add-screenshots-for-pip-devices-with-new-parameter-x.patch b/package/aio-grab/patches/0001-add-screenshots-for-pip-devices-with-new-parameter-x.patch new file mode 100644 index 00000000..9ca4a5b4 --- /dev/null +++ b/package/aio-grab/patches/0001-add-screenshots-for-pip-devices-with-new-parameter-x.patch @@ -0,0 +1,383 @@ +From e18ced341115dbf9c25f14b2a39e164308197a7b Mon Sep 17 00:00:00 2001 +From: TangoCash +Date: Sun, 17 Oct 2021 15:23:05 +0200 +Subject: [PATCH 1/2] add screenshots for pip devices, with new parameter x + +e.g. for main and pip1: grab -p -x1 /tmp/test.png +--- + main.c | 239 ++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 134 insertions(+), 105 deletions(-) + +diff --git a/main.c b/main.c +index e05c78c..18c8c37 100644 +--- a/main.c ++++ b/main.c +@@ -122,6 +122,36 @@ int timeval_subtract (struct timeval *result, struct timeval *x, struct timeval + } + #endif + ++int proc_get(const char *path, char *value, const int len) ++{ ++ int ret, ret2; ++ int pfd = open(path, O_RDONLY); ++ if (pfd < 0) ++ return pfd; ++ ret = read(pfd, value, len); ++ value[len-1] = '\0'; /* make sure string is terminated */ ++ if (ret >= 0) ++ { ++ while (ret > 0 && isspace(value[ret-1])) ++ ret--; /* remove trailing whitespace */ ++ value[ret] = '\0'; /* terminate, even if ret = 0 */ ++ } ++ ret2 = close(pfd); ++ if (ret2 < 0) ++ return ret2; ++ return ret; ++} ++ ++unsigned int proc_get_hex(const char *path) ++{ ++ unsigned int n, ret = 0; ++ char buf[16]; ++ n = proc_get(path, buf, 16); ++ if (n > 0) ++ sscanf(buf, "%x", &ret); ++ return ret; ++} ++ + #define VIDEO_DEV "/dev/video" + + // dont change SPARE_RAM and DMA_BLOCKSIZE until you really know what you are doing !!! +@@ -146,11 +176,12 @@ static const int yuv2rgbtable_bv[256] = { + }; + + void getvideo(unsigned char *video, int *xres, int *yres); +-void getvideo2(unsigned char *video, int *xres, int *yres); ++void getvideo2(unsigned char *video, int *xres, int *yres, int dev); + void getosd(unsigned char *osd, int *xres, int *yres); + void smooth_resize(const unsigned char *source, unsigned char *dest, int xsource, int ysource, int xdest, int ydest, int colors); + void fast_resize(const unsigned char *source, unsigned char *dest, int xsource, int ysource, int xdest, int ydest, int colors); + void (*resize)(const unsigned char *source, unsigned char *dest, int xsource, int ysource, int xdest, int ydest, int colors); ++void combine_video(unsigned char *output, const unsigned char *input, int xres, int yres, int pip); + void combine(unsigned char *output, const unsigned char *video, const unsigned char *osd, int vleft, int vtop, int vwidth, int vheight, int xres, int yres); + + #if !defined(__sh__) +@@ -170,18 +201,18 @@ static int quiet = 0; + int main(int argc, char **argv) + { + int xres_v,yres_v,xres_o,yres_o,xres,yres,aspect; +- int c,osd_only,video_only,use_osd_res,width,use_png,use_jpg,jpg_quality,no_aspect,use_letterbox; ++ int c,osd_only,video_only,use_osd_res,width,use_png,use_jpg,jpg_quality,no_aspect,use_letterbox,pips; + + // we use fast resize as standard now + resize = &fast_resize; + +- osd_only=video_only=use_osd_res=width=use_png=use_jpg=no_aspect=use_letterbox=0; ++ osd_only=video_only=use_osd_res=width=use_png=use_jpg=no_aspect=use_letterbox=pips=0; + jpg_quality=50; + aspect=1; + + int dst_left = 0, dst_top = 0, dst_width = 0, dst_height = 0; + +- unsigned char *video, *osd, *output; ++ unsigned char *video, *video1, *video2, *video3, *osd, *output; + int output_bytes=3; + + const char* filename = "/tmp/screenshot.bmp"; +@@ -611,7 +642,7 @@ int main(int argc, char **argv) + } + + // process command line +- while ((c = getopt (argc, argv, "dhj:lbnopqr:sv")) != -1) ++ while ((c = getopt (argc, argv, "dhj:lbnopqr:svx:")) != -1) + { + switch (c) + { +@@ -684,6 +715,14 @@ int main(int argc, char **argv) + case 'n': + no_aspect=1; + break; ++ case 'x': ++ pips=atoi(optarg); ++ if (pips > 3) ++ { ++ fprintf(stderr, "Error: -x (additional PIP count) is limited to 3 !\n"); ++ return 1; ++ } ++ break; + } + } + if (optind < argc) // filename +@@ -695,6 +734,12 @@ int main(int argc, char **argv) + mallocsize=720*576; + + video = (unsigned char *)malloc(mallocsize*3); ++ if (pips > 0) ++ video1 = (unsigned char *)malloc(mallocsize*3); ++ if (pips > 1) ++ video2 = (unsigned char *)malloc(mallocsize*3); ++ if (pips > 2) ++ video3 = (unsigned char *)malloc(mallocsize*3); + osd = (unsigned char *)malloc(mallocsize*4); + + if ((stb_type == VULCAN || stb_type == PALLAS) && width > 720) +@@ -713,7 +758,26 @@ int main(int argc, char **argv) + fprintf(stderr, "Grabbing Video ...\n"); + if (stb_type == BRCM7366 || stb_type == BRCM7251 || stb_type == BRCM7252 || stb_type == BRCM7252S || stb_type == BRCM7444 || stb_type == BRCM72604VU || stb_type == BRCM7278 || stb_type == HISIL_ARM) + { +- getvideo2(video, &xres_v,&yres_v); ++ getvideo2(video, &xres_v,&yres_v, 0); ++ if (pips > 0) ++ { ++ memset(video, 0, xres_v * yres_v * 3); ++ getvideo2(video1, &xres_v,&yres_v, 0); ++ combine_video(video, video1, xres_v, yres_v, 0); ++ memset(video1, 0, xres_v * yres_v * 3); ++ getvideo2(video1, &xres_v,&yres_v, 1); ++ combine_video(video, video1, xres_v, yres_v, 1); ++ } ++ if (pips > 1) ++ { ++ getvideo2(video2, &xres_v,&yres_v, 2); ++ combine_video(video, video2, xres_v, yres_v, 2); ++ } ++ if (pips > 2) ++ { ++ getvideo2(video3, &xres_v,&yres_v, 3); ++ combine_video(video, video3, xres_v, yres_v, 3); ++ } + } + else + { +@@ -734,41 +798,11 @@ int main(int argc, char **argv) + } + else + { +- fp = fopen("/proc/stb/vmpeg/0/aspect", "r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf), fp)) +- sscanf(buf,"%x",&aspect); +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/dst_width", "r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf), fp)) +- sscanf(buf,"%x",&dst_width); +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/dst_height", "r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf), fp)) +- sscanf(buf,"%x",&dst_height); +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/dst_top", "r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf), fp)) +- sscanf(buf,"%x",&dst_top); +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/dst_left", "r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf), fp)) +- sscanf(buf,"%x",&dst_left); +- fclose(fp); +- } ++ aspect = proc_get_hex("/proc/stb/vmpeg/0/aspect"); ++ dst_width = proc_get_hex("/proc/stb/vmpeg/0/dst_width"); ++ dst_height = proc_get_hex("/proc/stb/vmpeg/0/dst_height"); ++ dst_top = proc_get_hex("/proc/stb/vmpeg/0/dst_top"); ++ dst_left = proc_get_hex("/proc/stb/vmpeg/0/dst_left"); + if (dst_width == 720) dst_width = 0; + if (dst_height == 576) dst_height = 0; + } +@@ -828,7 +862,7 @@ int main(int argc, char **argv) + resize(osd, output, xres_o, yres_o, xres, yres, 4); + memcpy(osd, output, xres * yres * 4); + } +- if (xres_v != dst_width || yres_v != dst_height) ++ if ((xres_v != dst_width || yres_v != dst_height) && (pips == 0)) + { + if (!quiet) + fprintf(stderr, "Resizing Video to %d x %d ...\n", dst_width, dst_height); +@@ -852,7 +886,10 @@ int main(int argc, char **argv) + { + if (!quiet) + fprintf(stderr, "Merge Video with Framebuffer ...\n"); +- combine(output, video, osd, dst_left, dst_top, dst_width ? dst_width : xres, dst_height ? dst_height : yres, xres, yres); ++ if (pips == 0) ++ combine(output, video, osd, dst_left, dst_top, dst_width ? dst_width : xres, dst_height ? dst_height : yres, xres, yres); ++ else ++ combine(output, video, osd, 0, 0, xres, yres, xres, yres); + } + + // resize to specific width ? +@@ -1040,11 +1077,13 @@ int main(int argc, char **argv) + + // grabing the video picture + +-void getvideo2(unsigned char *video, int *xres, int *yres) ++void getvideo2(unsigned char *video, int *xres, int *yres, int dev) + { +- int fd_video = open("/dev/dvb/adapter0/video0", O_RDONLY); ++ char vdev[64]; ++ sprintf(vdev, "/dev/dvb/adapter0/video%d", dev); ++ int fd_video = open(vdev, O_RDONLY); + if (fd_video < 0) { +- perror("/dev/dvb/adapter0/video0"); ++ perror(vdev); + return; + } + ssize_t r = read(fd_video, video, 1920 * 1080 * 3); +@@ -1109,10 +1148,7 @@ void getvideo(unsigned char *video, int *xres, int *yres) + + munmap((void*)data, 100); + +- fp=fopen("/proc/stb/vmpeg/0/yres","r"); +- while (fgets(buf,sizeof(buf),fp)) +- sscanf(buf,"%x",&res); +- fclose(fp); ++ res = proc_get_hex("/proc/stb/vmpeg/0/yres"); + + if (!adr || !adr2) + { +@@ -1507,25 +1543,8 @@ void getvideo(unsigned char *video, int *xres, int *yres) + *xres=0; + *yres=0; + +- fp = fopen("/proc/stb/vmpeg/0/xres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&stride); +- } +- fclose(fp); +- } +- +- fp = fopen("/proc/stb/vmpeg/0/yres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&res); +- } +- fclose(fp); +- } ++ stride = proc_get_hex("/proc/stb/vmpeg/0/xres"); ++ res = proc_get_hex("/proc/stb/vmpeg/0/yres"); + + if((stride == 0) || (res == 0)) return; + +@@ -1678,24 +1697,8 @@ void getvideo(unsigned char *video, int *xres, int *yres) + *xres=0; + *yres=0; + +- fp = fopen("/proc/stb/vmpeg/0/xres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&stride); +- } +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/yres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&res); +- } +- fclose(fp); +- } ++ stride = proc_get_hex("/proc/stb/vmpeg/0/xres"); ++ res = proc_get_hex("/proc/stb/vmpeg/0/yres"); + + //if stride and res are zero return (please note that stillpictures will not be captured) + if((stride == 0)&&(res == 0)) return; +@@ -1922,24 +1925,8 @@ void getvideo(unsigned char *video, int *xres, int *yres) + else if (stb_type == XILLEON) + { + // grab xilleon pic from decoder memory +- fp = fopen("/proc/stb/vmpeg/0/xres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&stride); +- } +- fclose(fp); +- } +- fp = fopen("/proc/stb/vmpeg/0/yres","r"); +- if (fp) +- { +- while (fgets(buf,sizeof(buf),fp)) +- { +- sscanf(buf,"%x",&res); +- } +- fclose(fp); +- } ++ stride = proc_get_hex("/proc/stb/vmpeg/0/xres"); ++ res = proc_get_hex("/proc/stb/vmpeg/0/yres"); + + if(!(memory = (unsigned char*)mmap(0, 1920*1152*6, PROT_READ, MAP_SHARED, mem_fd, 0x6000000))) + { +@@ -2452,6 +2439,48 @@ void fast_resize(const unsigned char *source, unsigned char *dest, int xsource, + } + } + } ++// combining 2 videos ++void combine_video(unsigned char *output, const unsigned char *input, int xres, int yres, int pip) ++{ ++ printf("combine video %d\n", pip); ++ int dst_width, dst_height; ++ int dst_x,dst_y; ++ char vmpeg[64]; ++ unsigned char *r_input; ++ ++ sprintf(vmpeg, "/proc/stb/vmpeg/%d/dst_width", pip); ++ dst_width = proc_get_hex(vmpeg); ++ dst_width = (int)(dst_width*xres/720); ++ ++ sprintf(vmpeg, "/proc/stb/vmpeg/%d/dst_height", pip); ++ dst_height = proc_get_hex(vmpeg); ++ dst_height = (int)(dst_height*yres/576); ++ ++ sprintf(vmpeg, "/proc/stb/vmpeg/%d/dst_left", pip); ++ dst_x = proc_get_hex(vmpeg); ++ dst_x = (int)(dst_x*xres/720); ++ ++ sprintf(vmpeg, "/proc/stb/vmpeg/%d/dst_top", pip); ++ dst_y = proc_get_hex(vmpeg); ++ dst_y = (int)(dst_y*yres/576); ++ ++ r_input = (unsigned char *)malloc(dst_width*dst_height*3); ++ fprintf(stderr, "Resizing Video to %d x %d ...\n", dst_width, dst_height); ++ resize(input, r_input, xres, yres, dst_width, dst_height, 3); ++ ++ int ypos,xpos; ++ for (ypos = dst_y; ypos < dst_y+dst_height; ypos++) ++ { ++ int o_pos = ypos * xres * 3; ++ for (xpos = dst_x; xpos < dst_x+dst_width; xpos++) ++ { ++ int pixel = ((ypos - dst_y) * dst_width + (xpos - dst_x)) * 3; ++ output[dst_x*3+o_pos++] = r_input[pixel]; ++ output[dst_x*3+o_pos++] = r_input[pixel + 1]; ++ output[dst_x*3+o_pos++] = r_input[pixel + 2]; ++ } ++ } ++} + + // combining pixmaps by using an alphamap + void combine(unsigned char *output, const unsigned char *video, const unsigned char *osd, int vleft, int vtop, int vwidth, int vheight, int xres, int yres) +-- +2.20.1 + diff --git a/package/aio-grab/patches/0002-aio-grab-arm-short-help-for-x-added.patch b/package/aio-grab/patches/0002-aio-grab-arm-short-help-for-x-added.patch new file mode 100644 index 00000000..49a97824 --- /dev/null +++ b/package/aio-grab/patches/0002-aio-grab-arm-short-help-for-x-added.patch @@ -0,0 +1,24 @@ +From 09d1f6257c14278475f02c6132dc59fee2a1ca1d Mon Sep 17 00:00:00 2001 +From: BPanther +Date: Sun, 17 Oct 2021 15:33:43 +0200 +Subject: [PATCH 2/2] aio-grab-arm: short help for -x added + +--- + main.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/main.c b/main.c +index 18c8c37..de9af12 100644 +--- a/main.c ++++ b/main.c +@@ -663,6 +663,7 @@ int main(int argc, char **argv) + "-p produce png files instead of bmp\n" + "-q Quiet mode, don't output debug messages\n" + "-s write to stdout instead of a file\n" ++ "-x (count) additional PIP count (count 1-3)\n" + "-h this help screen\n\n" + "If no command is given the complete picture will be grabbed.\n" + "If no filename is given /tmp/screenshot.[bmp/jpg/png] will be used.\n"); +-- +2.20.1 +