diff -urNad vdr-plugin-xine-0.7.6~/xineDevice.c vdr-plugin-xine-0.7.6/xineDevice.c --- vdr-plugin-xine-0.7.6~/xineDevice.c 2006-01-12 00:43:12.000000000 +0000 +++ vdr-plugin-xine-0.7.6/xineDevice.c 2006-01-12 00:43:12.715161206 +0000 @@ -2487,18 +2487,13 @@ return Length; } - bool cXineDevice::GrabImage(const char *FileName, bool Jpeg /* = true */, int Quality /* = -1 */, int SizeX /* = -1 */, int SizeY /* = -1 */) + uchar *cXineDevice::GrabImage(int &Size, bool Jpeg /* = true */, int Quality /* = -1 */, int SizeX /* = -1 */, int SizeY /* = -1 */) { xfprintf(stderr, "GrabImage ...\n\n"); - - if (m_xineLib.execFuncGrabImage(FileName, Jpeg, Quality, SizeX, SizeY)) - { - xfprintf(stderr, "\nGrabImage succeeded.\n"); - return true; - } - xfprintf(stderr, "\nGrabImage failed.\n"); - return false; + uchar *result = m_xineLib.execFuncGrabImage(Size, Jpeg, Quality, SizeX, SizeY); + xfprintf(stderr, result ? "\nGrabImage succeeded.\n" : "\nGrabImage failed.\n"); + return result; } int64_t cXineDevice::GetSTC(void) diff -urNad vdr-plugin-xine-0.7.6~/xineDevice.h vdr-plugin-xine-0.7.6/xineDevice.h --- vdr-plugin-xine-0.7.6~/xineDevice.h 2006-01-12 00:43:12.000000000 +0000 +++ vdr-plugin-xine-0.7.6/xineDevice.h 2006-01-12 00:43:12.715161206 +0000 @@ -66,7 +66,7 @@ int PlayCommon2(const uchar *Data, int Length); int PlayCommon3(const uchar *Data, int Length); - virtual bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); + virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); virtual void SetVideoFormat(bool VideoFormat16_9); virtual void SetVolumeDevice(int Volume); diff -urNad vdr-plugin-xine-0.7.6~/xineLib.c vdr-plugin-xine-0.7.6/xineLib.c --- vdr-plugin-xine-0.7.6~/xineLib.c 2006-01-12 00:43:12.000000000 +0000 +++ vdr-plugin-xine-0.7.6/xineLib.c 2006-01-12 00:45:33.377856050 +0000 @@ -3444,7 +3444,7 @@ #define PNMTOJPEG "pnmtojpeg" #endif - bool cXineLib::execFuncGrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY) + uchar *cXineLib::execFuncGrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY) { if (!isConnected()) return false; @@ -3453,7 +3453,7 @@ cMutexLock ioLock(&m_ioMutex); if (!isConnected()) - return false; + return NULL; data_grab_image_t data; data.header.func = func_grab_image; @@ -3465,32 +3465,32 @@ off_t n = xread(fd_result, (char *)&resultUnion, sizeof (resultUnion.header)); if (n != sizeof (resultUnion.header)) - return false; + return NULL; if (data.header.func != resultUnion.header.func) - return false; + return NULL; result_grab_image_t *result = &resultUnion.grab_image; n = xread(fd_result, (char *)result + sizeof (result->header), sizeof (*result) - sizeof (result->header)); if (n != sizeof (*result) - sizeof (result->header)) - return false; + return NULL; const size_t frameSize = result->header.len - sizeof (*result); // ::fprintf(stderr, "frameSize: %d\n", frameSize); if (frameSize <= 0) - return false; + return NULL; uint8_t *img = (uint8_t *)::malloc(frameSize); if (!img) - return false; + return NULL; if (frameSize != (size_t)xread(fd_result, img, frameSize)) { ::free(img); - return false; + return NULL; } if (XINE_IMGFMT_YUY2 == result->format) @@ -3499,7 +3499,7 @@ if (!img2) { ::free(img); - return false; + return NULL; } ::memset(img2, 0x80, frameSize); @@ -3531,11 +3531,10 @@ int videoH = -1; execFuncVideoSize(videoX, videoY, videoW, videoH); - bool success = false; - - int outfd = ::open(FileName, O_CREAT /* | O_EXCL */ | O_TRUNC | O_RDWR, 0644); - if (-1 != outfd) + FILE *fd = ::tmpfile(); + if (fd) { + int outfd = fileno(fd); int sizeX = SizeX; int sizeY = SizeY; @@ -3595,22 +3594,41 @@ , result->width, result->height , 25, 1 , ratioX, ratioY); - - success = (frameSize == ::fwrite(img, 1, frameSize, f)); - - ::pclose(f); + + if (frameSize == ::fwrite(img, 1, frameSize, f)) + { + ::pclose(f); // close the pipe here, grab the image in one go + ::free(img); + img = NULL; + + Size = (int) lseek (outfd, 0, SEEK_END); + lseek (outfd, 0, SEEK_SET); + + if (Size != -1) + { + img = (uint8_t *)::malloc(Size); + if (img && Size != ::read(outfd, img, Size)) + { + ::free(img); + img = NULL; + } + } + } + else + ::pclose(f); } ::free(cmd); - ::close(outfd); + + ::fclose(fd); + + return (uchar *)img; } - - ::free(img); - return success; + ::free(img); } - return false; + return NULL; } bool cXineLib::execFuncGetPTS(int64_t &pts) diff -urNad vdr-plugin-xine-0.7.6~/xineLib.h vdr-plugin-xine-0.7.6/xineLib.h --- vdr-plugin-xine-0.7.6~/xineLib.h 2006-01-12 00:43:12.000000000 +0000 +++ vdr-plugin-xine-0.7.6/xineLib.h 2006-01-12 00:43:12.715161206 +0000 @@ -254,7 +254,7 @@ bool execFuncMetronom(int64_t pts, uint32_t flags = 0); bool execFuncNop(); bool execFuncSetPrebuffer(int frames); - bool execFuncGrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY); + uchar *execFuncGrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY); bool execFuncGetPTS(int64_t &pts); bool execFuncVideoSize(int &videoLeft, int &videoTop, int &videoWidth, int &videoHeight);