root/include/gpac/tools.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jean Le Feuvre
 *                      Copyright (c) Telecom ParisTech 2000-2012
 *                                      All rights reserved
 *
 *  This file is part of GPAC / common tools sub-project
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef _GF_TOOLS_H_
#define _GF_TOOLS_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <gpac/setup.h>
#include <gpac/version.h>


/*! \file "gpac/tools.h"
 *      \brief Core definitions and tools of GPAC.
 *
 * This file contains basic functions and core definitions of the GPAC framework. This file is
 * usually included by all GPAC header files since it contains the error definitions.
*/

/*! \defgroup utils_grp Core Tools
 *      \brief Core definitions and tools of GPAC.
 *
 * You will find in this module the documentation of the core tools used in GPAC.
*/

/*!
 *      \ingroup utils_grp
 *      \brief Base definitions and functions of GPAC.
 *
 *      This section documents some very basic functions and core definitions of the GPAC framework.
 *      @{
 */

/*!
 *      \brief Stringizer
 *      \hideinitializer
 *
 *      Macro transforming its input name into a string
*/
#define gf_stringizer(x) #x

/*!
 *      \brief Memory allocation for a structure
 *      \hideinitializer
 *
 *      Macro allocating memory and zero-ing it
*/
#define GF_SAFEALLOC(__ptr, __struct) { __ptr = (__struct *) gf_malloc(sizeof(__struct)); if (__ptr) memset((void *) __ptr, 0, sizeof(__struct)); }

/*!
 *      \brief Memory allocation for an array of n structs
 *      \hideinitializer
 *
 *      Macro allocating memory for n structures and zero-ing it
*/
#define GF_SAFE_ALLOC_N(__ptr, __n, __struct) { __ptr = (__struct *) gf_malloc( __n * sizeof(__struct)); if (__ptr) memset((void *) __ptr, 0, __n * sizeof(__struct)); }

/*!
 *      \brief 4CC Formatting
 *      \hideinitializer
 *
 *      Macro formating a 4-character code (or 4CC) "abcd" as 0xAABBCCDD
*/
#ifndef GF_4CC
#define GF_4CC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
#endif

/*!
 *      \brief GPAC feature list
 *
 *      returns the list of features enabled/disabled in this GPAC build.
*/
const char *gpac_features();

/*!
 *      \brief 4CC Printing
 *
 *      returns a 4CC printable form
*/
const char *gf_4cc_to_str(u32 type);

/*!
 *      \brief asprintf() portable implementation
 *
 *      similar to sprintf, except it allows the string on the
 *  \note asprintf implementation for windows
*/
int gf_asprintf(char **buffer, const char *fmt, ...);


size_t gf_fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

/*!
 *      \brief file writing helper
 *
 *      Wrapper to properly handle calls to fwrite()
 *      Ensures proper error handling is invoked when it fails.
 *      \return Same as gf_fwrite
 *
*/
size_t gf_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

/*!
 *      \brief large file opening
 *
 *      Opens a large file (>4GB)
 *      \param file_name Same semantics as fopen
 *      \param mode Same semantics as fopen
 *      \return stream handle of the file object
 *      \note You only need to call this function if you're suspecting the file to be a large one (usually only media files), otherwise use regular stdio.
*/
FILE *gf_fopen(const char *file_name, const char *mode);

/*!
 *      \brief file closing
 *
 *      Closes a file
 *      \param file file to close
 *      \note You only need to call this function if you're suspecting the file to be a large one (usually only media files), otherwise use regular stdio.
*/
s32 gf_fclose(FILE *file);

/*!
 *      \brief large file position query
 *
 *      Queries the current read/write position in a large file
 *      \param f Same semantics as ftell
 *      \return position in the file
 *      \note You only need to call this function if you're suspecting the file to be a large one (usually only media files), otherwise use regular stdio.
*/
u64 gf_ftell(FILE *f);
/*!
 *      \brief large file seeking
 *
 *      Seeks the current read/write position in a large file
 *      \param f Same semantics as fseek
 *      \param pos Same semantics as fseek
 *      \param whence Same semantics as fseek
 *      \return new position in the file
 *      \note You only need to call this function if you're suspecting the file to be a large one (usually only media files), otherwise use regular stdio.
*/
u64 gf_fseek(FILE *f, s64 pos, s32 whence);

/*!
 *      \brief get basename from filename/path
 *
 *      Returns a pointer to the start of a filepath basename or null
 *      \param filename Path of the file, can be an absolute path
*/
char* gf_file_basename(const char* filename);

