log.h 10.2 KB
Newer Older
1 2 3
/*
 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12 13 14 15 16
 * 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
17
 * License along with FFmpeg; if not, write to the Free Software
18 19 20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

21 22
#ifndef AVUTIL_LOG_H
#define AVUTIL_LOG_H
23 24

#include <stdarg.h>
25
#include "avutil.h"
26
#include "attributes.h"
27

28 29 30 31 32 33 34 35 36 37
typedef enum {
    AV_CLASS_CATEGORY_NA = 0,
    AV_CLASS_CATEGORY_INPUT,
    AV_CLASS_CATEGORY_OUTPUT,
    AV_CLASS_CATEGORY_MUXER,
    AV_CLASS_CATEGORY_DEMUXER,
    AV_CLASS_CATEGORY_ENCODER,
    AV_CLASS_CATEGORY_DECODER,
    AV_CLASS_CATEGORY_FILTER,
    AV_CLASS_CATEGORY_BITSTREAM_FILTER,
Paul B Mahol's avatar
Paul B Mahol committed
38 39
    AV_CLASS_CATEGORY_SWSCALER,
    AV_CLASS_CATEGORY_SWRESAMPLER,
40 41 42 43 44 45
    AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40,
    AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
    AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
    AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
    AV_CLASS_CATEGORY_DEVICE_OUTPUT,
    AV_CLASS_CATEGORY_DEVICE_INPUT,
46
    AV_CLASS_CATEGORY_NB, ///< not part of ABI/API
47 48
}AVClassCategory;

49 50 51 52 53 54 55 56 57 58
#define AV_IS_INPUT_DEVICE(category) \
    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \
     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \
     ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT))

#define AV_IS_OUTPUT_DEVICE(category) \
    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \
     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \
     ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT))

59 60
struct AVOptionRanges;

61
/**
62
 * Describe the class of an AVClass context structure. That is an
63 64
 * arbitrary struct of which the first field is a pointer to an
 * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
65
 */
66
typedef struct AVClass {
67
    /**
Diego Biurrun's avatar
Diego Biurrun committed
68
     * The name of the class; usually it is the same name as the
Diego Biurrun's avatar
Diego Biurrun committed
69
     * context structure type to which the AVClass is associated.
70
     */
71
    const char* class_name;
72 73

    /**
74
     * A pointer to a function which returns the name of a context
75
     * instance ctx associated with the class.
76 77 78 79 80 81 82 83
     */
    const char* (*item_name)(void* ctx);

    /**
     * a pointer to the first option specified in the class if any or NULL
     *
     * @see av_set_default_options()
     */
84
    const struct AVOption *option;
85 86 87

    /**
     * LIBAVUTIL_VERSION with which this structure was created.
Jai Menon's avatar
Jai Menon committed
88
     * This is used to allow fields to be added without requiring major
89 90 91 92
     * version bumps everywhere.
     */

    int version;
93 94 95 96 97 98

    /**
     * Offset in the structure where log_level_offset is stored.
     * 0 means there is no such variable
     */
    int log_level_offset_offset;
99 100

    /**
101 102 103 104 105
     * Offset in the structure where a pointer to the parent context for
     * logging is stored. For example a decoder could pass its AVCodecContext
     * to eval as such a parent context, which an av_log() implementation
     * could then leverage to display the parent context.
     * The offset can be NULL.
106 107
     */
    int parent_log_context_offset;
108 109

    /**
110
     * Return next AVOptions-enabled child or NULL
111
     */
112 113 114
    void* (*child_next)(void *obj, void *prev);

    /**
115
     * Return an AVClass corresponding to the next potential
116 117 118 119 120 121 122
     * AVOptions-enabled child.
     *
     * The difference between child_next and this is that
     * child_next iterates over _already existing_ objects, while
     * child_class_next iterates over _all possible_ children.
     */
    const struct AVClass* (*child_class_next)(const struct AVClass *prev);
123 124 125

    /**
     * Category used for visualization (like color)
126
     * This is only set if the category is equal for all objects using this class.
127 128 129
     * available since version (51 << 16 | 56 << 8 | 100)
     */
    AVClassCategory category;
130 131 132 133 134 135

    /**
     * Callback to return the category.
     * available since version (51 << 16 | 59 << 8 | 100)
     */
    AVClassCategory (*get_category)(void* ctx);
136 137 138 139 140 141

    /**
     * Callback to return the supported/allowed ranges.
     * available since version (52.12)
     */
    int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags);
142
} AVClass;
143

Luca Barbato's avatar
Luca Barbato committed
144 145 146 147 148 149 150 151 152
/**
 * @addtogroup lavu_log
 *
 * @{
 *
 * @defgroup lavu_log_constants Logging Constants
 *
 * @{
 */
153

Luca Barbato's avatar
Luca Barbato committed
154 155 156
/**
 * Print no output.
 */
157 158 159
#define AV_LOG_QUIET    -8

/**
160
 * Something went really wrong and we will crash now.
161 162 163 164
 */
#define AV_LOG_PANIC     0

/**
165 166 167
 * Something went wrong and recovery is not possible.
 * For example, no header was found for a format which depends
 * on headers or an illegal combination of parameters is used.
168 169 170 171
 */
#define AV_LOG_FATAL     8

/**
172 173
 * Something went wrong and cannot losslessly be recovered.
 * However, not all future data is affected.
174 175 176 177
 */
#define AV_LOG_ERROR    16

/**
178 179
 * Something somehow does not look correct. This may or may not
 * lead to problems. An example would be the use of '-vstrict -2'.
180 181 182
 */
#define AV_LOG_WARNING  24

