Trace HEVC key frame quantization and reduce AMF log noise

This commit is contained in:
evgeny committed 2026-10-18 19:44:38 +02:00
1 parent 78b147f806
commit f7853f145c
2 files changed
+61 -10

No files matched your search

+29 -9
View File
@@ -15,6 +15,7 @@
#ifdef HAVE_FFMPEG
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavcodec/bsf.h>
#include <libavutil/avutil.h>
#include <libavutil/imgutils.h>
#include <libavutil/opt.h>
@@ -66,24 +67,43 @@ int video_extract_thumbnail(const char* src, const char* jpg_out, int max_w) {
static pthread_once_t g_ffmpeg_once = PTHREAD_ONCE_INIT;
/* AMF передаёт свой внутренний трейс через AV_LOG_DEBUG. Остальные подробные логи FFmpeg отсекаем. */
/* Пропускаем диагностику AMF и существенные поля trace_headers, остальные подробности FFmpeg отсекаем. */
static void video_av_log_cb(void* avcl, int level, const char* fmt, va_list vl) {
const char *encoder = NULL;
int headers = 0;
if (level > AV_LOG_WARNING) {
if (!debug_should_output(DEBUG_LEVEL_TRACE, DEBUG_CATEGORY_DEBUG)) return;
if (!avcl || *(const AVClass **)avcl != avcodec_get_class()) return;
const AVCodecContext *codec = avcl;
if (!codec->codec || !codec->codec->name) return;
const char *name = codec->codec->name;
size_t length = strlen(name);
if (length < 4 || strcmp(name + length - 4, "_amf")) return;
encoder = name;
if (!avcl) return;
if (*(const AVClass **)avcl == av_bsf_get_class()) {
const AVBSFContext *filter = avcl;
if (!filter->filter || strcmp(filter->filter->name, "trace_headers")) return;
headers = 1;
} else {
if (*(const AVClass **)avcl != avcodec_get_class()) return;
const AVCodecContext *codec = avcl;
if (!codec->codec || !codec->codec->name) return;
const char *name = codec->codec->name;
size_t length = strlen(name);
if (length < 4 || strcmp(name + length - 4, "_amf")) return;
encoder = name;
}
}
char buf[1024];
vsnprintf(buf, sizeof(buf), fmt, vl);
size_t len = strlen(buf);
while (len > 0 && (buf[len - 1] == '\n' || buf[len - 1] == '\r')) buf[--len] = '\0';
if (encoder) DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "ffmpeg AMF encoder=%s: %s", encoder, buf);
if (headers) {
if (!strstr(buf, "Packet:") && !strstr(buf, "init_qp_minus26") && !strstr(buf, "slice_qp_delta")
&& !strstr(buf, "pic_width_in_luma_samples") && !strstr(buf, "pic_height_in_luma_samples")
&& !strstr(buf, "pic_parameter_set_id") && !strstr(buf, "cu_qp_delta_enabled_flag")
&& !strstr(buf, "diff_cu_qp_delta_depth") && !strstr(buf, "slice_type")) return;
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "ffmpeg headers: %s", buf);
} else if (encoder) {
if (!strstr(buf, "Warning:") && !strstr(buf, "Error:")
&& (strstr(buf, "::SubmitInput() : format") || strstr(buf, "SubmitToEncoder() End: frame pts=")
|| strstr(buf, "::QueryOutput()") || strstr(buf, "QueryOutput() End: frame pts="))) return;
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "ffmpeg AMF encoder=%s: %s", encoder, buf);
}
else if (level <= AV_LOG_ERROR) DEBUG_ERROR(DEBUG_CATEGORY_VIDEO, "ffmpeg: %s", buf);
else DEBUG_WARN(DEBUG_CATEGORY_VIDEO, "ffmpeg: %s", buf);
}