/*!
 *      \brief get extension from filename
 *
 *      Returns a pointer to the start of a filepath extension or null
 *      \param filename Path of the file, can be an absolute path
*/
char* gf_file_ext_start(const char* filename);


/*! @} */


/*! \addtogroup errors_grp Error codes
 *      \ingroup utils_grp
 *      \brief Errors used in GPAC.
 *
 *      This section documents all error codes used in the GPAC framework. Most of the GPAC's functions will use these as
 * return values, and some of these errors are also used for state communication with the different modules of the framework.
 *      @{
 */

/*!
 * GPAC Error
 *      \hideinitializer
 *
 *      positive values are warning and info, 0 means no error and negative values are errors
 */
typedef enum
{
        /*!Message from any scripting engine used in the presentation (ECMAScript, MPEG-J, ...) (Info).*/
        GF_SCRIPT_INFO                                          = 3,
        /*!Indicates an data frame has several AU packed (not MPEG-4 compliant). This is used by decoders to force
        multiple decoding of the same data frame (Info).*/
        GF_PACKED_FRAMES                                        = 2,
        /*!Indicates the end of a stream or of a file (Info).*/
        GF_EOS                                                          = 1,
        /*!
        \n\n
        */
        /*!Operation success (no error).*/
        GF_OK                                                           = 0,
        /*!\n*/
        /*!One of the input parameter is not correct or cannot be used in the current operating mode of the framework.*/
        GF_BAD_PARAM                                                    = -1,
        /*! Memory allocation failure.*/
        GF_OUT_OF_MEM                                                   = -2,
        /*! Input/Output failure (disk access, system call failures)*/
        GF_IO_ERR                                                               = -3,
        /*! The desired feature or operation is not supported by the framework*/
        GF_NOT_SUPPORTED                                                = -4,
        /*! Input data has been corrupted*/
        GF_CORRUPTED_DATA                                               = -5,
        /*! A modification was attempted on a scene node which could not be found*/
        GF_SG_UNKNOWN_NODE                                              = -6,
        /*! The PROTO node interface does not match the nodes using it*/
        GF_SG_INVALID_PROTO                                             = -7,
        /*! An error occured in the scripting engine*/
        GF_SCRIPT_ERROR                                                 = -8,
        /*! Buffer is too small to contain decoded data. Decoders shall use this error whenever they need to resize their output memory buffers*/
        GF_BUFFER_TOO_SMALL                                             = -9,
        /*! Bitstream is not compliant to the specfication it refers to*/
        GF_NON_COMPLIANT_BITSTREAM                              = -10,
        /*! No decoders could be found to handle the desired media type*/
        GF_CODEC_NOT_FOUND                                              = -11,
        /*! The URL is not properly formatted or cannot be found*/
        GF_URL_ERROR                                                    = -12,
        /*! An service error has occured at the local side*/
        GF_SERVICE_ERROR                                                = -13,
        /*! A service error has occured at the remote (server) side*/
        GF_REMOTE_SERVICE_ERROR                                 = -14,
        /*! The desired stream could not be found in the service*/
        GF_STREAM_NOT_FOUND                                             = -15,
        /*! The IsoMedia file is not a valid one*/
        GF_ISOM_INVALID_FILE                                    = -20,
        /*! The IsoMedia file is not complete. Either the file is being downloaded, or it has been truncated*/
        GF_ISOM_INCOMPLETE_FILE                                 = -21,
        /*! The media in this IsoMedia track is not valid (usually due to a broken stream description)*/
        GF_ISOM_INVALID_MEDIA                                   = -22,
        /*! The requested operation cannot happen in the current opening mode of the IsoMedia file*/
        GF_ISOM_INVALID_MODE                                    = -23,
        /*! This IsoMedia track refers to media outside the file in an unknown way*/
        GF_ISOM_UNKNOWN_DATA_REF                                = -24,

        /*! An invalid MPEG-4 Object Descriptor was found*/
        GF_ODF_INVALID_DESCRIPTOR                               = -30,
        /*! An MPEG-4 Object Descriptor was found or added to a forbidden descriptor*/
        GF_ODF_FORBIDDEN_DESCRIPTOR                             = -31,
        /*! An invalid MPEG-4 BIFS command was detected*/
        GF_ODF_INVALID_COMMAND                                  = -32,
        /*! The scene has been encoded using an unknown BIFS version*/
        GF_BIFS_UNKNOWN_VERSION                                 = -33,

        /*! The remote IP address could not be solved*/
        GF_IP_ADDRESS_NOT_FOUND                                 = -40,
        /*! The connection to the remote peer has failed*/
        GF_IP_CONNECTION_FAILURE                                = -41,
        /*! The network operation has failed*/
        GF_IP_NETWORK_FAILURE                                   = -42,
        /*! The network connection has been closed*/
        GF_IP_CONNECTION_CLOSED                                 = -43,
        /*! The network operation has failed because no data is available*/
        GF_IP_NETWORK_EMPTY                                             = -44,
        /*! The network operation has been discarded because it would be a blocking one*/
        GF_IP_SOCK_WOULD_BLOCK                                  = -45,
        /*! UDP connection did not receive any data at all. Signaled by client services to reconfigure network if possible*/
        GF_IP_UDP_TIMEOUT                                               = -46,

        /*! Authentication with the remote host has failed*/
        GF_AUTHENTICATION_FAILURE                               = -50,
        /*! Script not ready for playback */
        GF_SCRIPT_NOT_READY                                             = -51,
        /*! Bad configuration for the current contex */
        GF_INVALID_CONFIGURATION                                = -52,
        /*! The element has not been found */
        GF_NOT_FOUND                                                    = -53,
        /*! Unexpected format of data */
        GF_PROFILE_NOT_SUPPORTED                                = -54,
        /*! the decoder buffers were filled, it is necessary to recuperate decoded data*/
        GF_CODEC_BUFFER_UNAVAILABLE                             = -55,
} GF_Err;

