mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
VDPAU: Add primitive software scaler to grab image
This commit is contained in:
parent
993d831190
commit
5f43803236
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
VDPAU: Add very primitive software scaler for grab image.
|
||||||
VA-API: Add auto-crop support.
|
VA-API: Add auto-crop support.
|
||||||
Suspend can close/open X11 window, connection and audio device.
|
Suspend can close/open X11 window, connection and audio device.
|
||||||
|
|
||||||
|
3
Todo
3
Todo
@ -45,6 +45,9 @@ libva:
|
|||||||
can associate ony displayed part of osd
|
can associate ony displayed part of osd
|
||||||
ready(not intel checked) auto crop for va-api
|
ready(not intel checked) auto crop for va-api
|
||||||
grab image for va-api
|
grab image for va-api
|
||||||
|
still many:
|
||||||
|
[drm:i915_hangcheck_elapsed] *ERROR* Hangcheck timer elapsed... GPU hung
|
||||||
|
[drm:i915_wait_request] *ERROR* i915_wait_request returns -11 ...
|
||||||
|
|
||||||
libva: branch vaapi-ext
|
libva: branch vaapi-ext
|
||||||
add support for vaapi-ext
|
add support for vaapi-ext
|
||||||
|
@ -830,8 +830,7 @@ uint8_t *GrabImage(int *size, int jpeg, int quality, int width, int height)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (width != -1 && height != -1) {
|
if (width != -1 && height != -1) {
|
||||||
Error(_("softhddev: scaling not supported\n"));
|
Warning(_("softhddev: scaling unsupported\n"));
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
return VideoGrab(size, &width, &height);
|
return VideoGrab(size, &width, &height);
|
||||||
}
|
}
|
||||||
|
59
video.c
59
video.c
@ -7768,8 +7768,66 @@ uint8_t *VideoGrab(int *size, int *width, int *height)
|
|||||||
char buf[64];
|
char buf[64];
|
||||||
int i;
|
int i;
|
||||||
int n;
|
int n;
|
||||||
|
int scale_width;
|
||||||
|
int scale_height;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
double src_x;
|
||||||
|
double src_y;
|
||||||
|
double scale_x;
|
||||||
|
double scale_y;
|
||||||
|
|
||||||
|
scale_width = *width;
|
||||||
|
scale_height = *height;
|
||||||
data = VdpauGrabOutputSurface(size, width, height);
|
data = VdpauGrabOutputSurface(size, width, height);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if (scale_width <= 0) {
|
||||||
|
scale_width = *width;
|
||||||
|
}
|
||||||
|
if (scale_height <= 0) {
|
||||||
|
scale_height = *height;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", scale_width,
|
||||||
|
scale_height);
|
||||||
|
rgb = malloc(scale_width * scale_height * 3 + n);
|
||||||
|
if (!rgb) {
|
||||||
|
Error(_("video: out of memory\n"));
|
||||||
|
free(data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*size = scale_width * scale_height * 3 + n;
|
||||||
|
memcpy(rgb, buf, n); // header
|
||||||
|
|
||||||
|
scale_x = (double)*width / scale_width;
|
||||||
|
scale_y = (double)*height / scale_height;
|
||||||
|
|
||||||
|
src_y = 0.0;
|
||||||
|
for (y = 0; y < scale_height; y++) {
|
||||||
|
int o;
|
||||||
|
|
||||||
|
src_x = 0.0;
|
||||||
|
o = (int)src_y **width;
|
||||||
|
|
||||||
|
for (x = 0; x < scale_width; x++) {
|
||||||
|
i = 4 * (o + (int)src_x);
|
||||||
|
|
||||||
|
rgb[n + (x + y * scale_width) * 3 + 0] = data[i + 2];
|
||||||
|
rgb[n + (x + y * scale_width) * 3 + 1] = data[i + 1];
|
||||||
|
rgb[n + (x + y * scale_width) * 3 + 2] = data[i + 0];
|
||||||
|
|
||||||
|
src_x += scale_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
src_y += scale_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
*width = scale_width;
|
||||||
|
*height = scale_height;
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
#else
|
||||||
n = snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", *width, *height);
|
n = snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", *width, *height);
|
||||||
rgb = malloc(*width * *height * 3 + n);
|
rgb = malloc(*width * *height * 3 + n);
|
||||||
if (!rgb) {
|
if (!rgb) {
|
||||||
@ -7787,6 +7845,7 @@ uint8_t *VideoGrab(int *size, int *width, int *height)
|
|||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
*size = *width * *height * 3 + n;
|
*size = *width * *height * 3 + n;
|
||||||
|
#endif
|
||||||
|
|
||||||
return rgb;
|
return rgb;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user