| 375 | } |
| 376 | |
| 377 | static void log_callback(void *ptr, int level, const char *fmt, va_list vl) |
| 378 | { |
| 379 | AVClass* avc = ptr ? *(AVClass **) ptr : NULL; |
| 380 | va_list vl2; |
| 381 | char line[1024]; |
| 382 | static int print_prefix = 1; |
| 383 | void *new_log_buffer; |
| 384 | |
| 385 | va_copy(vl2, vl); |
| 386 | av_log_default_callback(ptr, level, fmt, vl); |
| 387 | av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix); |
| 388 | va_end(vl2); |
| 389 | |
| 390 | #if HAVE_THREADS |
| 391 | ff_mutex_lock(&log_mutex); |
| 392 | |
| 393 | new_log_buffer = av_realloc_array(log_buffer, log_buffer_size + 1, sizeof(*log_buffer)); |
| 394 | if (new_log_buffer) { |
| 395 | char *msg; |
| 396 | int i; |
| 397 | |
| 398 | log_buffer = new_log_buffer; |
| 399 | memset(&log_buffer[log_buffer_size], 0, sizeof(log_buffer[log_buffer_size])); |
| 400 | log_buffer[log_buffer_size].context_name= avc ? av_strdup(avc->item_name(ptr)) : NULL; |
| 401 | if (avc) { |
| 402 | if (avc->get_category) log_buffer[log_buffer_size].category = avc->get_category(ptr); |
| 403 | else log_buffer[log_buffer_size].category = avc->category; |
| 404 | } |
| 405 | log_buffer[log_buffer_size].log_level = level; |
| 406 | msg = log_buffer[log_buffer_size].log_message = av_strdup(line); |
| 407 | for (i=strlen(msg) - 1; i>=0 && msg[i] == '\n'; i--) { |
| 408 | msg[i] = 0; |
| 409 | } |
| 410 | if (avc && avc->parent_log_context_offset) { |
| 411 | AVClass** parent = *(AVClass ***) (((uint8_t *) ptr) + |
| 412 | avc->parent_log_context_offset); |
| 413 | if (parent && *parent) { |
| 414 | log_buffer[log_buffer_size].parent_name = av_strdup((*parent)->item_name(parent)); |
| 415 | log_buffer[log_buffer_size].parent_category = |
| 416 | (*parent)->get_category ? (*parent)->get_category(parent) :(*parent)->category; |
| 417 | } |
| 418 | } |
| 419 | log_buffer_size ++; |
| 420 | } |
| 421 | |
| 422 | ff_mutex_unlock(&log_mutex); |
| 423 | #endif |
| 424 | } |
| 425 | |
| 426 | |
| 427 | #define print_fmt(k, f, ...) do { \ |
nothing calls this directly
no test coverage detected