summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS1
-rw-r--r--HISTORY4
-rw-r--r--svdrp.c47
3 files changed, 46 insertions, 6 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 845cf917..44641efd 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1369,6 +1369,7 @@ Darren Salt <linux@youmustbejoking.demon.co.uk>
for a patch that was used to add the command line options '--lirc', '--rcu' and
'--no-kbd'
for adding '__attribute__' to functions that use printf() like parameters
+ for suggesting to write grabbed images to the SVDRP connection encoded in base64
Sean Carlos <seanc@libero.it>
for translating OSD texts to the Italian language
diff --git a/HISTORY b/HISTORY
index c27d04ea..40304569 100644
--- a/HISTORY
+++ b/HISTORY
@@ -4019,3 +4019,7 @@ Video Disk Recorder Revision History
need to be adapted to the new interface.
- The new class cBase64Encoder (see tools.h) can be used to encode data in
base64 (thanks to Bob Withers for publishing his Base64 class).
+- The SVDRP command GRAB now writes the image data to the SVDRP connection
+ (encoded in base64) if the given file name consists of only the file
+ extension (".jpg", ".jpeg" or ".pnm"), or if only "-" is given as file
+ name (based on a suggestion from Darren Salt).
diff --git a/svdrp.c b/svdrp.c
index 91b39518..74b89758 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 1.86 2005/12/29 13:33:43 kls Exp $
+ * $Id: svdrp.c 1.87 2005/12/30 10:27:23 kls Exp $
*/
#include "svdrp.h"
@@ -204,9 +204,13 @@ const char *HelpPages[] = {
"GRAB <filename> [ <quality> [ <sizex> <sizey> ] ]\n"
" Grab the current frame and save it to the given file. Images can\n"
" be stored as JPEG or PNM, depending on the given file name extension.\n"
- " The quality of the grabbed image (only applies to JPEG) can be in the\n"
- " range 0..100, where 100 means \"best\". The size parameters define the\n"
- " size of the resulting image (default is full screen).",
+ " The quality of the grabbed image can be in the range 0..100, where 100\n"
+ " (the default) means \"best\" (only applies to JPEG). The size parameters\n"
+ " define the size of the resulting image (default is full screen).\n"
+ " If the file name is just an extension (.jpg, .jpeg or .pnm) the image\n"
+ " data will be sent to the SVDRP connection encoded in base64. The same\n"
+ " happens if '-' (a minus sign) is given as file name, in which case the\n"
+ " image format defaults to JPEG.",
"HELP [ <topic> ]\n"
" The HELP command gives help info.",
"HITK [ <key> ]\n"
@@ -309,6 +313,7 @@ const char *HelpPages[] = {
214 Help message
215 EPG or recording data record
+ 216 Image grab data (base 64)
220 VDR service ready
221 VDR service closing transmission channel
250 Requested VDR action okay, completed
@@ -668,7 +673,11 @@ void cSVDRP::CmdGRAB(const char *Option)
Reply(501, "Unknown image type \"%s\"", Extension + 1);
return;
}
+ if (Extension == FileName)
+ FileName = NULL;
}
+ else if (strcmp(FileName, "-") == 0)
+ FileName = NULL;
else {
Reply(501, "Missing filename extension in \"%s\"", FileName);
return;
@@ -711,8 +720,34 @@ void cSVDRP::CmdGRAB(const char *Option)
Reply(501, "Unexpected parameter \"%s\"", p);
return;
}
- if (cDevice::PrimaryDevice()->GrabImageFile(FileName, Jpeg, Quality, SizeX, SizeY))
- Reply(250, "Grabbed image %s", Option);
+ int ImageSize;
+ uchar *Image = cDevice::PrimaryDevice()->GrabImage(ImageSize, Jpeg, Quality, SizeX, SizeY);
+ if (Image) {
+ if (FileName) {
+ FILE *f = fopen(FileName, "wb");
+ if (f) {
+ if (fwrite(Image, ImageSize, 1, f) == 1)
+ Reply(250, "Grabbed image %s", Option);
+ else {
+ LOG_ERROR_STR(FileName);
+ Reply(451, "Can't write to '%s'", FileName);
+ }
+ fclose(f);
+ }
+ else {
+ LOG_ERROR_STR(FileName);
+ Reply(451, "Can't open '%s'", FileName);
+ }
+ }
+ else {
+ cBase64Encoder Base64(Image, ImageSize);
+ const char *s;
+ while ((s = Base64.NextLine()) != NULL)
+ Reply(-216, s);
+ Reply(216, "Grabbed image %s", Option);
+ }
+ free(Image);
+ }
else
Reply(451, "Grab image failed");
}