/*!
 *      \brief Error Printing
 *
 *      Returns a printable version of a given error
 *      \param e Error code requested
 *      \return String representing the error
*/
const char *gf_error_to_string(GF_Err e);

/*! @} */

/*! \addtogroup log_grp Logging tools
 *      \ingroup utils_grp
 *      \brief Logging system of GPAC
 *      @{
 */

/*!
 * GPAC Log Levels
 *      \hideinitializer
 *
 * These levels describes messages priority used when filtering logs
 */
typedef enum
{
        /*! Disable all Log message*/
        GF_LOG_QUIET = 0,
        /*! Log message describes an error*/
        GF_LOG_ERROR,
        /*! Log message describes a warning*/
        GF_LOG_WARNING,
        /*! Log message is informational (state, etc..)*/
        GF_LOG_INFO,
        /*! Log message is a debug info*/
        GF_LOG_DEBUG
} GF_LOG_Level;

/*!
 *      \brief Log exits at first error assignment
 *
 * When GF_LOG_ERROR happens, program leaves with instruction exit(1);
 *      \param strict strict behaviour when encoutering a serious error.
 *
 */
void gf_log_set_strict_error(Bool strict);

/*!
 *      \brief gets string-formated log tools
 *
 * Returns the string-formatted log tools and levels. Returned string shall be freed by the caller.
 *      \return string-formatted log tools.
 *
 */
char *gf_log_get_tools_levels();

/*!
 * GPAC Log tools
 *      \hideinitializer
 *
 * These flags describes which sub-part of GPAC generates the log and are used when filtering logs
 */
typedef enum
{
        /*! Log message from the core library (init, threads, network calls, etc)*/
        GF_LOG_CORE = 0,
        /*! Log message from a raw media parser (BIFS, LASeR, A/V formats)*/
        GF_LOG_CODING,
        /*! Log message from a bitstream parser (IsoMedia, MPEG-2 TS, OGG, ...)*/
        GF_LOG_CONTAINER,
        /*! Log message from the network/service stack (messages & co)*/
        GF_LOG_NETWORK,
        /*! Log message from the RTP/RTCP stack (TS info) and packet structure & hinting (debug)*/
        GF_LOG_RTP,
        /*! Log message from authoring subsystem (file manip, import/export)*/
        GF_LOG_AUTHOR,
        /*! Log message from the sync layer of the terminal*/
        GF_LOG_SYNC,
        /*! Log message from a codec*/
        GF_LOG_CODEC,
        /*! Log message from any XML parser (context loading, etc)*/
        GF_LOG_PARSER,
        /*! Log message from the terminal/compositor, indicating media object state*/
        GF_LOG_MEDIA,
        /*! Log message from the scene graph/scene manager (handling of nodes and attribute modif, DOM core)*/
        GF_LOG_SCENE,
        /*! Log message from the scripting engine APIs - does not cover alert() in the script code itself*/
        GF_LOG_SCRIPT,
        /*! Log message from event handling*/
        GF_LOG_INTERACT,
        /*! Log message from compositor*/
        GF_LOG_COMPOSE,
        /*! Log for video object cache */
        GF_LOG_CACHE,
        /*! Log message from multimedia I/O devices (audio/video input/output, ...)*/
        GF_LOG_MMIO,
        /*! Log for runtime info (times, memory, CPU usage)*/
        GF_LOG_RTI,
        /*! Log for SMIL timing and animation*/
        GF_LOG_SMIL,
        /*! Log for memory tracker*/
        GF_LOG_MEMORY,
        /*! Log for audio compositor*/
        GF_LOG_AUDIO,
        /*! Generic Log for modules*/
        GF_LOG_MODULE,
        /*! Log for threads and mutexes */
        GF_LOG_MUTEX,
        /*! Log for threads and condition */
        GF_LOG_CONDITION,
        /*! Log for all HTTP streaming */
        GF_LOG_DASH,
        /*! Log for all messages coming from GF_Terminal or script alert()*/
        GF_LOG_CONSOLE,
        /*! Log for all messages coming the application, not used by libgpac or the modules*/
        GF_LOG_APP,
        /*! Log for all messages coming from the scheduler */
        GF_LOG_SCHEDULER,

        /*! special value used to set a level for all tools*/
        GF_LOG_ALL,
        GF_LOG_TOOL_MAX = GF_LOG_ALL,
} GF_LOG_Tool;