Luca Barbato's avatar
Luca Barbato committed
183 184 185
/**
 * Standard information.
 */
186
#define AV_LOG_INFO     32
Luca Barbato's avatar
Luca Barbato committed
187 188 189 190

/**
 * Detailed information.
 */
191 192 193
#define AV_LOG_VERBOSE  40

/**
194
 * Stuff which is only useful for libav* developers.
195 196
 */
#define AV_LOG_DEBUG    48
197

198 199
#define AV_LOG_MAX_OFFSET (AV_LOG_DEBUG - AV_LOG_QUIET)

200
/**
201
 * @}
202 203
 */

Luca Barbato's avatar
Luca Barbato committed
204
/**
205 206 207 208 209 210
 * Sets additional colors for extended debugging sessions.
 * @code
   av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n");
   @endcode
 * Requires 256color terminal support. Uses outside debugging is not
 * recommended.
Luca Barbato's avatar
Luca Barbato committed
211
 */
212
#define AV_LOG_C(x) (x << 8)
Luca Barbato's avatar
Luca Barbato committed
213

214
/**
215
 * Send the specified message to the log if the level is less than or equal
216
 * to the current av_log_level. By default, all logging messages are sent to
Luca Barbato's avatar
Luca Barbato committed
217
 * stderr. This behavior can be altered by setting a different logging callback
218
 * function.
Luca Barbato's avatar
Luca Barbato committed
219
 * @see av_log_set_callback
220 221
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
Luca Barbato's avatar
Luca Barbato committed
222 223 224
 *        pointer to an AVClass struct.
 * @param level The importance level of the message expressed using a @ref
 *        lavu_log_constants "Logging Constant".
225
 * @param fmt The format string (printf-compatible) that specifies how
Luca Barbato's avatar
Luca Barbato committed
226
 *        subsequent arguments are converted to output.
227
 */
228
void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
229

Luca Barbato's avatar
Luca Barbato committed
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

/**
 * Send the specified message to the log if the level is less than or equal
 * to the current av_log_level. By default, all logging messages are sent to
 * stderr. This behavior can be altered by setting a different logging callback
 * function.
 * @see av_log_set_callback
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
 *        pointer to an AVClass struct.
 * @param level The importance level of the message expressed using a @ref
 *        lavu_log_constants "Logging Constant".
 * @param fmt The format string (printf-compatible) that specifies how
 *        subsequent arguments are converted to output.
 * @param vl The arguments referenced by the format string.
 */
void av_vlog(void *avcl, int level, const char *fmt, va_list vl);

/**
 * Get the current log level
 *
 * @see lavu_log_constants
 *
 * @return Current log level
 */
255
int av_log_get_level(void);
Luca Barbato's avatar
Luca Barbato committed
256 257 258 259 260 261 262 263 264 265 266 267 268

/**
 * Set the log level
 *
 * @see lavu_log_constants
 *
 * @param level Logging level
 */
void av_log_set_level(int level);

/**
 * Set the logging callback
 *
269 270 271
 * @note The callback must be thread safe, even if the application does not use
 *       threads itself as some codecs are multithreaded.
 *
Luca Barbato's avatar
Luca Barbato committed
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
 * @see av_log_default_callback
 *
 * @param callback A logging function with a compatible signature.
 */
void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));

/**
 * Default logging callback
 *
 * It prints the message to stderr, optionally colorizing it.
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
 *        pointer to an AVClass struct.
 * @param level The importance level of the message expressed using a @ref
 *        lavu_log_constants "Logging Constant".
 * @param fmt The format string (printf-compatible) that specifies how
 *        subsequent arguments are converted to output.
289
 * @param vl The arguments referenced by the format string.
Luca Barbato's avatar
Luca Barbato committed
290
 */
291 292
void av_log_default_callback(void *avcl, int level, const char *fmt,
                             va_list vl);
Luca Barbato's avatar
Luca Barbato committed
293 294 295 296 297 298 299 300

/**
 * Return the context name
 *
 * @param  ctx The AVClass context
 *
 * @return The AVClass class_name
 */
301
const char* av_default_item_name(void* ctx);
302
AVClassCategory av_default_get_category(void *ptr);
303

304 305 306 307 308 309 310 311 312 313
/**
 * Format a line of log the same way as the default callback.
 * @param line          buffer to receive the formated line
 * @param line_size     size of the buffer
 * @param print_prefix  used to store whether the prefix must be printed;
 *                      must point to a persistent integer initially set to 1
 */
void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
                        char *line, int line_size, int *print_prefix);

314 315 316 317 318 319 320 321
/**
 * av_dlog macros
 * Useful to print debug messages that shouldn't get compiled in normally.
 */

#ifdef DEBUG
#    define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
#else
322
#    define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0)
323 324
#endif

325 326 327 328 329 330
/**
 * Skip repeated messages, this requires the user app to use av_log() instead of
 * (f)printf as the 2 would otherwise interfere and lead to
 * "Last message repeated x times" messages below (f)printf messages with some
 * bad luck.
 * Also to receive the last, "last repeated" line if any, the user app must
331
 * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end
332 333
 */
#define AV_LOG_SKIP_REPEATED 1
334 335 336 337 338 339 340 341 342

/**
 * Include the log severity in messages originating from codecs.
 *
 * Results in messages such as:
 * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts
 */
#define AV_LOG_PRINT_LEVEL 2

343
void av_log_set_flags(int arg);
344
int av_log_get_flags(void);
345

Luca Barbato's avatar
Luca Barbato committed
346 347 348 349
/**
 * @}
 */

350
#endif /* AVUTIL_LOG_H */