From d5d36f90c90e1ce90f93561ef8416f731aa719a0 Mon Sep 17 00:00:00 2001 From: ivo Date: Wed, 1 Sep 2004 02:31:24 +0000 Subject: One-time cosmetics update. I finally got rid of the horrible one-space indentation. Changed it to four spaces. Also changed all function calls, assignments, et cetera, to conform to a certain 'standard'. Removed all trailing whitespace. No more tabs (width can be different from editor to editor), it's all spaces now. Next semi-cosmetics stop will be doxygen comments. Tested: It compiles to exactly the same object as before. No functional change has been made. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13218 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/vo_jpeg.c | 390 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 236 insertions(+), 154 deletions(-) (limited to 'libvo') diff --git a/libvo/vo_jpeg.c b/libvo/vo_jpeg.c index 0fa767d6c8..5a2c865e6c 100644 --- a/libvo/vo_jpeg.c +++ b/libvo/vo_jpeg.c @@ -1,18 +1,34 @@ +/* ------------------------------------------------------------------------- */ + /* * vo_jpeg.c, JPEG Renderer for MPlayer * - * Copyright 2002 by Pontscho (pontscho@makacs.poliod.hu) - * 25/04/2003: Spring cleanup -- alex - * 04/08/2004: Added multiple subdirectory support -- ivop@euronet.nl + * + * Changelog + * + * Original version: Copyright 2002 by Pontscho (pontscho@makacs.poliod.hu) + * 2003-04-25 Spring cleanup -- Alex + * 2004-08-04 Added multiple subdirectory support -- Ivo (ivop@euronet.nl) + * 2004-09-01 Cosmetics update -- Ivo * */ +/* ------------------------------------------------------------------------- */ + +/* Global Includes */ + #include #include #include #include - #include +#include +#include +#include + +/* ------------------------------------------------------------------------- */ + +/* Local Includes */ #include "config.h" #include "mp_msg.h" @@ -21,13 +37,17 @@ #include "mplayer.h" /* for exit_player() */ #include "help_mp.h" -#include -#include -#include +/* ------------------------------------------------------------------------- */ + +/* Defines */ /* Used for temporary buffers to store file- and pathnames */ #define BUFLENGTH 512 +/* ------------------------------------------------------------------------- */ + +/* Info */ + static vo_info_t info= { "JPEG file", @@ -38,6 +58,10 @@ static vo_info_t info= LIBVO_EXTERN (jpeg) +/* ------------------------------------------------------------------------- */ + +/* Global Variables */ + static int image_width; static int image_height; @@ -46,200 +70,258 @@ int jpeg_progressive_mode = 0; int jpeg_optimize = 100; int jpeg_smooth = 0; int jpeg_quality = 75; -char * jpeg_outdir = "."; -char * jpeg_subdirs = NULL; -int jpeg_maxfiles=1000; +char *jpeg_outdir = "."; +char *jpeg_subdirs = NULL; +int jpeg_maxfiles = 1000; -static int framenum=0; +static int framenum = 0; -static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format) -{ - char buf[BUFLENGTH]; - struct stat stat_p; +/* ------------------------------------------------------------------------- */ -/* Create outdir. If it already exists, test if it's a writable directory */ +static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, + uint32_t d_height, uint32_t fullscreen, char *title, + uint32_t format) +{ + char buf[BUFLENGTH]; + struct stat stat_p; - snprintf (buf, BUFLENGTH, "%s", jpeg_outdir); + /* Create outdir. + * If it already exists, test if it's a writable directory */ + + snprintf(buf, BUFLENGTH, "%s", jpeg_outdir); - if (mkdir (buf, 0755)<0) { - switch (errno) { /* use switch in case other errors need to be caught and handled in the future */ - case EEXIST: - if ( stat(buf, &stat_p) < 0 ) { - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) ); - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, MSGTR_VO_JPEG_UnableToAccess,buf); - exit_player(MSGTR_Exit_error); + if ( mkdir(buf, 0755) < 0 ) { + switch (errno) { /* use switch in case other errors need to be caught + and handled in the future */ + case EEXIST: + if ( stat(buf, &stat_p ) < 0 ) { + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, + MSGTR_VO_JPEG_GenericError, strerror(errno) ); + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, + MSGTR_VO_JPEG_UnableToAccess,buf); + exit_player(MSGTR_Exit_error); + } + if ( !S_ISDIR(stat_p.st_mode) ) { + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, + buf, MSGTR_VO_JPEG_ExistsButNoDirectory); + exit_player(MSGTR_Exit_error); + } + if ( !(stat_p.st_mode & S_IWUSR) ) { + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, + MSGTR_VO_JPEG_DirExistsButNotWritable); + exit_player(MSGTR_Exit_error); + } + + mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, + MSGTR_VO_JPEG_DirExistsAndIsWritable); + break; + + default: + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, + MSGTR_VO_JPEG_GenericError, strerror(errno) ); + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, + MSGTR_VO_JPEG_CantCreateDirectory); + exit_player(MSGTR_Exit_error); + } /* end switch */ + } else { + mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, + MSGTR_VO_JPEG_DirectoryCreateSuccess); + } /* end if */ + + image_height = height; + image_width = width; + + return 0; +} + +/* ------------------------------------------------------------------------- */ + +static uint32_t jpeg_write(uint8_t * name, uint8_t * buffer) +{ + FILE *outfile; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + JSAMPROW row_pointer[1]; + int row_stride; + + if ( !buffer ) return 1; + if ( (outfile = fopen(name, "wb") ) == NULL ) { + return 1; } - if ( !S_ISDIR(stat_p.st_mode) ) { - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, buf, MSGTR_VO_JPEG_ExistsButNoDirectory); - exit_player(MSGTR_Exit_error); + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + jpeg_stdio_dest(&cinfo, outfile); + + cinfo.image_width = image_width; + cinfo.image_height = image_height; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo,jpeg_quality, jpeg_baseline); + cinfo.optimize_coding = jpeg_optimize; + cinfo.smoothing_factor = jpeg_smooth; + + if ( jpeg_progressive_mode ) { + jpeg_simple_progression(&cinfo); } - if ( !(stat_p.st_mode & S_IWUSR) ) { - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirExistsButNotWritable); - exit_player(MSGTR_Exit_error); + + jpeg_start_compress(&cinfo, TRUE); + + row_stride = image_width * 3; + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = &buffer[cinfo.next_scanline * row_stride]; + (void)jpeg_write_scanlines(&cinfo, row_pointer,1); } - mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirExistsAndIsWritable); - break; - - default: - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) ); - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_CantCreateDirectory); - exit_player(MSGTR_Exit_error); - } /* end switch */ - } else { - mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirectoryCreateSuccess); - } /* end if */ - - image_height=height; - image_width=width; + jpeg_finish_compress(&cinfo); + fclose(outfile); + jpeg_destroy_compress(&cinfo); - return 0; + return 0; } -static uint32_t jpeg_write( uint8_t * name,uint8_t * buffer ) -{ - FILE * o; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - JSAMPROW row_pointer[1]; - int row_stride; - - if ( !buffer ) return 1; - if ( (o=fopen( name,"wb" )) == NULL ) return 1; - - cinfo.err=jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - jpeg_stdio_dest( &cinfo,o ); - - cinfo.image_width=image_width; - cinfo.image_height=image_height; - cinfo.input_components=3; - cinfo.in_color_space=JCS_RGB; - - jpeg_set_defaults( &cinfo ); - jpeg_set_quality( &cinfo,jpeg_quality,jpeg_baseline ); - cinfo.optimize_coding=jpeg_optimize; - cinfo.smoothing_factor=jpeg_smooth; - - if ( jpeg_progressive_mode ) jpeg_simple_progression( &cinfo ); - jpeg_start_compress( &cinfo,TRUE ); - - row_stride = image_width * 3; - while ( cinfo.next_scanline < cinfo.image_height ) - { - row_pointer[0]=&buffer[ cinfo.next_scanline * row_stride ]; - (void)jpeg_write_scanlines( &cinfo,row_pointer,1 ); - } - - jpeg_finish_compress( &cinfo ); - fclose( o ); - jpeg_destroy_compress( &cinfo ); - - return 0; -} +/* ------------------------------------------------------------------------- */ -static uint32_t draw_frame(uint8_t * src[]) +static uint32_t draw_frame(uint8_t *src[]) { - static uint32_t framecounter=0, subdircounter=0; - char buf[BUFLENGTH]; - uint8_t *dst= src[0]; - static char subdirname[BUFLENGTH] = ""; - struct stat stat_p; - -/* Start writing to new subdirectory after a certain amount of frames */ - if ( framecounter == jpeg_maxfiles ) { - framecounter = 0; - } - -/* If framecounter is zero (or reset to zero), increment subdirectory number - * and create the subdirectory. - * If jpeg_subdirs is not set, do nothing and resort to old behaviour. */ - if ( !framecounter && jpeg_subdirs ) { - snprintf (subdirname, BUFLENGTH, "%s%08d", jpeg_subdirs, ++subdircounter); - snprintf (buf, BUFLENGTH, "%s/%s", jpeg_outdir, subdirname); - if (mkdir (buf, 0755)<0) { - switch (errno) { /* use switch in case other errors need to be caught and handled in the future */ - case EEXIST: - if ( stat(buf, &stat_p) < 0 ) { - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) ); - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, MSGTR_VO_JPEG_UnableToAccess, buf); - exit_player(MSGTR_Exit_error); - } - if ( !S_ISDIR(stat_p.st_mode) ) { - mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s %s\n", info.short_name, buf, MSGTR_VO_JPEG_ExistsButNoDirectory); - exit_player(MSGTR_Exit_error); - } - if ( !(stat_p.st_mode & S_IWUSR) ) { - mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s\n", info.short_name, buf, MSGTR_VO_JPEG_DirExistsButNotWritable); - exit_player(MSGTR_Exit_error); - } - - mp_msg(MSGT_VO, MSGL_INFO, "\n%s: %s - %s\n", info.short_name, buf, MSGTR_VO_JPEG_DirExistsAndIsWritable); - break; - - default: - mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) ); - mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s.\n", info.short_name, buf, MSGTR_VO_JPEG_CantCreateDirectory); - exit_player(MSGTR_Exit_error); - break; - } - } /* switch */ - } /* if !framecounter && jpeg_subdirs */ - - - framenum++; - -/* snprintf the full pathname of the outputfile */ - snprintf (buf, BUFLENGTH, "%s/%s/%08d.jpg", jpeg_outdir, subdirname, framenum); - - framecounter++; - - return jpeg_write( buf,src[0] ); + static uint32_t framecounter = 0, subdircounter = 0; + char buf[BUFLENGTH]; + uint8_t *dst = src[0]; + static char subdirname[BUFLENGTH] = ""; + struct stat stat_p; + + /* Start writing to new subdirectory after a certain amount of frames */ + if ( framecounter == jpeg_maxfiles ) { + framecounter = 0; + } + + /* If framecounter is zero (or reset to zero), increment subdirectory + * number and create the subdirectory. + * If jpeg_subdirs is not set, do nothing and resort to old behaviour. */ + if ( !framecounter && jpeg_subdirs ) { + snprintf(subdirname, BUFLENGTH, "%s%08d", jpeg_subdirs, + ++subdircounter); + snprintf(buf, BUFLENGTH, "%s/%s", jpeg_outdir, subdirname); + if ( mkdir(buf, 0755) < 0 ) { + switch (errno) { /* use switch in case other errors need to be + caught and handled in the future */ + case EEXIST: + if ( stat(buf, &stat_p) < 0 ) { + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", + info.short_name, MSGTR_VO_JPEG_GenericError, + strerror(errno) ); + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", + info.short_name, MSGTR_VO_JPEG_UnableToAccess, + buf); + exit_player(MSGTR_Exit_error); + } + if ( !S_ISDIR(stat_p.st_mode) ) { + mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s %s\n", + info.short_name, buf, + MSGTR_VO_JPEG_ExistsButNoDirectory); + exit_player(MSGTR_Exit_error); + } + if ( !(stat_p.st_mode & S_IWUSR) ) { + mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s\n", + info.short_name, buf, + MSGTR_VO_JPEG_DirExistsButNotWritable); + exit_player(MSGTR_Exit_error); + } + + mp_msg(MSGT_VO, MSGL_INFO, "\n%s: %s - %s\n", + info.short_name, buf, + MSGTR_VO_JPEG_DirExistsAndIsWritable); + break; + + default: + mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, + MSGTR_VO_JPEG_GenericError, strerror(errno) ); + mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s.\n", + info.short_name, buf, + MSGTR_VO_JPEG_CantCreateDirectory); + exit_player(MSGTR_Exit_error); + break; + } + } /* switch */ + } /* if !framecounter && jpeg_subdirs */ + + framenum++; + + /* snprintf the full pathname of the outputfile */ + snprintf(buf, BUFLENGTH, "%s/%s/%08d.jpg", jpeg_outdir, subdirname, + framenum); + + framecounter++; + + return jpeg_write(buf, src[0]); } +/* ------------------------------------------------------------------------- */ + static void draw_osd(void) { } +/* ------------------------------------------------------------------------- */ + static void flip_page (void) { } -static uint32_t draw_slice( uint8_t *src[],int stride[],int w,int h,int x,int y ) +/* ------------------------------------------------------------------------- */ + +static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, + int x, int y) { - return 0; + return 0; } +/* ------------------------------------------------------------------------- */ + static uint32_t query_format(uint32_t format) { - if (format == IMGFMT_RGB24) - return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW; - + if (format == IMGFMT_RGB24) { + return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW; + } + return 0; } +/* ------------------------------------------------------------------------- */ + static void uninit(void) { } +/* ------------------------------------------------------------------------- */ + static void check_events(void) { } +/* ------------------------------------------------------------------------- */ + static uint32_t preinit(const char *arg) { - return 0; + return 0; } +/* ------------------------------------------------------------------------- */ + static uint32_t control(uint32_t request, void *data, ...) { - switch (request) - { - case VOCTRL_QUERY_FORMAT: - return query_format(*((uint32_t*)data)); - } - return VO_NOTIMPL; + switch (request) { + case VOCTRL_QUERY_FORMAT: + return query_format(*((uint32_t*)data)); + } + return VO_NOTIMPL; } +/* ------------------------------------------------------------------------- */ + #undef BUFLENGTH +/* ------------------------------------------------------------------------- */ + -- cgit v1.2.3