/*!
 *      \brief Log modules assignment
 *
 * Sets the tools to be checked for log filtering. By default no logging is performed.
 *      \param tool tool to be logged.
 *      \param level level of logging for this tool.
 *
 */
void gf_log_set_tool_level(GF_LOG_Tool tool, GF_LOG_Level level);

/*!
 *      \brief Log Message Callback
 *
 * The gf_log_cbk type is the type for the callback of the \ref gf_log_set_callback function. By default all logs are redirected to stderr
 *      \param cbck Opaque user data.
 *      \param log_level level of the log. This value is not guaranteed in multi-threaded context.
 *      \param log_tool tool emitting the log. This value is not guaranteed in multi-threaded context.
 *      \param fmt message log format.
 *      \param vlist message log param.
 *
 */
typedef void (*gf_log_cbk)(void *cbck, GF_LOG_Level log_level, GF_LOG_Tool log_tool, const char* fmt, va_list vlist);

/*!
 *      \brief Log overwrite
 *
 *      Assigns a user-defined callback for printing log messages. By default all logs are redirected to stderr
 *      \param usr_cbk Opaque user data
 *      \param cbk     Callback log function
 *      \return previous callback function
*/
gf_log_cbk gf_log_set_callback(void *usr_cbk, gf_log_cbk cbk);


/*!
 \cond DUMMY_DOXY_SECTION
*/
#ifndef GPAC_DISABLE_LOG
/*note:
                to turn log on, change to GPAC_ENABLE_LOG
                to turn log off, change to GPAC_DISABLE_LOG
        this is needed by configure+sed to modify this file directly
*/
#define GPAC_ENABLE_LOG
#endif

/*!
 \endcond
*/


/*this is all a bit ugly, but most compilers don't properly handle variadic macros...*/
void gf_log(const char *fmt, ...);
void gf_log_lt(GF_LOG_Level ll, GF_LOG_Tool lt);
void gf_log_va_list(GF_LOG_Level level, GF_LOG_Tool tool, const char *fmt, va_list vl);


/*!
 *      \brief Log level checking
 *
 *      Checks if a given tool is logged for the given level
 *      \param log_tool tool to check
 *      \param log_level level to check
 *      \return 1 if logged, 0 otherwise
*/
Bool gf_log_tool_level_on(GF_LOG_Tool log_tool, GF_LOG_Level log_level);

/*!
 *      \brief Set log tools and levels
 *
 *      Set log tools and levels according to the log_tools_levels string. All previous log settings are discarded.
 *      \param log_tools_levels string specifying the tools and levels. It is formatted as logToolX\@logLevelX:logToolZ\@logLevelZ:...
 *      \return GF_OK or GF_BAD_PARAM
*/
GF_Err gf_log_set_tools_levels(const char *log_tools_levels);

/*!
 *      \brief Modify log tools and levels
 *
 *      Modify log tools and levels according to the log_tools_levels string. Previous log settings are kept.
 *      \param val string specifying the tools and levels. It is formatted as logToolX\@logLevelX:logToolZ\@logLevelZ:...
 *      \return GF_OK or GF_BAD_PARAM
*/
GF_Err gf_log_modify_tools_levels(const char *val);

/*!
 *      \brief Set log level for a given tool
 *
 *      Set log level for a given tool.
 *      \param tool tool to log
 *      \param level log level for this tool
*/
void gf_log_set_tool_level(GF_LOG_Tool tool, GF_LOG_Level level);

