X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess_filter%2Fdump.c;h=50ccf9aa58b96cf5deaf05380f4cc81028f166d2;hb=14a587b041e4881a046cb612402a9a86d7573f91;hp=953badc9ce63dadacc2f7ebd913d157a2457bc34;hpb=2d6efe40bce471b6a84649f2bc8ec04671a521f5;p=vlc diff --git a/modules/access_filter/dump.c b/modules/access_filter/dump.c index 953badc9ce..50ccf9aa58 100644 --- a/modules/access_filter/dump.c +++ b/modules/access_filter/dump.c @@ -21,16 +21,20 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include -#include -#include #include #include +#include + +#include -#include "vlc_access.h" -#include "vlc_block.h" -#include "charset.h" +#include #include "vlc_keys.h" #define DEFAULT_MARGIN 32 // megabytes @@ -47,21 +51,21 @@ static int Open (vlc_object_t *); static void Close (vlc_object_t *); vlc_module_begin (); - set_shortname (_("Dump")); - set_description (_("Dump")); + set_shortname (N_("Dump")); + set_description (N_("Dump")); set_category (CAT_INPUT); set_subcategory (SUBCAT_INPUT_ACCESS_FILTER); set_capability ("access_filter", 0); add_shortcut ("dump"); set_callbacks (Open, Close); - add_bool ("dump-force", VLC_FALSE, NULL, FORCE_TEXT, - FORCE_LONGTEXT, VLC_FALSE); + add_bool ("dump-force", false, NULL, FORCE_TEXT, + FORCE_LONGTEXT, false); add_integer ("dump-margin", DEFAULT_MARGIN, NULL, MARGIN_TEXT, - MARGIN_LONGTEXT, VLC_FALSE); + MARGIN_LONGTEXT, false); vlc_module_end(); -static int Read (access_t *access, uint8_t *buffer, int len); +static ssize_t Read (access_t *access, uint8_t *buffer, size_t len); static block_t *Block (access_t *access); static int Seek (access_t *access, int64_t offset); static int Control (access_t *access, int cmd, va_list ap); @@ -74,6 +78,7 @@ struct access_sys_t { FILE *stream; int64_t tmp_max; + int64_t dumpsize; }; /** @@ -86,8 +91,8 @@ static int Open (vlc_object_t *obj) if (!var_CreateGetBool (access, "dump-force")) { - vlc_bool_t b; - if ((access2_Control (src, ACCESS_CAN_FASTSEEK, &b) == 0) && b) + bool b; + if ((access_Control (src, ACCESS_CAN_FASTSEEK, &b) == 0) && b) { msg_Dbg (obj, "dump filter useless"); return VLC_EGENERIC; @@ -111,13 +116,13 @@ static int Open (vlc_object_t *obj) if ((p_sys->stream = tmpfile ()) == NULL) { - msg_Err (access, "cannot create temporary file: %s", strerror (errno)); + msg_Err (access, "cannot create temporary file: %m"); free (p_sys); return VLC_EGENERIC; } p_sys->tmp_max = ((int64_t)var_CreateGetInteger (access, "dump-margin")) << 20; - var_AddCallback (access->p_libvlc, "key-pressed", KeyHandler, access); + var_AddCallback (access->p_libvlc, "key-action", KeyHandler, access); return VLC_SUCCESS; } @@ -131,7 +136,7 @@ static void Close (vlc_object_t *obj) access_t *access = (access_t *)obj; access_sys_t *p_sys = access->p_sys; - var_DelCallback (access->p_libvlc, "key-pressed", KeyHandler, access); + var_DelCallback (access->p_libvlc, "key-action", KeyHandler, access); if (p_sys->stream != NULL) fclose (p_sys->stream); @@ -144,21 +149,34 @@ static void Dump (access_t *access, const uint8_t *buffer, size_t len) access_sys_t *p_sys = access->p_sys; FILE *stream = p_sys->stream; - if ((stream == NULL) || (len == 0)) + if ((stream == NULL) /* not dumping */ + || (access->info.i_pos < p_sys->dumpsize) /* already known data */) return; + size_t needed = access->info.i_pos - p_sys->dumpsize; + if (len < needed) + return; /* gap between data and dump offset (seek too far ahead?) */ + + buffer += len - needed; + len = needed; + + if (len == 0) + return; /* no useful data */ + if ((p_sys->tmp_max != -1) && (access->info.i_pos > p_sys->tmp_max)) { msg_Dbg (access, "too much data - dump will not work"); goto error; } + assert (len > 0); if (fwrite (buffer, len, 1, stream) != 1) { - msg_Err (access, "cannot write to file: %s", strerror (errno)); + msg_Err (access, "cannot write to file: %m"); goto error; } + p_sys->dumpsize += len; return; error: @@ -167,7 +185,7 @@ error: } -static int Read (access_t *access, uint8_t *buffer, int len) +static ssize_t Read (access_t *access, uint8_t *buffer, size_t len) { access_t *src = access->p_source; @@ -176,7 +194,6 @@ static int Read (access_t *access, uint8_t *buffer, int len) access->info = src->info; Dump (access, buffer, len); - //Trigger (access); return len; } @@ -220,11 +237,7 @@ static int Seek (access_t *access, int64_t offset) } if (p_sys->stream != NULL) - { - msg_Dbg (access, "seeking - dump will not work"); - fclose (p_sys->stream); - p_sys->stream = NULL; - } + msg_Dbg (access, "seeking - dump might not work"); src->info.i_update = access->info.i_update; int ret = src->pf_seek (src, offset); @@ -232,7 +245,6 @@ static int Seek (access_t *access, int64_t offset) return ret; } - static void Trigger (access_t *access) { access_sys_t *p_sys = access->p_sys; @@ -255,7 +267,7 @@ static void Trigger (access_t *access) // and there is an off-by-one in the following sprintf(). return; - const char *home = access->p_libvlc->psz_homedir; + const char *home = config_GetHomeDir(); /* Hmm what about the extension?? */ char filename[strlen (home) + sizeof ("/vlcdump-YYYYYYYYY-MM-DD-HH-MM-SS.ts")]; @@ -264,11 +276,10 @@ static void Trigger (access_t *access) msg_Info (access, "dumping media to \"%s\"...", filename); - FILE *newstream = fopen (filename, "wb"); + FILE *newstream = utf8_fopen (filename, "wb"); if (newstream == NULL) { - msg_Err (access, "cannot create dump file \"%s\": %s", filename, - strerror (errno)); + msg_Err (access, "cannot create dump file \"%s\": %m", filename); return; } @@ -284,8 +295,7 @@ static void Trigger (access_t *access) { if (ferror (oldstream)) { - msg_Err (access, "cannot read temporary file: %s", - strerror (errno)); + msg_Err (access, "cannot read temporary file: %m"); break; } @@ -298,7 +308,7 @@ static void Trigger (access_t *access) if (fwrite (buf, len, 1, newstream) != 1) { - msg_Err (access, "cannot write dump file: %s", strerror (errno)); + msg_Err (access, "cannot write dump file: %m"); break; } } @@ -315,19 +325,11 @@ static int KeyHandler (vlc_object_t *obj, char const *varname, { access_t *access = data; + (void)varname; (void)oldval; (void)obj; - for (struct hotkey *key = access->p_libvlc->p_hotkeys; - key->psz_action != NULL; key++) - { - if (key->i_key == newval.i_int) - { - if (key->i_action == ACTIONID_DUMP) - Trigger ((access_t *)data); - break; - } - } - + if (newval.i_int == ACTIONID_DUMP) + Trigger (access); return VLC_SUCCESS; }