summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-02-29 04:28:27 +0100
committerwm4 <wm4@mplayer2.org>2012-02-29 04:28:27 +0100
commitea7820ab661f07f86c555a7819bcb10365bde3da (patch)
tree54cbc0814cc3a4b7e16341fbc983cd1db42c47e7
parent12c44610ad6963bb58c01cc4415cc7befef386e1 (diff)
downloadmpv-ea7820ab661f07f86c555a7819bcb10365bde3da.tar.bz2
mpv-ea7820ab661f07f86c555a7819bcb10365bde3da.tar.xz
screenshot: move code to open file out of image writer functions
This is a minor simplification. The original intend was to only open a file if opening the image encoder went well, but this obscure special case is not worth bothering the image writer functions with more error handling.
-rw-r--r--screenshot.c45
1 files changed, 16 insertions, 29 deletions
diff --git a/screenshot.c b/screenshot.c
index 9835d1e810..cf697b7579 100644
--- a/screenshot.c
+++ b/screenshot.c
@@ -67,7 +67,7 @@ typedef struct screenshot_ctx {
struct img_writer {
const char *file_ext;
- int (*write)(screenshot_ctx *ctx, mp_image_t *image, char *filename);
+ int (*write)(screenshot_ctx *ctx, mp_image_t *image, FILE *fp);
};
void screenshot_init(struct MPContext *mpctx)
@@ -79,18 +79,8 @@ void screenshot_init(struct MPContext *mpctx)
};
}
-static FILE *open_file(screenshot_ctx *ctx, char *fname) {
- FILE *fp = fopen(fname, "wb");
- if (fp == NULL)
- mp_msg(MSGT_CPLAYER, MSGL_ERR, "\nError opening %s for writing!\n",
- fname);
- return fp;
-}
-
-static int write_png(screenshot_ctx *ctx, struct mp_image *image,
- char *filename)
+static int write_png(screenshot_ctx *ctx, struct mp_image *image, FILE *fp)
{
- FILE *fp = NULL;
void *outbuffer = NULL;
int success = 0;
@@ -121,10 +111,6 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image,
if (size < 1)
goto error_exit;
- fp = open_file(ctx, filename);
- if (fp == NULL)
- goto error_exit;
-
fwrite(outbuffer, size, 1, fp);
fflush(fp);
@@ -135,8 +121,6 @@ static int write_png(screenshot_ctx *ctx, struct mp_image *image,
error_exit:
if (avctx)
avcodec_close(avctx);
- if (fp)
- fclose(fp);
free(outbuffer);
return success;
}
@@ -152,14 +136,10 @@ static void write_jpeg_error_exit(j_common_ptr cinfo)
longjmp(*(jmp_buf*)cinfo->client_data, 1);
}
-static int write_jpeg(screenshot_ctx *ctx, mp_image_t *image, char *filename)
+static int write_jpeg(screenshot_ctx *ctx, mp_image_t *image, FILE *fp)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
- FILE *outfile = open_file(ctx, filename);
-
- if (!outfile)
- return 0;
cinfo.err = jpeg_std_error(&jerr);
jerr.error_exit = write_jpeg_error_exit;
@@ -168,12 +148,11 @@ static int write_jpeg(screenshot_ctx *ctx, mp_image_t *image, char *filename)
cinfo.client_data = &error_return_jmpbuf;
if (setjmp(cinfo.client_data)) {
jpeg_destroy_compress(&cinfo);
- fclose(outfile);
return 0;
}
jpeg_create_compress(&cinfo);
- jpeg_stdio_dest(&cinfo, outfile);
+ jpeg_stdio_dest(&cinfo, fp);
cinfo.image_width = image->width;
cinfo.image_height = image->height;
@@ -195,7 +174,6 @@ static int write_jpeg(screenshot_ctx *ctx, mp_image_t *image, char *filename)
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
- fclose(outfile);
return 1;
}
@@ -451,9 +429,18 @@ void screenshot_save(struct MPContext *mpctx, struct mp_image *image)
char *filename = gen_fname(ctx);
if (filename) {
- mp_msg(MSGT_CPLAYER, MSGL_INFO, "*** screenshot '%s' ***\n", filename);
- if (!writer->write(ctx, dst, filename))
- mp_msg(MSGT_CPLAYER, MSGL_ERR, "Error writing screenshot!\n");
+ FILE *fp = fopen(filename, "wb");
+ if (fp == NULL) {
+ mp_msg(MSGT_CPLAYER, MSGL_ERR, "\nError opening %s for writing!\n",
+ filename);
+ } else {
+ mp_msg(MSGT_CPLAYER, MSGL_INFO, "*** screenshot '%s' ***\n",
+ filename);
+ int success = writer->write(ctx, dst, fp);
+ success = !fclose(fp) && success;
+ if (!success)
+ mp_msg(MSGT_CPLAYER, MSGL_ERR, "Error writing screenshot!\n");
+ }
talloc_free(filename);
}