From c928ed5ce37f08ead06ab1ae2d74cf1b67a42538 Mon Sep 17 00:00:00 2001
From: Arjen Hiemstra <ahiemstra@heimr.nl>
Date: Thu, 20 Mar 2025 14:27:41 +0100
Subject: [PATCH] Add logging of encoding options if log level is set to info

Allows inspecting what's actually sent to FFmpeg.
---
 src/encoder.cpp            | 10 ++++++++++
 src/encoder_p.h            |  1 +
 src/h264vaapiencoder.cpp   |  1 +
 src/libopenh264encoder.cpp |  1 +
 src/libvpxencoder.cpp      |  1 +
 src/libvpxvp9encoder.cpp   |  1 +
 src/libx264encoder.cpp     |  1 +
 7 files changed, 16 insertions(+)

diff --git a/src/encoder.cpp b/src/encoder.cpp
index 3361785..f8b3d67 100644
--- a/src/encoder.cpp
+++ b/src/encoder.cpp
@@ -211,6 +211,16 @@ AVDictionary *Encoder::buildEncodingOptions()
     return options;
 }
 
+void Encoder::maybeLogOptions(AVDictionary *options)
+{
+    if (PIPEWIRERECORD_LOGGING().isInfoEnabled()) {
+        char *buffer = NULL;
+        av_dict_get_string(options, &buffer, '=', ',');
+        qCInfo(PIPEWIRERECORD_LOGGING) << "Using encoding options:" << buffer;
+        av_freep(&buffer);
+    }
+}
+
 SoftwareEncoder::SoftwareEncoder(PipeWireProduce *produce)
     : Encoder(produce)
 {
diff --git a/src/encoder_p.h b/src/encoder_p.h
index 48d3a9e..e565cc2 100644
--- a/src/encoder_p.h
+++ b/src/encoder_p.h
@@ -103,6 +103,7 @@ public:
 protected:
     virtual int percentageToAbsoluteQuality(const std::optional<quint8> &quality) = 0;
     virtual AVDictionary *buildEncodingOptions();
+    void maybeLogOptions(AVDictionary *options);
 
     PipeWireProduce *m_produce;
 
diff --git a/src/h264vaapiencoder.cpp b/src/h264vaapiencoder.cpp
index 26e7fba..0cf251b 100644
--- a/src/h264vaapiencoder.cpp
+++ b/src/h264vaapiencoder.cpp
@@ -141,6 +141,7 @@ bool H264VAAPIEncoder::initialize(const QSize &size)
     }
 
     AVDictionary *options = buildEncodingOptions();
+    maybeLogOptions(options);
 
     // Assign the right hardware context for encoding frames.
     // We rely on FFmpeg for creating the VAAPI hardware context as part of
diff --git a/src/libopenh264encoder.cpp b/src/libopenh264encoder.cpp
index 7f374d2..db6ed4d 100644
--- a/src/libopenh264encoder.cpp
+++ b/src/libopenh264encoder.cpp
@@ -75,6 +75,7 @@ bool LibOpenH264Encoder::initialize(const QSize &size)
     }
 
     AVDictionary *options = buildEncodingOptions();
+    maybeLogOptions(options);
 
     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
diff --git a/src/libvpxencoder.cpp b/src/libvpxencoder.cpp
index 2d696d6..f81b048 100644
--- a/src/libvpxencoder.cpp
+++ b/src/libvpxencoder.cpp
@@ -58,6 +58,7 @@ bool LibVpxEncoder::initialize(const QSize &size)
     }
 
     AVDictionary *options = buildEncodingOptions();
+    maybeLogOptions(options);
 
     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
diff --git a/src/libvpxvp9encoder.cpp b/src/libvpxvp9encoder.cpp
index 0b63015..d877023 100644
--- a/src/libvpxvp9encoder.cpp
+++ b/src/libvpxvp9encoder.cpp
@@ -51,6 +51,7 @@ bool LibVpxVp9Encoder::initialize(const QSize &size)
     m_avCodecContext->time_base = AVRational{1, 1000};
 
     AVDictionary *options = buildEncodingOptions();
+    maybeLogOptions(options);
 
     const auto area = size.width() * size.height();
     // m_avCodecContext->framerate is not set, so we use m_produce->maxFramerate() instead.
diff --git a/src/libx264encoder.cpp b/src/libx264encoder.cpp
index 7d4f96b..d9fe44f 100644
--- a/src/libx264encoder.cpp
+++ b/src/libx264encoder.cpp
@@ -79,6 +79,7 @@ bool LibX264Encoder::initialize(const QSize &size)
     }
 
     AVDictionary *options = buildEncodingOptions();
+    maybeLogOptions(options);
 
     if (int result = avcodec_open2(m_avCodecContext, codec, &options); result < 0) {
         qCWarning(PIPEWIRERECORD_LOGGING) << "Could not open codec" << av_err2str(result);
-- 
GitLab

