mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Add support for grab jpeg image.
This commit is contained in:
parent
5668fa22d2
commit
2dff69dc14
@ -1,5 +1,10 @@
|
||||
User m.Rcu
|
||||
Date: Tue Jan 24 22:38:30 CET 2012
|
||||
|
||||
Add support for grab jpeg image.
|
||||
|
||||
User johns
|
||||
Date:
|
||||
Date: Tue Jan 24 22:25:33 CET 2012
|
||||
|
||||
Fix bug: VaapiOsdExit doesn't deassociate osd surface.
|
||||
Fix bug: First OSD can show random pixels.
|
||||
|
5
Makefile
5
Makefile
@ -23,6 +23,7 @@ CONFIG := #-DDEBUG
|
||||
CONFIG += $(shell pkg-config --exists vdpau && echo "-DUSE_VDPAU")
|
||||
CONFIG += $(shell pkg-config --exists libva && echo "-DUSE_VAAPI")
|
||||
CONFIG += $(shell pkg-config --exists alsa && echo "-DUSE_ALSA")
|
||||
CONFIG += $(shell ls /usr/lib/libjpeg* >/dev/null 2>&1 && echo "-DUSE_JPEG")
|
||||
CONFIG += -DUSE_OSS
|
||||
|
||||
### The C++ compiler and options:
|
||||
@ -89,7 +90,9 @@ LIBS += -lrt \
|
||||
$(if $(findstring USE_VAAPI,$(CONFIG)), \
|
||||
`pkg-config --libs libva-x11 libva-glx libva`) \
|
||||
$(if $(findstring USE_ALSA,$(CONFIG)), \
|
||||
`pkg-config --libs alsa`)
|
||||
`pkg-config --libs alsa`) \
|
||||
$(if $(findstring USE_JPEG,$(CONFIG)), \
|
||||
-ljpeg)
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
|
59
softhddev.c
59
softhddev.c
@ -39,6 +39,9 @@
|
||||
#define __USE_GNU
|
||||
#endif
|
||||
#include <pthread.h>
|
||||
#ifdef USE_JPEG
|
||||
#include <jpeglib.h>
|
||||
#endif
|
||||
|
||||
#include "misc.h"
|
||||
#include "softhddev.h"
|
||||
@ -813,6 +816,48 @@ int PlayVideo(const uint8_t * data, int size)
|
||||
return size;
|
||||
}
|
||||
|
||||
#ifdef USE_JPEG
|
||||
|
||||
uint8_t *CreateJpeg(uint8_t * image, int raw_size, int *size, int quality,
|
||||
int width, int height)
|
||||
{
|
||||
struct jpeg_compress_struct cinfo;
|
||||
struct jpeg_error_mgr jerr;
|
||||
JSAMPROW row_ptr[1];
|
||||
int row_stride;
|
||||
uint8_t *outbuf;
|
||||
long unsigned int outsize;
|
||||
|
||||
outbuf = NULL;
|
||||
outsize = 0;
|
||||
cinfo.err = jpeg_std_error(&jerr);
|
||||
jpeg_create_compress(&cinfo);
|
||||
jpeg_mem_dest(&cinfo, &outbuf, &outsize);
|
||||
|
||||
cinfo.image_width = width;
|
||||
cinfo.image_height = height;
|
||||
cinfo.input_components = raw_size / height / width;
|
||||
cinfo.in_color_space = JCS_RGB;
|
||||
|
||||
jpeg_set_defaults(&cinfo);
|
||||
jpeg_set_quality(&cinfo, quality, TRUE);
|
||||
jpeg_start_compress(&cinfo, TRUE);
|
||||
|
||||
row_stride = width * 3;
|
||||
while (cinfo.next_scanline < cinfo.image_height) {
|
||||
row_ptr[0] = &image[cinfo.next_scanline * row_stride];
|
||||
jpeg_write_scanlines(&cinfo, row_ptr, 1);
|
||||
}
|
||||
|
||||
jpeg_finish_compress(&cinfo);
|
||||
jpeg_destroy_compress(&cinfo);
|
||||
*size = outsize;
|
||||
|
||||
return outbuf;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
** Grabs the currently visible screen image.
|
||||
**
|
||||
@ -825,14 +870,26 @@ int PlayVideo(const uint8_t * data, int size)
|
||||
uint8_t *GrabImage(int *size, int jpeg, int quality, int width, int height)
|
||||
{
|
||||
if (jpeg) {
|
||||
#ifdef USE_JPEG
|
||||
int raw_size;
|
||||
uint8_t *image;
|
||||
uint8_t *jpg_image;
|
||||
|
||||
raw_size = 0;
|
||||
image = VideoGrab(&raw_size, &width, &height, 0);
|
||||
jpg_image = CreateJpeg(image, raw_size, size, quality, width, height);
|
||||
free(image);
|
||||
return jpg_image;
|
||||
#else
|
||||
(void)quality;
|
||||
Error(_("softhddev: jpeg grabbing not supported\n"));
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
if (width != -1 && height != -1) {
|
||||
Warning(_("softhddev: scaling unsupported\n"));
|
||||
}
|
||||
return VideoGrab(size, &width, &height);
|
||||
return VideoGrab(size, &width, &height, 1);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
10
video.c
10
video.c
@ -7739,7 +7739,7 @@ int64_t VideoGetClock(void)
|
||||
///
|
||||
/// Grab full screen image.
|
||||
///
|
||||
uint8_t *VideoGrab(int *size, int *width, int *height)
|
||||
uint8_t *VideoGrab(int *size, int *width, int *height, int write_header)
|
||||
{
|
||||
Debug(3, "video: grab\n");
|
||||
|
||||
@ -7771,9 +7771,11 @@ uint8_t *VideoGrab(int *size, int *width, int *height)
|
||||
if (scale_height <= 0) {
|
||||
scale_height = *height;
|
||||
}
|
||||
|
||||
n = snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", scale_width,
|
||||
scale_height);
|
||||
n = 0;
|
||||
if (write_header) {
|
||||
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"));
|
||||
|
2
video.h
2
video.h
@ -115,7 +115,7 @@ extern void VideoGetOsdSize(int *, int *);
|
||||
extern int64_t VideoGetClock(void); ///< Get video clock.
|
||||
|
||||
/// Grab screen.
|
||||
extern uint8_t *VideoGrab(int *, int *, int *);
|
||||
extern uint8_t *VideoGrab(int *, int *, int *, int);
|
||||
|
||||
extern void VideoOsdInit(void); ///< Setup osd.
|
||||
extern void VideoOsdExit(void); ///< Cleanup osd.
|
||||
|
Loading…
Reference in New Issue
Block a user