From: Andreas A. <ya...@in...> - 2012-01-30 22:15:14
Attachments:
3
|
This patch added support for new continuous video frame grabbing feature of xine-lib 1.2 for the vdr input plugin. The old grab feature is still also supported retaining backward compatibility. The patch changes the vdr input plugin protocol version to 905. The new grabbing feature is able to return a jpeg compressed image if xine-lib is compiled against the libjpeg library. Auto detection of libjpeg is added to configure. Library location could be specified with new configure parameter '--with-jpeg-prefix'. The libjpeg dependency is also added to debian control file. |
From: Paul M. <pau...@us...> - 2012-01-30 22:54:02
Attachments:
signature.asc
|
Dear Andreas, thank you for the patch. Am Montag, den 30.01.2012, 23:15 +0100 schrieb Andreas Auras: > This patch added support for new continuous video frame grabbing > feature of xine-lib 1.2 for the vdr input plugin. > The old grab feature is still also supported retaining backward > compatibility. > The patch changes the vdr input plugin protocol version to 905. Why did you choose 905 and not 902? > The new grabbing feature is able to return a jpeg compressed image > if xine-lib is compiled against the libjpeg library. Sorry for the noob question, but is that an entirely new feature or just an alternative for doing things. If the later what advantages does JPEG have over PNM? > Auto detection of libjpeg is added to configure. > Library location could be specified with new configure > parameter '--with-jpeg-prefix'. > The libjpeg dependency is also added to debian control file. […] > diff --git a/debian/control b/debian/control > index 044c9ef..08ca7fc 100644 > --- a/debian/control > +++ b/debian/control > @@ -25,13 +25,13 @@ Build-Depends: debhelper (>= 5.0.1), binutils (>= 2.12.90.0.9), pkg-config, > libsmbclient-dev, libspeex-dev, libmng-dev, > libmad0-dev, libmpcdec-dev, libcdio-dev, libvcdinfo-dev, > libdvdnav-dev, libdvdread-dev, libbluray-dev, > - zlib1g-dev, w3m, xmlto, librsvg2-bin > + zlib1g-dev, w3m, xmlto, librsvg2-bin, libjpeg62-dev I believe at least in Sid/unstable `libjpeg-dev` should be used. > Standards-Version: 3.7.2 > > Package: libxine2-dev > Architecture: any > Section: libdevel > -Depends: libxine2 (= ${Source-Version}), libc6-dev, zlib1g-dev | libz-dev, libslang2-dev | slang1-dev, libfreetype6-dev, pkg-config > +Depends: libxine2 (= ${Source-Version}), libc6-dev, zlib1g-dev | libz-dev, libjpeg62-dev, libslang2-dev | slang1-dev, libfreetype6-dev, pkg-config Dito. > Conflicts: xine-ui (<< 0.9.10), libxine-dev > Replaces: libxine-dev (>= 1.1.90) > Description: the xine video player library, development packages > diff --git a/include/xine/vdr.h b/include/xine/vdr.h > index 4093472..42f355a 100644 > --- a/include/xine/vdr.h > +++ b/include/xine/vdr.h > @@ -22,7 +22,7 @@ > #define __VDR_H > > > -#define XINE_VDR_VERSION 901 > +#define XINE_VDR_VERSION 905 See question asked in the beginning. > enum funcs > @@ -62,6 +62,7 @@ enum funcs > , func_get_version > , func_discontinuity > , func_query_capabilities > + , func_grab_image_v2 v2 is not very descriptive. Use `func_grab_image_jpeg`? > }; > > enum keys > @@ -421,6 +422,19 @@ data_grab_image_t; > > > > +typedef struct __attribute__((packed)) data_grab_image_v2_s > +{ > + data_header_t header; > + > + uint16_t width; > + uint16_t height; > + uint16_t jpeg; > + uint16_t quality; > +} > +data_grab_image_v2_t; > + > + > + > typedef struct __attribute__((packed)) result_grab_image_s > { > result_header_t header; > @@ -618,6 +632,7 @@ typedef union __attribute__((packed)) data_union_u > data_wait_t wait; > data_setup_t setup; > data_grab_image_t grab_image; > + data_grab_image_v2_t grab_image_v2; > data_get_pts_t get_pts; > data_first_frame_t first_frame; > data_still_frame_t still_frame; > diff --git a/src/vdr/Makefile.am b/src/vdr/Makefile.am > index 68e6cd8..9a31301 100644 > --- a/src/vdr/Makefile.am > +++ b/src/vdr/Makefile.am > @@ -2,7 +2,7 @@ include $(top_srcdir)/misc/Makefile.quiet > include $(top_builddir)/misc/Makefile.plugins > include $(top_srcdir)/misc/Makefile.common > > -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) > +AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) $(JPEGLIB_CPPFLAGS) > AM_LDFLAGS = $(xineplug_ldflags) > > if ENABLE_VDR > @@ -11,4 +11,4 @@ endif > > xineplug_vdr_la_SOURCES = combined_vdr.c combined_vdr.h input_vdr.c post_vdr_video.c post_vdr_audio.c > xineplug_vdr_la_CFLAGS = $(AM_CFLAGS) -fno-strict-aliasing > -xineplug_vdr_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) > +xineplug_vdr_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(JPEGLIB_LIBS) > diff --git a/src/vdr/input_vdr.c b/src/vdr/input_vdr.c > index 53da46c..533c0c0 100644 > --- a/src/vdr/input_vdr.c > +++ b/src/vdr/input_vdr.c > @@ -50,6 +50,14 @@ > #include "combined_vdr.h" > > > +#ifdef HAVE_JPEGLIB > +#ifdef boolean > +# define HAVE_BOOLEAN > +#endif > +#include <jpeglib.h> > +#undef boolean > +#endif /*HAVE_JPEGLIB*/ Add spaces in the comment? > + > > #define VDR_MAX_NUM_WINDOWS 16 > #define VDR_ABS_FIFO_DIR "/tmp/vdr-xine" > @@ -183,6 +191,53 @@ typedef struct > vdr_input_class_t; > > > +#ifdef HAVE_JPEGLIB > +#define JPEGCOMPRESSMEM 500000 > + > +typedef struct tJpegCompressData_s { > + int size; > + unsigned char *mem; > +} tJpegCompressData; > + > +static void JpegCompressInitDestination(const j_compress_ptr cinfo) > +{ > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > + if (jcd) { > + cinfo->dest->free_in_buffer = jcd->size = JPEGCOMPRESSMEM; > + cinfo->dest->next_output_byte = jcd->mem = > + (unsigned char *)malloc(jcd->size); > + } > +} > + > +static boolean JpegCompressEmptyOutputBuffer(const j_compress_ptr cinfo) > +{ > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > + if (jcd) { > + int Used = jcd->size; > + jcd->size += JPEGCOMPRESSMEM; > + jcd->mem = (unsigned char *)realloc(jcd->mem, jcd->size); > + if (jcd->mem) { > + cinfo->dest->next_output_byte = jcd->mem + Used; > + cinfo->dest->free_in_buffer = jcd->size - Used; > + return TRUE; > + } > + } > + return FALSE; > +} > + > +static void JpegCompressTermDestination(const j_compress_ptr cinfo) > +{ > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > + if (jcd) { > + int Used = cinfo->dest->next_output_byte - jcd->mem; > + if (Used < jcd->size) { > + jcd->size = Used; > + jcd->mem = (unsigned char *)realloc(jcd->mem, jcd->size); > + } > + } > +} > +#endif /*HAVE_JPEGLIB */ Add spaces to the comment? > + > > static int vdr_write(int f, void *b, int n) > { > @@ -1164,6 +1219,113 @@ t3 = _now(); > } > break; > > + case func_grab_image_v2: > + { > + READ_DATA_OR_FAIL(grab_image_v2, lprintf("got GRABIMAGEV2\n")); > + { > + int size = 0; > + char *img = NULL; > + > + result_grab_image_t result_grab_image; > + memset(&result_grab_image, 0, sizeof(result_grab_image)); > + result_grab_image.header.func = data->header.func; > + result_grab_image.header.len = sizeof (result_grab_image); Coding style. Remove space after `sizeof`. > + > + xine_grab_video_frame_t *grab_frame = xine_new_grab_video_frame(this->stream); > + if (grab_frame) > + { > + grab_frame->width = data->width; > + grab_frame->height = data->height; > + if (!grab_frame->grab(grab_frame)) > + { > + if (!data->jpeg) /* convert to PNM */ > + { > + /* allocate memory for result */ > + size_t bytes = grab_frame->width * grab_frame->height * 3; > + img = malloc(bytes + 64); > + if (img) > + { > + /* PNM header */ > + sprintf(img, "P6\n%d\n%d\n255\n", grab_frame->width, grab_frame->height); > + int hdrlen = strlen(img); > + > + /* copy image */ > + xine_fast_memcpy(img + hdrlen, grab_frame->img, bytes); > + > + size = bytes + hdrlen; > + } > + } > + else /* JPEG */ > + { > +#ifdef HAVE_JPEGLIB > + /* Compress JPEG */ > + struct jpeg_destination_mgr jdm; > + struct jpeg_compress_struct cinfo; > + struct jpeg_error_mgr jerr; > + tJpegCompressData jcd; > + > + jdm.init_destination = JpegCompressInitDestination; > + jdm.empty_output_buffer = JpegCompressEmptyOutputBuffer; > + jdm.term_destination = JpegCompressTermDestination; > + cinfo.err = jpeg_std_error(&jerr); > + jpeg_create_compress(&cinfo); > + cinfo.dest = &jdm; > + cinfo.client_data = &jcd; > + cinfo.image_width = grab_frame->width; > + cinfo.image_height = grab_frame->height; > + cinfo.input_components = 3; > + cinfo.in_color_space = JCS_RGB; > + > + jpeg_set_defaults(&cinfo); > + jpeg_set_quality(&cinfo, data->quality, TRUE); > + jpeg_start_compress(&cinfo, TRUE); > + > + JSAMPROW rp[grab_frame->height]; > + int rs = grab_frame->width * 3; > + int k; > + for (k = 0; k < grab_frame->height; k++) > + rp[k] = grab_frame->img + k * rs; > + jpeg_write_scanlines(&cinfo, rp, grab_frame->height); > + > + jpeg_finish_compress(&cinfo); > + jpeg_destroy_compress(&cinfo); > + > + size = jcd.size; > + img = (char*)jcd.mem; > +#else > + lprintf("no JPEG support present!\n"); Start sentence with capital n: »No JPEG …«. > +#endif > + } > + } […] Thanks, Paul |
From: VDR U. <use...@gm...> - 2012-01-31 00:11:56
|
On Mon, Jan 30, 2012 at 2:53 PM, Paul Menzel <pau...@us...> wrote: >> --- a/debian/control >> +++ b/debian/control >> @@ -25,13 +25,13 @@ Build-Depends: debhelper (>= 5.0.1), binutils (>= 2.12.90.0.9), pkg-config, >> libsmbclient-dev, libspeex-dev, libmng-dev, >> libmad0-dev, libmpcdec-dev, libcdio-dev, libvcdinfo-dev, >> libdvdnav-dev, libdvdread-dev, libbluray-dev, >> - zlib1g-dev, w3m, xmlto, librsvg2-bin >> + zlib1g-dev, w3m, xmlto, librsvg2-bin, libjpeg62-dev > > I believe at least in Sid/unstable `libjpeg-dev` should be used. Yes, that's correct and it's not just for unstable. libjpeg-dev should be used there. |
From: Andreas A. <ya...@in...> - 2012-01-31 09:04:02
|
> Von: Paul Menzel [mailto:pau...@us...] > Gesendet: Montag, 30. Januar 2012 23:54 > An: xin...@li... > Betreff: Re: [xine-devel] [PATCH 3/4] Support for new continuous video > frame grabbing feature for vdr input plugin. > > Dear Andreas, > > > thank you for the patch. > > Am Montag, den 30.01.2012, 23:15 +0100 schrieb Andreas Auras: > > This patch added support for new continuous video frame grabbing > > feature of xine-lib 1.2 for the vdr input plugin. > > The old grab feature is still also supported retaining backward > > compatibility. > > The patch changes the vdr input plugin protocol version to 905. > > Why did you choose 905 and not 902? The current official version number of the vdr xine plugin is 9.0.4. This plugin needs a additional patch to use the new grabbing feature. So it becomes something like 9.0.4++. Thats why i choose 905. > > > The new grabbing feature is able to return a jpeg compressed image if > > xine-lib is compiled against the libjpeg library. > > Sorry for the noob question, but is that an entirely new feature or just an > alternative for doing things. If the later what advantages does JPEG have > over PNM? This is simply a requirement that comes from the vdr itself which offers a general grab feature which can deliver pnm or jpeg images. Before this patch the jpeg conversation was done within the vdr plugin component in a very inefficent way calling external programms. The advantages of jpeg over pnm is that the image is compressed. And doing this now on the client side within the xine player reduces the number of bytes that have to be transferred over network. > > > Auto detection of libjpeg is added to configure. > > Library location could be specified with new configure parameter > > '--with-jpeg-prefix'. > > The libjpeg dependency is also added to debian control file. > > […] > > > diff --git a/debian/control b/debian/control index 044c9ef..08ca7fc > > 100644 > > --- a/debian/control > > +++ b/debian/control > > @@ -25,13 +25,13 @@ Build-Depends: debhelper (>= 5.0.1), binutils (>= > 2.12.90.0.9), pkg-config, > > libsmbclient-dev, libspeex-dev, libmng-dev, > > libmad0-dev, libmpcdec-dev, libcdio-dev, libvcdinfo-dev, > > libdvdnav-dev, libdvdread-dev, libbluray-dev, > > - zlib1g-dev, w3m, xmlto, librsvg2-bin > > + zlib1g-dev, w3m, xmlto, librsvg2-bin, libjpeg62-dev > > I believe at least in Sid/unstable `libjpeg-dev` should be used. Well I tested only under ubuntu lucid. And there exists only package libjepg62. We should add libjpeg-dev as another alternative to the control file. > > > enum funcs > > @@ -62,6 +62,7 @@ enum funcs > > , func_get_version > > , func_discontinuity > > , func_query_capabilities > > + , func_grab_image_v2 > > v2 is not very descriptive. Use `func_grab_image_jpeg`? No. It can deliver images as jpeg or pnm. So it is clearly a replacement for the old grab feature. > > > }; > > > > enum keys > > @@ -421,6 +422,19 @@ data_grab_image_t; > > > > > > > > +typedef struct __attribute__((packed)) data_grab_image_v2_s { > > + data_header_t header; > > + > > + uint16_t width; > > + uint16_t height; > > + uint16_t jpeg; > > + uint16_t quality; > > +} > > +data_grab_image_v2_t; > > + > > + > > + > > typedef struct __attribute__((packed)) result_grab_image_s { > > result_header_t header; > > @@ -618,6 +632,7 @@ typedef union __attribute__((packed)) > data_union_u > > data_wait_t wait; > > data_setup_t setup; > > data_grab_image_t grab_image; > > + data_grab_image_v2_t grab_image_v2; > > data_get_pts_t get_pts; > > data_first_frame_t first_frame; > > data_still_frame_t still_frame; > > diff --git a/src/vdr/Makefile.am b/src/vdr/Makefile.am index > > 68e6cd8..9a31301 100644 > > --- a/src/vdr/Makefile.am > > +++ b/src/vdr/Makefile.am > > @@ -2,7 +2,7 @@ include $(top_srcdir)/misc/Makefile.quiet include > > $(top_builddir)/misc/Makefile.plugins > > include $(top_srcdir)/misc/Makefile.common > > > > -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) > > +AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) > > +$(JPEGLIB_CPPFLAGS) > > AM_LDFLAGS = $(xineplug_ldflags) > > > > if ENABLE_VDR > > @@ -11,4 +11,4 @@ endif > > > > xineplug_vdr_la_SOURCES = combined_vdr.c combined_vdr.h input_vdr.c > > post_vdr_video.c post_vdr_audio.c xineplug_vdr_la_CFLAGS = > > $(AM_CFLAGS) -fno-strict-aliasing -xineplug_vdr_la_LIBADD = > > $(XINE_LIB) $(PTHREAD_LIBS) > > +xineplug_vdr_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(JPEGLIB_LIBS) > > diff --git a/src/vdr/input_vdr.c b/src/vdr/input_vdr.c index > > 53da46c..533c0c0 100644 > > --- a/src/vdr/input_vdr.c > > +++ b/src/vdr/input_vdr.c > > @@ -50,6 +50,14 @@ > > #include "combined_vdr.h" > > > > > > +#ifdef HAVE_JPEGLIB > > +#ifdef boolean > > +# define HAVE_BOOLEAN > > +#endif > > +#include <jpeglib.h> > > +#undef boolean > > +#endif /*HAVE_JPEGLIB*/ > > Add spaces in the comment? > > > + > > > > #define VDR_MAX_NUM_WINDOWS 16 > > #define VDR_ABS_FIFO_DIR "/tmp/vdr-xine" > > @@ -183,6 +191,53 @@ typedef struct > > vdr_input_class_t; > > > > > > +#ifdef HAVE_JPEGLIB > > +#define JPEGCOMPRESSMEM 500000 > > + > > +typedef struct tJpegCompressData_s { > > + int size; > > + unsigned char *mem; > > +} tJpegCompressData; > > + > > +static void JpegCompressInitDestination(const j_compress_ptr cinfo) { > > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > > + if (jcd) { > > + cinfo->dest->free_in_buffer = jcd->size = JPEGCOMPRESSMEM; > > + cinfo->dest->next_output_byte = jcd->mem = > > + (unsigned char *)malloc(jcd->size); > > + } > > +} > > + > > +static boolean JpegCompressEmptyOutputBuffer(const j_compress_ptr > > +cinfo) { > > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > > + if (jcd) { > > + int Used = jcd->size; > > + jcd->size += JPEGCOMPRESSMEM; > > + jcd->mem = (unsigned char *)realloc(jcd->mem, jcd->size); > > + if (jcd->mem) { > > + cinfo->dest->next_output_byte = jcd->mem + Used; > > + cinfo->dest->free_in_buffer = jcd->size - Used; > > + return TRUE; > > + } > > + } > > + return FALSE; > > +} > > + > > +static void JpegCompressTermDestination(const j_compress_ptr cinfo) { > > + tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data; > > + if (jcd) { > > + int Used = cinfo->dest->next_output_byte - jcd->mem; > > + if (Used < jcd->size) { > > + jcd->size = Used; > > + jcd->mem = (unsigned char *)realloc(jcd->mem, jcd->size); > > + } > > + } > > +} > > +#endif /*HAVE_JPEGLIB */ > > Add spaces to the comment? > > + > > > > static int vdr_write(int f, void *b, int n) { @@ -1164,6 +1219,113 > > @@ t3 = _now(); > > } > > break; > > > > + case func_grab_image_v2: > > + { > > + READ_DATA_OR_FAIL(grab_image_v2, lprintf("got > GRABIMAGEV2\n")); > > + { > > + int size = 0; > > + char *img = NULL; > > + > > + result_grab_image_t result_grab_image; > > + memset(&result_grab_image, 0, sizeof(result_grab_image)); > > + result_grab_image.header.func = data->header.func; > > + result_grab_image.header.len = sizeof (result_grab_image); > > Coding style. Remove space after `sizeof`. > > > + > > + xine_grab_video_frame_t *grab_frame = > xine_new_grab_video_frame(this->stream); > > + if (grab_frame) > > + { > > + grab_frame->width = data->width; > > + grab_frame->height = data->height; > > + if (!grab_frame->grab(grab_frame)) > > + { > > + if (!data->jpeg) /* convert to PNM */ > > + { > > + /* allocate memory for result */ > > + size_t bytes = grab_frame->width * grab_frame->height * 3; > > + img = malloc(bytes + 64); > > + if (img) > > + { > > + /* PNM header */ > > + sprintf(img, "P6\n%d\n%d\n255\n", grab_frame->width, > grab_frame->height); > > + int hdrlen = strlen(img); > > + > > + /* copy image */ > > + xine_fast_memcpy(img + hdrlen, grab_frame->img, > > + bytes); > > + > > + size = bytes + hdrlen; > > + } > > + } > > + else /* JPEG */ > > + { > > +#ifdef HAVE_JPEGLIB > > + /* Compress JPEG */ > > + struct jpeg_destination_mgr jdm; > > + struct jpeg_compress_struct cinfo; > > + struct jpeg_error_mgr jerr; > > + tJpegCompressData jcd; > > + > > + jdm.init_destination = JpegCompressInitDestination; > > + jdm.empty_output_buffer = JpegCompressEmptyOutputBuffer; > > + jdm.term_destination = JpegCompressTermDestination; > > + cinfo.err = jpeg_std_error(&jerr); > > + jpeg_create_compress(&cinfo); > > + cinfo.dest = &jdm; > > + cinfo.client_data = &jcd; > > + cinfo.image_width = grab_frame->width; > > + cinfo.image_height = grab_frame->height; > > + cinfo.input_components = 3; > > + cinfo.in_color_space = JCS_RGB; > > + > > + jpeg_set_defaults(&cinfo); > > + jpeg_set_quality(&cinfo, data->quality, TRUE); > > + jpeg_start_compress(&cinfo, TRUE); > > + > > + JSAMPROW rp[grab_frame->height]; > > + int rs = grab_frame->width * 3; > > + int k; > > + for (k = 0; k < grab_frame->height; k++) > > + rp[k] = grab_frame->img + k * rs; > > + jpeg_write_scanlines(&cinfo, rp, grab_frame->height); > > + > > + jpeg_finish_compress(&cinfo); > > + jpeg_destroy_compress(&cinfo); > > + > > + size = jcd.size; > > + img = (char*)jcd.mem; > > +#else > > + lprintf("no JPEG support present!\n"); > > Start sentence with capital n: »No JPEG …«. > > > +#endif > > + } > > + } > > […] Well I try to use the formatting that is already present in the corresponding source code files. I think there are much more lines that do not correspond to the standard? xine lib style. I will correct the formatting for the code lines that are modifyied by the patch. By the way. I use Eclipse. Has anybody a xine-lib coding style profile for this IDE??? |
From: VDR U. <use...@gm...> - 2012-01-31 21:14:18
|
On Tue, Jan 31, 2012 at 1:03 AM, Andreas Auras <ya...@in...> wrote: > The current official version number of the vdr xine plugin is 9.0.4. > This plugin needs a additional patch to use the new grabbing feature. > So it becomes something like 9.0.4++. Thats why i choose 905. The newest version of the vdr-xine plugin is 0.9.4, not 9.0.4. You can see this on the authors webpage: http://home.vrweb.de/rnissl/ |
From: Andreas A. <ya...@in...> - 2012-01-31 21:48:38
|
Am Dienstag, den 31.01.2012, 13:14 -0800 schrieb VDR User: > On Tue, Jan 31, 2012 at 1:03 AM, Andreas Auras <ya...@in...> wrote: > > The current official version number of the vdr xine plugin is 9.0.4. > > This plugin needs a additional patch to use the new grabbing feature. > > So it becomes something like 9.0.4++. Thats why i choose 905. > > The newest version of the vdr-xine plugin is 0.9.4, not 9.0.4. You can > see this on the authors webpage: > http://home.vrweb.de/rnissl/ Yes that's correct. Sorry for my typo. I assume: 901 = 000901 => 0.9.1 |