History

vaapi_encode: Support more RC modes

Allow setting the mode explicitly, and try to make a sensible choice given the available parameters if not.

Mark Thompson committed 7 years ago

Commit f4d7bd61 parent 9d5ca713 files · +358 −113Browse files

Showing the changes to libavcodec/vaapi_encode.h (1 of 3 files). Show all

Unified · Split

libavcodec/vaapi_encode.h+65−0
@@ -129,6 +129,36 @@ typedef struct VAAPIEncodeProfile { · 128 unmodified lines
129129 VAProfile va_profile;
130130 } VAAPIEncodeProfile;
131131
132+enum {
133+ RC_MODE_AUTO,
134+ RC_MODE_CQP,
135+ RC_MODE_CBR,
136+ RC_MODE_VBR,
137+ RC_MODE_ICQ,
138+ RC_MODE_QVBR,
139+ RC_MODE_AVBR,
140+ RC_MODE_MAX = RC_MODE_AVBR,
141+};
142+
143+typedef struct VAAPIEncodeRCMode {
144+ // Mode from above enum (RC_MODE_*).
145+ int mode;
146+ // Name.
147+ const char *name;
148+ // Supported in the compile-time VAAPI version.
149+ int supported;
150+ // VA mode value (VA_RC_*).
151+ uint32_t va_mode;
152+ // Uses bitrate parameters.
153+ int bitrate;
154+ // Supports maxrate distinct from bitrate.
155+ int maxrate;
156+ // Uses quality value.
157+ int quality;
158+ // Supports HRD/VBV parameters.
159+ int hrd;
160+} VAAPIEncodeRCMode;
161+
132162 typedef struct VAAPIEncodeContext {
133163 const AVClass *class;
134164
@@ -146,6 +176,14 @@ typedef struct VAAPIEncodeContext { · 11 unmodified lines
146176 // Desired B frame reference depth.
147177 int desired_b_depth;
148178
179+ // Explicitly set RC mode (otherwise attempt to pick from
180+ // available modes).
181+ int explicit_rc_mode;
182+
183+ // Explicitly-set QP, for use with the "qp" options.
184+ // (Forces CQP mode when set, overriding everything else.)
185+ int explicit_qp;
186+
149187 // Desired packed headers.
150188 unsigned int desired_packed_headers;
151189
@@ -165,6 +203,12 @@ typedef struct VAAPIEncodeContext { · 13 unmodified lines
165203 // Chosen encoding profile details.
166204 const VAAPIEncodeProfile *profile;
167205
206+ // Chosen rate control mode details.
207+ const VAAPIEncodeRCMode *rc_mode;
208+ // RC quality level - meaning depends on codec and RC mode.
209+ // In CQP mode this sets the fixed quantiser value.
210+ int rc_quality;
211+
168212 // Encoding profile (VAProfile*).
169213 VAProfile va_profile;
170214 // Encoding entrypoint (VAEntryoint*).
@@ -296,6 +340,10 @@ typedef struct VAAPIEncodeType { · 125 unmodified lines
296340 // Codec feature flags.
297341 int flags;
298342
343+ // Default quality for this codec - used as quantiser or RC quality
344+ // factor depending on RC mode.
345+ int default_quality;
346+
299347 // Perform any extra codec-specific configuration after the
300348 // codec context is initialised (set up the private data and
301349 // add any necessary global parameters).
@@ -382,5 +430,22 @@ int ff_vaapi_encode_close(AVCodecContext *avctx); · 80 unmodified lines
382430 OFFSET(common.desired_b_depth), AV_OPT_TYPE_INT, \
383431 { .i64 = 1 }, 1, INT_MAX, FLAGS }
384432
433+#define VAAPI_ENCODE_RC_MODE(name, desc) \
434+ { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
435+ 0, 0, FLAGS, "rc_mode" }
436+#define VAAPI_ENCODE_RC_OPTIONS \
437+ { "rc_mode",\
438+ "Set rate control mode", \
439+ OFFSET(common.explicit_rc_mode), AV_OPT_TYPE_INT, \
440+ { .i64 = RC_MODE_AUTO }, RC_MODE_AUTO, RC_MODE_MAX, FLAGS, "rc_mode" }, \
441+ { "auto", "Choose mode automatically based on other parameters", \
442+ 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_AUTO }, 0, 0, FLAGS, "rc_mode" }, \
443+ VAAPI_ENCODE_RC_MODE(CQP, "Constant-quality"), \
444+ VAAPI_ENCODE_RC_MODE(CBR, "Constant-bitrate"), \
445+ VAAPI_ENCODE_RC_MODE(VBR, "Variable-bitrate"), \
446+ VAAPI_ENCODE_RC_MODE(ICQ, "Intelligent constant-quality"), \
447+ VAAPI_ENCODE_RC_MODE(QVBR, "Quality-defined variable-bitrate"), \
448+ VAAPI_ENCODE_RC_MODE(AVBR, "Average variable-bitrate")
449+
385450
386451 #endif /* AVCODEC_VAAPI_ENCODE_H */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t