#ifdef GPAC_DISABLE_LOG
#define GF_LOG(_ll, _lm, __args)
#else
/*!
 *      \brief Message logging
 *      \hideinitializer
 *
 *      Macro for logging messages. Usage is GF_LOG(log_lev, log_module, (fmt, ...)). The log function is only called if log filtering allows it. This avoids fetching logged parameters when the tool is not being logged.
*/
#define GF_LOG(_log_level, _log_tools, __args) if (gf_log_tool_level_on(_log_tools, _log_level) ) { gf_log_lt(_log_level, _log_tools); gf_log __args ;}
#endif


/*!
 *      \brief PseudoRandom Integer Generation Initialization
 *
 *      Sets the starting point for generating a series of pseudorandom integers.
 *      \param Reset Re-initializes the random number generator
*/
void gf_rand_init(Bool Reset);
/*!
 *      \brief PseudoRandom Integer Generation
 *
 *      Returns a pseudorandom integer.
*/
u32 gf_rand();

/*!
 *      \brief user name
 *
 *      Gets current user (login) name.
*/
void gf_get_user_name(char *buf, u32 buf_size);


/*!\brief FileEnum info object
 *
 *The FileEnumInfo object is used to get file attributes upon enumeration of a directory.
*/
typedef struct
{
        /*!File is marked as hidden*/
        Bool hidden;
        /*!File is a directory*/
        Bool directory;
        /*!File is a drive mountpoint*/
        Bool drive;
        /*!File is a system file*/
        Bool system;
        /*!File size in bytes*/
        u64 size;
        /*!File last modif time in UTC seconds*/
        u64 last_modified;
} GF_FileEnumInfo;

/*!
 *      \brief Directory Enumeration Callback
 *
 * The gf_enum_dir_item type is the type for the callback of the \ref gf_enum_directory function
 *      \param cbck Opaque user data.
 *      \param item_name File or directory name.
 *      \param item_path File or directory full path and name from filesystem root.
 *      \param file_info information for the file or directory.
 *      \return 1 to abort enumeration, 0 to continue enumeration.
 *
 */
typedef Bool (*gf_enum_dir_item)(void *cbck, char *item_name, char *item_path, GF_FileEnumInfo *file_info);
/*!
 *      \brief Directory enumeration
 *
 *      Enumerates a directory content. Feedback is provided by the enum_dir_item function
 *      \param dir Directory to enumerate
 *      \param enum_directory If set, only directories will be enumerated, otherwise only files are.
 *      \param enum_dir \ref gf_enum_dir_item callback function for enumeration.
 *      \param cbck Opaque user data passed to callback function.
 *      \param filter optional filter for file extensions. If a file extension without the dot '.' character is not found in the
 *      filter the file will be skipped.
*/
GF_Err gf_enum_directory(const char *dir, Bool enum_directory, gf_enum_dir_item enum_dir, void *cbck, const char *filter);


/*!
 *      \brief File Deletion
 *
 *      Deletes a file from the disk.
 *      \param fileName absolute name of the file or name relative to the current working directory.
*/
GF_Err gf_delete_file(const char *fileName);

/*!
 *      \brief File Move
 *
 *      Moves or renames a file or directory.
 *      \param fileName absolute path of the file / directory to move or rename
 *      \param newFileName absolute new path/name of the file / directory
*/
GF_Err gf_move_file(const char *fileName, const char *newFileName);

/*!
 *      \brief Temporary File Creation
 *
 *      Creates a new temporary file in binary mode
 *      \param fileName if not NULL, strdup() of the temporary filename when created by GPAC (NULL otherwise as the system automatically removes its own tmp files)
 *      \return stream handle to the new file ressoucre
 */
FILE *gf_temp_file_new(char ** const fileName);


/*!
 *      \brief File Modification Time
 *
 *      Returns the modification time of the given file. The exact meaning of this value is system dependent
 *      \param filename file to check
 *      \return modification time of the file
 */
u64 gf_file_modification_time(const char *filename);

/*!
 *      \brief File existence check
 *
 *      Moves or renames a file or directory.
 *      \param fileName absolute path of the file / directory to move or rename
 *      \return GF_TRUE if file exists
 */
Bool gf_file_exists(const char *fileName);

/*!
 *      \brief Progress formatting
 *
 *      Signals progress in GPAC's operations. Note that progress signaling with this function is not thread-safe, the main purpose is to use it for authoring tools only.
 *      \param title title string of the progress, or NULL for no progress
 *      \param done Current amount performed of the action.
 *      \param total Total amount of the action.
 */
void gf_set_progress(const char *title, u64 done, u64 total);

/*!
 *      \brief Progress Callback
 *
 * The gf_on_progress_cbk type is the type for the callback of the \ref gf_set_progress_callback function
 *      \param cbck Opaque user data.
 *      \param title preogress title.
 *      \param done Current amount performed of the action
 *      \param total Total amount of the action.
 *
 */
typedef void (*gf_on_progress_cbk)(const void *cbck, const char *title, u64 done, u64 total);

/*!
 *      \brief Progress overwriting
 *
 *      Iverwrites the progress signaling function by a user-defined one.
 *      \param user_cbk Opaque user data
 *      \param prog_cbk new callback function to use. Passing NULL restore default GPAC stderr notification.
 */
void gf_set_progress_callback(void *user_cbk, gf_on_progress_cbk prog_cbk);


/*!
 *      \brief Prompt checking
 *
 *      Checks if a character is pending in the prompt buffer.
 *      \return 1 if a character is ready to be fetched, 0 otherwise.
 *      \note Function not available under WindowsCE nor SymbianOS
*/
Bool gf_prompt_has_input();

/*!
 *      \brief Prompt character flush
 *
 *      Returns the current character entered at prompt if any.
 *      \return value of the character.
 *      \note Function not available under WindowsCE nor SymbianOS
*/
char gf_prompt_get_char();


/*!
 *      \brief turns prompt echo on/off
 *
 *      Turns the prompt character echo on/off - this is useful when entering passwords.
 *      \param echo_off indicates whether echo should be turned on or off.
 *      \note Function not available under WindowsCE nor SymbianOS
*/
void gf_prompt_set_echo_off(Bool echo_off);

/*!     @} */

/*!
 *\addtogroup cpu_grp System time CPU and Memory tools
 *\ingroup utils_grp
 *\brief System time CPU and Memory functions
 *
 *This section documents time functionalities and CPU management in GPAC.
  *     @{
 */

/*!
 * Selection flags for memory tracker
 *      \hideinitializer
 */
typedef enum
{
    /*! No memory tracking*/
    GF_MemTrackerNone = 0,
    /*! Memory tracking without backtrace*/
    GF_MemTrackerSimple,
    /*! Memory tracking with backtrace*/
    GF_MemTrackerBackTrace,
} GF_MemTrackerType;

/*!
 *      \brief System setup
 *
 *      Inits the system high-resolution clock if any, and CPU usage manager. It is strongly recommended to call this
 * function before calling any other GPAC functions, since on some systems (like winCE) it may result in a better memory usage estimation.
 *      \note This can be called several times but only the first call will result in system setup.
 */
void gf_sys_init(GF_MemTrackerType mem_tracker_type);
/*!
 *      \brief System closing
 *
 *      Closes the system high-resolution clock and any CPU associated ressources.
 *      \note This can be called several times but the system will be closed when no more users are counted.
 */
void gf_sys_close();

/*!
 *      \brief System arguments
 *
 *      Sets the user app arguments (used by GUI mode)
 *      \param argc Number of arguments
 *      \param argv Array of arguments
 */
void gf_sys_set_args(s32 argc, const char **argv);

/*!
 *      \brief Get number of args
 *
 *      Gets the number of argument of the user application if any
 *      \return number of argument of the user application
 */
u32 gf_sys_get_argc();

/*!
 *      \brief Get number of args
 *
 *      Gets the number of argument of the user application if any
 *      \param arg Index of argument to retrieve
 *      \return number of argument of the user application
 */
const char *gf_sys_get_arg(u32 arg);

/*!
 *      \brief System clock query
 *
 *      Gets the system clock time.
 *      \return System clock value since GPAC initialization in milliseconds.
 */
u32 gf_sys_clock();

/*!
 *      \brief High precision system clock query
 *
 *      Gets the hight precision system clock time.
 *      \return System clock value since GPAC initialization in microseconds.
 */
u64 gf_sys_clock_high_res();

/*!
 *      \brief Sleeps thread/process
 *
 *      Locks calling thread/process execution for a given time.
 *      \param ms Amount of time to sleep in milliseconds.
 */
void gf_sleep(u32 ms);

#ifdef WIN32
/*!
 *      \brief WINCE time constant
 *      \hideinitializer
 *
 *      time between jan 1, 1601 and jan 1, 1970 in units of 100 nanoseconds
*/
#define TIMESPEC_TO_FILETIME_OFFSET (((LONGLONG)27111902 << 32) + (LONGLONG)3577643008)

#endif

/*!
 *\brief gets UTC time in milliseconds
 *
 * Gets UTC clock in milliseconds
 * \return UTC time in milliseconds
 */
u64 gf_net_get_utc();

/*!
 *\brief parses date and returns UTC value for this date. Date format is an XSD dateTime format or any of the supported formats from HTTP 1.1:
        Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
        Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
        Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() formatgets UTC time in milliseconds
 *
 * \param date string containing the date to parse
 * \return UTC time in milliseconds
 */
u64 gf_net_parse_date(const char *date);

/*!
 *\brief gets timezone adjustment in seconds
 *
 * Gets timezone adjustment in seconds, with localtime - timezone = UTC time
 * \return timezone shift in seconds
 */
s32 gf_net_get_timezone();

/*!\brief run-time system info object
 *
 *The Run-Time Info object is used to get CPU and memory occupation of the calling process.
 *All time values are expressed in milliseconds (accuracy is not guaranteed).
*/
typedef struct
{
        /*!start of the sampling period*/
        u32 sampling_instant;
        /*!duration of the sampling period*/
        u32 sampling_period_duration;
        /*!total amount of time (User+kernel) spent in CPU for all processes as evaluated at the end of the sampling period*/
        u32 total_cpu_time;
        /*!total amount of time (User+kernel) spent in CPU for the calling process as evaluated at the end of the sampling period*/
        u32 process_cpu_time;
        /*!amount of time (User+kernel) spent in CPU for all processes during the sampling period*/
        u32 total_cpu_time_diff;
        /*!total amount of time (User+kernel) spent in CPU for the calling process during the sampling period*/
        u32 process_cpu_time_diff;
        /*!total amount of idle time during the sampling period.*/
        u32 cpu_idle_time;
        /*!percentage (from 0 to 100) of CPU usage during the sampling period.*/
        u32 total_cpu_usage;
        /*!percentage (from 0 to 100) of the CPU usage by the calling process during the sampling period.*/
        u32 process_cpu_usage;
        /*!calling process ID*/
        u32 pid;
        /*!calling process thread count if known*/
        u32 thread_count;
        /*!size of calling process allocated heaps*/
        u64 process_memory;
        /*!total physical memory in system*/
        u64 physical_memory;
        /*!available physical memory in system*/
        u64 physical_memory_avail;
        /*!total memory currently allocated by gpac*/
        u64 gpac_memory;
        /*!total number of cores on the system*/
        u32 nb_cores;
} GF_SystemRTInfo;

/*!
 * Selection flags for run-time info retrieval
 *      \hideinitializer
 */
enum
{
        /*!Indicates all processes' times must be fetched. If not set, only the current process times will be retrieved, and the
        thread count and total times won't be available*/
        GF_RTI_ALL_PROCESSES_TIMES = 1,
        /*!Indicates the process allocated heap size must be fetch. If not set, only the system physical memory is fetched.
        Fetching the entire ocess  allocated memory can have a large impact on performances*/
        GF_RTI_PROCESS_MEMORY = 1<<1,
        /*!Indicates that only system memory should be fetched. When set, all refreshing info is ignored*/
        GF_RTI_SYSTEM_MEMORY_ONLY = 1<<2
};

/*!
 *      \brief Gets Run-Time info
 *
 *      Gets CPU and memory usage info for the calling process and the system. Information gathering
 * is controled through timeout values.
 *      \param refresh_time_ms refresh time period in milliseconds. If the last sampling was done less than this period ago, the run-time info is not refreshed.
 *      \param rti holder to the run-time info structure to update.
 *      \param flags specify which info is to be retrieved.
 *      \return 1 if info has been updated, 0 otherwise.
 *      \note You should not try to use a too small refresh time. Typical values are 500 ms or one second.
 */
Bool gf_sys_get_rti(u32 refresh_time_ms, GF_SystemRTInfo *rti, u32 flags);


Bool gf_sys_get_battery_state(Bool *onBattery, u32 *onCharge, u32 *level, u32 *batteryLifeTime, u32 *batteryFullLifeTime);

typedef struct _GF_GlobalLock_opaque GF_GlobalLock;

/*!
 * This function allows the user to create a global lock for all GPAC instances.
 * This allow to disable some features for other instances for instance.
 * \param resourceName The name of the resource to lock
 * \return false if resource has been locked, true if resource could not be locked
 */
GF_GlobalLock * gf_global_resource_lock(const char * resourceName);

/*!
 * Unlock a previouly locked resource
 * \param lock The resource to unlock
 * \return GF_OK if evertything went fine
 */
GF_Err gf_global_resource_unlock(GF_GlobalLock * lock);

/*!     @} */

/*!
 *\addtogroup osfile_grp File System
 *\ingroup utils_grp
 *\brief File System tools
 *
 *This section documents time functionalities and CPU management in GPAC.
  *     @{
 */



/*!
 *\brief parses 128 bit from string
 *
 * Parses 128 bit from string
 *
 * \param string the string containing the value in hexa. Non alphanum characters are skipped
 * \param value the value parsed
 * \return error code if any
 */
GF_Err gf_bin128_parse(char *string, bin128 value);

/*!
 *      \brief Delete Directory
 *
 *      Delete a  dir within the full path.
 *      \param DirPathName the file path name.
 */
GF_Err gf_rmdir(char *DirPathName);

/*!
 *      \brief Create Directory
 *
 *      Create a directory within the full path.
 *      \param DirPathName the dir path name.
 */
GF_Err gf_mkdir(char* DirPathName);

/*!
 *      \brief Check Directory Exists
 *
 *      Create a directory within the full path.
 *      \param DirPathName the dir path name.
 */
Bool gf_dir_exists(char *DirPathName);

/*!
 *      \brief Create Directory
 *
 *      Cleanup a directory within the full path, removing all the files and the directories.
 *      \param DirPathName the dir path name.
 */
GF_Err gf_cleanup_dir(char* DirPathName);


/**
 * Gets a newly allocated string containing the default cache directory.
 * It is the responsibility of the caller to free the string.
 * \return a fully qualified path to the default cache directory
 */
char * gf_get_default_cache_directory();

/**
 * Gets the number of open file handles (gf_fopen/gf_fclose only).
 * \return  number of open file handles
 */
u32 gf_file_handles_count();

/*!     @} */

/*!
 *\addtogroup hash_grp RawData Misc
 *\ingroup utils_grp
 *\brief Data integrity and parsing
 *
 *This section documents misc data functions such as integrity and parsing such as SHA-1 hashing CRC checksum, 128 bit ID parsing...
  *     @{
 */


/*!
 *      \brief CRC32 compute
 *
 *      Computes the CRC32 value of a buffer.
 *      \param data buffer
 *      \param size buffer size
 *      \return computed CRC32
 */
u32 gf_crc_32(const char *data, u32 size);


/**
 * Compresses a data buffer in place using zlib. Buffer may be reallocated in the process.
 * \param data pointer to the data buffer to be compressed
 * \param data_len length of the data buffer to be compressed
 * \param out_size pointer for output buffer size
 * \return GF_OK if evertything went fine
 */
GF_Err gf_gz_compress_payload(char **data, u32 data_len, u32 *out_size);

/**
 * Decompresses a data buffer using zlib.
 * \param data data buffer to be decompressed
 * \param data_len length of the data buffer to be decompressed
 * \param uncompressed_data pointer to the uncompressed data buffer. It is the responsibility of the caller to free this buffer.
 * \param out_size size of the uncompressed buffer
 * \return GF_OK if evertything went fine
 */
GF_Err gf_gz_decompress_payload(char *data, u32 data_len, char **uncompressed_data, u32 *out_size);


/*SHA1*/
typedef struct __sha1_context GF_SHA1Context;

#define GF_SHA1_DIGEST_SIZE             20
#define GF_SHA1_DIGEST_SIZE_HEXA                41
/*  Create SHA-1 context */
GF_SHA1Context *gf_sha1_starts();
/*  Adds byte to the SHA-1 context */
void gf_sha1_update(GF_SHA1Context *ctx, u8 *input, u32 length);
/*  Generates SHA-1 of all bytes ingested */
void gf_sha1_finish(GF_SHA1Context *ctx, u8 digest[GF_SHA1_DIGEST_SIZE] );

/*
 * Output SHA-1(file contents), returns 0 if successful.
 */
int gf_sha1_file(const char *filename, u8 digest[GF_SHA1_DIGEST_SIZE]);

/*
 * Gets SHA-1 of input buffer
 */
void gf_sha1_csum(u8 *buf, u32 buflen, u8 digest[GF_SHA1_DIGEST_SIZE]);
/*
 * Gets SHA-1 of input buffer into hexa form
 */
void gf_sha1_csum_hexa(u8 *buf, u32 buflen, u8 digest[GF_SHA1_DIGEST_SIZE_HEXA]);

/*! @} */


/* \cond dummy */
#ifdef GPAC_ANDROID
typedef void (*fm_callback_func)(void *cbk_obj, u32 type, u32 param, int *value);
extern void gf_fm_request_set_callback(void *cbk_obj, fm_callback_func cbk_func);
void gf_fm_request_call(u32 type, u32 param, int *value);
#endif //GPAC_ANDROID

/* \endcond */


#ifdef __cplusplus
}
#endif


#endif          /*_GF_CORE_H_*/


/* [<][>][^][v][top][bottom][index][help] */