1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Converting a grabbed image to JPEG is now done with the new function RgbToJpeg()

This commit is contained in:
Klaus Schmidinger 2005-12-29 11:24:02 +01:00
parent d877846cc9
commit aa64d64d90
4 changed files with 122 additions and 32 deletions

View File

@ -3963,7 +3963,7 @@ Video Disk Recorder Revision History
commands may now be executed at any time, and the message will be displayed commands may now be executed at any time, and the message will be displayed
(no more "pending message"). (no more "pending message").
2005-12-28: Version 1.3.38 2005-12-29: Version 1.3.38
- Fixed handling second audio and Dolby Digital PIDs for encrypted channels - Fixed handling second audio and Dolby Digital PIDs for encrypted channels
(was broken in version 1.3.37). (was broken in version 1.3.37).
@ -4006,3 +4006,5 @@ Video Disk Recorder Revision History
timer" menu for that timer. timer" menu for that timer.
- Removing deleted recordings is now done in a separate thread. - Removing deleted recordings is now done in a separate thread.
- Dropped the unused "stop recording on primary interface" stuff. - Dropped the unused "stop recording on primary interface" stuff.
- Converting a grabbed image to JPEG is now done with the new function
RgbToJpeg() (see tools.h).

View File

@ -4,18 +4,11 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.c 1.141 2005/12/28 12:28:05 kls Exp $ * $Id: dvbdevice.c 1.142 2005/12/29 11:24:02 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
#include <errno.h> #include <errno.h>
extern "C" {
#ifdef boolean
#define HAVE_BOOLEAN
#endif
#include <jpeglib.h>
#undef boolean
}
#include <limits.h> #include <limits.h>
#include <linux/videodev.h> #include <linux/videodev.h>
#include <linux/dvb/audio.h> #include <linux/dvb/audio.h>
@ -539,27 +532,19 @@ bool cDvbDevice::GrabImage(const char *FileName, bool Jpeg, int Quality, int Siz
if (f) { if (f) {
if (Jpeg) { if (Jpeg) {
// write JPEG file: // write JPEG file:
struct jpeg_compress_struct cinfo; int JpegImageSize;
struct jpeg_error_mgr jerr; uchar *JpegImage = RgbToJpeg(mem, vm.width, vm.height, JpegImageSize, Quality);
cinfo.err = jpeg_std_error(&jerr); if (JpegImage) {
jpeg_create_compress(&cinfo); if (fwrite(JpegImage, JpegImageSize, 1, f) != 1) {
jpeg_stdio_dest(&cinfo, f); LOG_ERROR_STR(FileName);
cinfo.image_width = vm.width; result |= 1;
cinfo.image_height = vm.height; }
cinfo.input_components = 3; delete JpegImage;
cinfo.in_color_space = JCS_RGB; }
else {
jpeg_set_defaults(&cinfo); esyslog("ERROR: failed to convert image to JPEG");
jpeg_set_quality(&cinfo, Quality, true); result |= 1;
jpeg_start_compress(&cinfo, true); }
int rs = vm.width * 3;
JSAMPROW rp[vm.height];
for (int k = 0; k < vm.height; k++)
rp[k] = &mem[rs * k];
jpeg_write_scanlines(&cinfo, rp, vm.height);
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
} }
else { else {
// write PNM file: // write PNM file:

96
tools.c
View File

@ -4,13 +4,20 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.c 1.105 2005/12/18 10:33:04 kls Exp $ * $Id: tools.c 1.106 2005/12/29 11:20:28 kls Exp $
*/ */
#include "tools.h" #include "tools.h"
#include <ctype.h> #include <ctype.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
extern "C" {
#ifdef boolean
#define HAVE_BOOLEAN
#endif
#include <jpeglib.h>
#undef boolean
}
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/time.h> #include <sys/time.h>
@ -651,6 +658,93 @@ cString TimeString(time_t t)
return buf; return buf;
} }
// --- RgbToJpeg -------------------------------------------------------------
#define JPEGCOMPRESSMEM 500000
struct tJpegCompressData {
int size;
uchar *mem;
};
static void JpegCompressInitDestination(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 = MALLOC(uchar, jcd->size);
}
}
static boolean JpegCompressEmptyOutputBuffer(j_compress_ptr cinfo)
{
tJpegCompressData *jcd = (tJpegCompressData *)cinfo->client_data;
if (jcd) {
int Used = jcd->size;
jcd->size += JPEGCOMPRESSMEM;
jcd->mem = (uchar *)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(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 = (uchar *)realloc(jcd->mem, jcd->size);
}
}
}
uchar *RgbToJpeg(uchar *Mem, int Width, int Height, int &Size, int Quality)
{
if (Quality < 0)
Quality = 0;
else if (Quality > 100)
Quality = 100;
jpeg_destination_mgr jdm;
jdm.init_destination = JpegCompressInitDestination;
jdm.empty_output_buffer = JpegCompressEmptyOutputBuffer;
jdm.term_destination = JpegCompressTermDestination;
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
cinfo.dest = &jdm;
tJpegCompressData jcd;
cinfo.client_data = &jcd;
cinfo.image_width = Width;
cinfo.image_height = Height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, Quality, true);
jpeg_start_compress(&cinfo, true);
int rs = Width * 3;
JSAMPROW rp[Height];
for (int k = 0; k < Height; k++)
rp[k] = &Mem[rs * k];
jpeg_write_scanlines(&cinfo, rp, Height);
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
Size = jcd.size;
return jcd.mem;
}
// --- cReadLine ------------------------------------------------------------- // --- cReadLine -------------------------------------------------------------
cReadLine::cReadLine(void) cReadLine::cReadLine(void)

11
tools.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.h 1.85 2005/12/17 11:09:37 kls Exp $ * $Id: tools.h 1.86 2005/12/29 11:09:43 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -121,6 +121,15 @@ cString DayDateTime(time_t t = 0);
cString TimeToString(time_t t); cString TimeToString(time_t t);
cString DateString(time_t t); cString DateString(time_t t);
cString TimeString(time_t t); cString TimeString(time_t t);
uchar *RgbToJpeg(uchar *Mem, int Width, int Height, int &Size, int Quality = 100);
///< Converts the given Memory to a JPEG image and returns a pointer
///< to the resulting image. Mem must point to a data block of exactly
///< (Width * Height) triplets of RGB image data bytes. Upon return, Size
///< will hold the number of bytes of the resulting JPEG data.
///< Quality can be in the range 0..100 and controls the quality of the
///< resulting image, where 100 is "best". The caller takes ownership of
///< the result and has to delete it once it is no longer needed.
///< The result may be NULL in case of an error.
class cTimeMs { class cTimeMs {
private: private: