2013-07-29 05:34:06 +00:00
|
|
|
/*
|
|
|
|
* gstvaapiencoder_priv.h - VA encoder abstraction (private definitions)
|
|
|
|
*
|
2014-01-22 17:54:14 +00:00
|
|
|
* Copyright (C) 2013-2014 Intel Corporation
|
2014-01-22 17:49:20 +00:00
|
|
|
* Author: Wind Yuan <feng.yuan@intel.com>
|
|
|
|
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
|
2013-07-29 05:34:06 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2.1
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* 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
|
|
|
|
* License along with this library; if not, write to the Free
|
|
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef GST_VAAPI_ENCODER_PRIV_H
|
|
|
|
#define GST_VAAPI_ENCODER_PRIV_H
|
|
|
|
|
|
|
|
#include <gst/vaapi/gstvaapiencoder.h>
|
|
|
|
#include <gst/vaapi/gstvaapiencoder_objects.h>
|
|
|
|
#include <gst/vaapi/gstvaapicontext.h>
|
2013-12-03 15:11:46 +00:00
|
|
|
#include <gst/vaapi/gstvaapivideopool.h>
|
2013-07-29 05:34:06 +00:00
|
|
|
#include <gst/video/gstvideoutils.h>
|
2014-01-12 17:52:14 +00:00
|
|
|
#include <gst/vaapi/gstvaapivalue.h>
|
2013-07-29 05:34:06 +00:00
|
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
|
2013-12-04 16:55:18 +00:00
|
|
|
#define GST_VAAPI_ENCODER_CAST(encoder) \
|
|
|
|
((GstVaapiEncoder *)(encoder))
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
#define GST_VAAPI_ENCODER_CLASS(klass) \
|
|
|
|
((GstVaapiEncoderClass *)(klass))
|
|
|
|
|
|
|
|
#define GST_VAAPI_ENCODER_GET_CLASS(obj) \
|
|
|
|
GST_VAAPI_ENCODER_CLASS(GST_VAAPI_MINI_OBJECT_GET_CLASS(obj))
|
|
|
|
|
2014-01-21 17:35:17 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_PACKED_HEADERS:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the required set of VA packed headers that
|
|
|
|
* need to be submitted along with the corresponding param buffers.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_PACKED_HEADERS
|
|
|
|
#define GST_VAAPI_ENCODER_PACKED_HEADERS(encoder) \
|
|
|
|
GST_VAAPI_ENCODER_CAST(encoder)->packed_headers
|
|
|
|
|
2014-01-12 20:57:20 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_DISPLAY:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the #GstVaapiDisplay of @encoder.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_DISPLAY
|
2013-07-29 05:34:06 +00:00
|
|
|
#define GST_VAAPI_ENCODER_DISPLAY(encoder) \
|
2014-01-12 20:57:20 +00:00
|
|
|
GST_VAAPI_ENCODER_CAST(encoder)->display
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-12 20:57:20 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_CONTEXT:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the #GstVaapiContext of @encoder.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_CONTEXT
|
2013-07-29 05:34:06 +00:00
|
|
|
#define GST_VAAPI_ENCODER_CONTEXT(encoder) \
|
2014-01-12 20:57:20 +00:00
|
|
|
GST_VAAPI_ENCODER_CAST(encoder)->context
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-10 09:54:22 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_VIDEO_INFO:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the #GstVideoInfo of @encoder.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_VIDEO_INFO
|
|
|
|
#define GST_VAAPI_ENCODER_VIDEO_INFO(encoder) \
|
|
|
|
(&GST_VAAPI_ENCODER_CAST (encoder)->video_info)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_WIDTH:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the coded width of the picture.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_WIDTH
|
|
|
|
#define GST_VAAPI_ENCODER_WIDTH(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_VIDEO_INFO (encoder)->width)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_HEIGHT:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the coded height of the picture.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_HEIGHT
|
|
|
|
#define GST_VAAPI_ENCODER_HEIGHT(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_VIDEO_INFO (encoder)->height)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_FPS_N:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the coded framerate numerator.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_FPS_N
|
|
|
|
#define GST_VAAPI_ENCODER_FPS_N(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_VIDEO_INFO (encoder)->fps_n)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_FPS_D:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the coded framerate denominator.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_FPS_D
|
|
|
|
#define GST_VAAPI_ENCODER_FPS_D(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_VIDEO_INFO (encoder)->fps_d)
|
2014-01-06 14:10:36 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_RATE_CONTROL:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the rate control.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_RATE_CONTROL
|
|
|
|
#define GST_VAAPI_ENCODER_RATE_CONTROL(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->rate_control)
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-10 12:23:48 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_KEYFRAME_PERIOD:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the keyframe period.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_KEYFRAME_PERIOD
|
|
|
|
#define GST_VAAPI_ENCODER_KEYFRAME_PERIOD(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->keyframe_period)
|
|
|
|
|
2014-01-13 09:48:25 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_TUNE:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the tuning option.
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_TUNE
|
|
|
|
#define GST_VAAPI_ENCODER_TUNE(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->tune)
|
|
|
|
|
encoders: add quality level tuning
This patch adds the handling of VAEncMiscParameterTypeQualityLevel,
in gstreamer-vaapi encoders:
The encoding quality could be set through this structure, if the
implementation supports multiple quality levels. The quality level set
through this structure is persistent over the entire coded sequence, or
until a new structure is being sent. The quality level range can be queried
through the VAConfigAttribEncQualityRange attribute. A lower value means
higher quality, and a value of 1 represents the highest quality. The quality
level setting is used as a trade-off between quality and speed/power
consumption, with higher quality corresponds to lower speed and higher power
consumption.
The quality level is set by the element's parameter "quality-level" with a
hard-coded range of 1 to 8.
Later, when the encoder is configured in run time, just before start
processing, the quality level is scaled to the codec range. If
VAConfigAttribEncQualityRange is not available in the used VA backend, then
the quality level is set to zero, which means "disabled".
All the available codecs now process this parameter if it is available.
https://bugzilla.gnome.org/show_bug.cgi?id=778733
Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
2017-04-19 20:04:44 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_QUALITY_LEVEL:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to the quality level
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_QUALITY_LEVEL
|
|
|
|
#define GST_VAAPI_ENCODER_QUALITY_LEVEL(encoder) \
|
2017-06-05 16:19:05 +00:00
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->va_quality_level.quality_level)
|
encoders: add quality level tuning
This patch adds the handling of VAEncMiscParameterTypeQualityLevel,
in gstreamer-vaapi encoders:
The encoding quality could be set through this structure, if the
implementation supports multiple quality levels. The quality level set
through this structure is persistent over the entire coded sequence, or
until a new structure is being sent. The quality level range can be queried
through the VAConfigAttribEncQualityRange attribute. A lower value means
higher quality, and a value of 1 represents the highest quality. The quality
level setting is used as a trade-off between quality and speed/power
consumption, with higher quality corresponds to lower speed and higher power
consumption.
The quality level is set by the element's parameter "quality-level" with a
hard-coded range of 1 to 8.
Later, when the encoder is configured in run time, just before start
processing, the quality level is scaled to the codec range. If
VAConfigAttribEncQualityRange is not available in the used VA backend, then
the quality level is set to zero, which means "disabled".
All the available codecs now process this parameter if it is available.
https://bugzilla.gnome.org/show_bug.cgi?id=778733
Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
2017-04-19 20:04:44 +00:00
|
|
|
|
2017-06-05 15:31:10 +00:00
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_VA_RATE_CONTROL:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to #VAEncMiscParameterRateControl
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_VA_RATE_CONTROL
|
|
|
|
#define GST_VAAPI_ENCODER_VA_RATE_CONTROL(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->va_ratecontrol)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_VA_FRAME_RATE:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to #VAEncMiscParameterFrameRate
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_VA_FRAME_RATE
|
|
|
|
#define GST_VAAPI_ENCODER_VA_FRAME_RATE(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->va_framerate)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GST_VAAPI_ENCODER_VA_HRD:
|
|
|
|
* @encoder: a #GstVaapiEncoder
|
|
|
|
*
|
|
|
|
* Macro that evaluates to #VAEncMiscParameterHRD
|
|
|
|
* This is an internal macro that does not do any run-time type check.
|
|
|
|
*/
|
|
|
|
#undef GST_VAAPI_ENCODER_VA_HRD
|
|
|
|
#define GST_VAAPI_ENCODER_VA_HRD(encoder) \
|
|
|
|
(GST_VAAPI_ENCODER_CAST (encoder)->va_hrd)
|
|
|
|
|
2014-01-13 09:48:25 +00:00
|
|
|
/* Generate a mask for the supplied tuning option (internal) */
|
|
|
|
#define GST_VAAPI_ENCODER_TUNE_MASK(TUNE) \
|
|
|
|
(1U << G_PASTE (GST_VAAPI_ENCODER_TUNE_, TUNE))
|
|
|
|
|
|
|
|
#define GST_VAAPI_TYPE_ENCODER_TUNE \
|
|
|
|
(gst_vaapi_encoder_tune_get_type ())
|
|
|
|
|
2017-09-18 17:11:45 +00:00
|
|
|
#define GST_VAAPI_TYPE_ENCODER_MBBRC \
|
|
|
|
(gst_vaapi_encoder_mbbrc_get_type ())
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
typedef struct _GstVaapiEncoderClass GstVaapiEncoderClass;
|
2014-01-06 14:10:36 +00:00
|
|
|
typedef struct _GstVaapiEncoderClassData GstVaapiEncoderClassData;
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-06 16:46:40 +00:00
|
|
|
/* Private GstVaapiEncoderPropInfo definition */
|
|
|
|
typedef struct {
|
|
|
|
gint prop;
|
|
|
|
GParamSpec *pspec;
|
|
|
|
} GstVaapiEncoderPropData;
|
|
|
|
|
|
|
|
#define GST_VAAPI_ENCODER_PROPERTIES_APPEND(props, id, pspec) do { \
|
|
|
|
props = gst_vaapi_encoder_properties_append (props, id, pspec); \
|
|
|
|
if (!props) \
|
|
|
|
return NULL; \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
G_GNUC_INTERNAL
|
|
|
|
GPtrArray *
|
|
|
|
gst_vaapi_encoder_properties_append (GPtrArray * props, gint prop_id,
|
|
|
|
GParamSpec *pspec);
|
|
|
|
|
|
|
|
G_GNUC_INTERNAL
|
|
|
|
GPtrArray *
|
|
|
|
gst_vaapi_encoder_properties_get_default (const GstVaapiEncoderClass * klass);
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
struct _GstVaapiEncoder
|
|
|
|
{
|
2014-01-03 15:57:09 +00:00
|
|
|
/*< private >*/
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiMiniObject parent_instance;
|
|
|
|
|
2014-01-06 16:46:40 +00:00
|
|
|
GPtrArray *properties;
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiDisplay *display;
|
|
|
|
GstVaapiContext *context;
|
2013-12-04 17:48:35 +00:00
|
|
|
GstVaapiContextInfo context_info;
|
2014-01-13 09:48:25 +00:00
|
|
|
GstVaapiEncoderTune tune;
|
2014-01-21 17:35:17 +00:00
|
|
|
guint packed_headers;
|
2013-07-29 05:34:06 +00:00
|
|
|
|
|
|
|
VADisplay va_display;
|
|
|
|
VAContextID va_context;
|
|
|
|
GstVideoInfo video_info;
|
2014-01-10 11:01:51 +00:00
|
|
|
GstVaapiProfile profile;
|
|
|
|
guint num_ref_frames;
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiRateControl rate_control;
|
2014-01-06 14:10:36 +00:00
|
|
|
guint32 rate_control_mask;
|
2014-01-06 17:01:33 +00:00
|
|
|
guint bitrate; /* kbps */
|
2019-05-01 19:56:55 +00:00
|
|
|
guint target_percentage;
|
2014-01-10 12:23:48 +00:00
|
|
|
guint keyframe_period;
|
2017-06-05 16:19:05 +00:00
|
|
|
|
2017-07-28 06:27:20 +00:00
|
|
|
/* Maximum number of reference frames supported
|
|
|
|
* for the reference picture list 0 and list 2 */
|
|
|
|
guint max_num_ref_frames_0;
|
|
|
|
guint max_num_ref_frames_1;
|
|
|
|
|
2017-06-05 16:19:05 +00:00
|
|
|
/* parameters */
|
|
|
|
VAEncMiscParameterBufferQualityLevel va_quality_level;
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2013-12-04 16:05:17 +00:00
|
|
|
GMutex mutex;
|
2013-07-29 05:34:06 +00:00
|
|
|
GCond surface_free;
|
2013-12-03 15:11:46 +00:00
|
|
|
GCond codedbuf_free;
|
|
|
|
guint codedbuf_size;
|
|
|
|
GstVaapiVideoPool *codedbuf_pool;
|
2013-12-04 16:05:17 +00:00
|
|
|
GAsyncQueue *codedbuf_queue;
|
2014-01-06 14:10:36 +00:00
|
|
|
guint32 num_codedbuf_queued;
|
2014-01-23 14:10:11 +00:00
|
|
|
|
2014-01-23 14:13:06 +00:00
|
|
|
guint got_packed_headers:1;
|
2014-01-23 14:10:11 +00:00
|
|
|
guint got_rate_control_mask:1;
|
2017-03-28 08:41:37 +00:00
|
|
|
|
2017-06-05 15:31:10 +00:00
|
|
|
/* miscellaneous buffer parameters */
|
|
|
|
VAEncMiscParameterRateControl va_ratecontrol;
|
|
|
|
VAEncMiscParameterFrameRate va_framerate;
|
|
|
|
VAEncMiscParameterHRD va_hrd;
|
2018-02-22 20:20:42 +00:00
|
|
|
|
|
|
|
gint8 default_roi_value;
|
2019-05-08 15:39:20 +00:00
|
|
|
|
|
|
|
/* trellis quantization */
|
|
|
|
gboolean trellis;
|
2013-07-29 05:34:06 +00:00
|
|
|
};
|
|
|
|
|
2014-01-06 14:10:36 +00:00
|
|
|
struct _GstVaapiEncoderClassData
|
|
|
|
{
|
|
|
|
/*< private >*/
|
|
|
|
GstVaapiCodec codec;
|
2014-01-23 14:13:06 +00:00
|
|
|
guint32 packed_headers;
|
2014-01-06 14:10:36 +00:00
|
|
|
|
2014-01-12 17:52:14 +00:00
|
|
|
GType (*rate_control_get_type)(void);
|
2014-01-06 14:10:36 +00:00
|
|
|
GstVaapiRateControl default_rate_control;
|
|
|
|
guint32 rate_control_mask;
|
2014-01-13 09:48:25 +00:00
|
|
|
|
|
|
|
GType (*encoder_tune_get_type)(void);
|
|
|
|
GstVaapiEncoderTune default_encoder_tune;
|
|
|
|
guint32 encoder_tune_mask;
|
2014-01-06 14:10:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#define GST_VAAPI_ENCODER_DEFINE_CLASS_DATA(CODEC) \
|
2014-01-12 17:52:14 +00:00
|
|
|
GST_VAAPI_TYPE_DEFINE_ENUM_SUBSET_FROM_MASK( \
|
|
|
|
G_PASTE (GstVaapiRateControl, CODEC), \
|
|
|
|
G_PASTE (gst_vaapi_rate_control_, CODEC), \
|
|
|
|
GST_VAAPI_TYPE_RATE_CONTROL, SUPPORTED_RATECONTROLS); \
|
|
|
|
\
|
2014-01-13 09:48:25 +00:00
|
|
|
GST_VAAPI_TYPE_DEFINE_ENUM_SUBSET_FROM_MASK( \
|
|
|
|
G_PASTE (GstVaapiEncoderTune, CODEC), \
|
|
|
|
G_PASTE (gst_vaapi_encoder_tune_, CODEC), \
|
|
|
|
GST_VAAPI_TYPE_ENCODER_TUNE, SUPPORTED_TUNE_OPTIONS); \
|
|
|
|
\
|
2014-01-06 14:10:36 +00:00
|
|
|
static const GstVaapiEncoderClassData g_class_data = { \
|
|
|
|
.codec = G_PASTE (GST_VAAPI_CODEC_, CODEC), \
|
2014-01-23 14:13:06 +00:00
|
|
|
.packed_headers = SUPPORTED_PACKED_HEADERS, \
|
2014-01-12 17:52:14 +00:00
|
|
|
.rate_control_get_type = \
|
|
|
|
G_PASTE (G_PASTE (gst_vaapi_rate_control_, CODEC), _get_type), \
|
2014-01-06 14:10:36 +00:00
|
|
|
.default_rate_control = DEFAULT_RATECONTROL, \
|
|
|
|
.rate_control_mask = SUPPORTED_RATECONTROLS, \
|
2014-01-13 09:48:25 +00:00
|
|
|
.encoder_tune_get_type = \
|
|
|
|
G_PASTE (G_PASTE (gst_vaapi_encoder_tune_, CODEC), _get_type), \
|
|
|
|
.default_encoder_tune = GST_VAAPI_ENCODER_TUNE_NONE, \
|
|
|
|
.encoder_tune_mask = SUPPORTED_TUNE_OPTIONS, \
|
2014-01-06 14:10:36 +00:00
|
|
|
}
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
struct _GstVaapiEncoderClass
|
|
|
|
{
|
2014-01-03 15:57:09 +00:00
|
|
|
/*< private >*/
|
2013-12-04 10:54:40 +00:00
|
|
|
GstVaapiMiniObjectClass parent_class;
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-06 14:10:36 +00:00
|
|
|
const GstVaapiEncoderClassData *class_data;
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
gboolean (*init) (GstVaapiEncoder * encoder);
|
2013-12-04 10:54:40 +00:00
|
|
|
void (*finalize) (GstVaapiEncoder * encoder);
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2014-01-10 09:54:22 +00:00
|
|
|
GstVaapiEncoderStatus (*reconfigure) (GstVaapiEncoder * encoder);
|
|
|
|
|
2014-01-06 16:46:40 +00:00
|
|
|
GPtrArray * (*get_default_properties) (void);
|
|
|
|
GstVaapiEncoderStatus (*set_property) (GstVaapiEncoder * encoder,
|
|
|
|
gint prop_id,
|
|
|
|
const GValue * value);
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiEncoderStatus (*reordering) (GstVaapiEncoder * encoder,
|
|
|
|
GstVideoCodecFrame * in,
|
|
|
|
GstVaapiEncPicture ** out);
|
|
|
|
GstVaapiEncoderStatus (*encode) (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture * picture,
|
|
|
|
GstVaapiCodedBufferProxy * codedbuf);
|
|
|
|
|
|
|
|
GstVaapiEncoderStatus (*flush) (GstVaapiEncoder * encoder);
|
|
|
|
|
|
|
|
/* get_codec_data can be NULL */
|
|
|
|
GstVaapiEncoderStatus (*get_codec_data) (GstVaapiEncoder * encoder,
|
|
|
|
GstBuffer ** codec_data);
|
2017-08-09 21:10:16 +00:00
|
|
|
|
|
|
|
/* To create a secondary context for a single base encoder */
|
|
|
|
gboolean (*ensure_secondary_context) (GstVaapiEncoder * encoder);
|
2019-01-14 17:21:30 +00:00
|
|
|
|
|
|
|
/* Iterator that retrieves the pending pictures in the reordered
|
|
|
|
* list */
|
|
|
|
gboolean (*get_pending_reordered) (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture ** picture,
|
|
|
|
gpointer * state);
|
2013-07-29 05:34:06 +00:00
|
|
|
};
|
|
|
|
|
2013-12-04 10:54:40 +00:00
|
|
|
#define GST_VAAPI_ENCODER_CLASS_HOOK(codec, func) \
|
|
|
|
.func = G_PASTE (G_PASTE (G_PASTE (gst_vaapi_encoder_,codec),_), func)
|
|
|
|
|
|
|
|
#define GST_VAAPI_ENCODER_CLASS_INIT_BASE(CODEC) \
|
|
|
|
.parent_class = { \
|
|
|
|
.size = sizeof (G_PASTE (GstVaapiEncoder, CODEC)), \
|
|
|
|
.finalize = (GDestroyNotify) gst_vaapi_encoder_finalize \
|
|
|
|
}
|
2013-07-29 05:34:06 +00:00
|
|
|
|
2013-12-04 10:54:40 +00:00
|
|
|
#define GST_VAAPI_ENCODER_CLASS_INIT(CODEC, codec) \
|
|
|
|
GST_VAAPI_ENCODER_CLASS_INIT_BASE (CODEC), \
|
2014-01-06 14:10:36 +00:00
|
|
|
.class_data = &g_class_data, \
|
2013-12-04 10:54:40 +00:00
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, init), \
|
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, finalize), \
|
2014-01-10 09:54:22 +00:00
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, reconfigure), \
|
2014-01-06 16:46:40 +00:00
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, get_default_properties), \
|
2013-12-04 10:54:40 +00:00
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, reordering), \
|
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, encode), \
|
|
|
|
GST_VAAPI_ENCODER_CLASS_HOOK (codec, flush)
|
|
|
|
|
|
|
|
G_GNUC_INTERNAL
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiEncoder *
|
|
|
|
gst_vaapi_encoder_new (const GstVaapiEncoderClass * klass,
|
|
|
|
GstVaapiDisplay * display);
|
|
|
|
|
2013-12-04 10:54:40 +00:00
|
|
|
G_GNUC_INTERNAL
|
2013-07-29 05:34:06 +00:00
|
|
|
void
|
|
|
|
gst_vaapi_encoder_finalize (GstVaapiEncoder * encoder);
|
|
|
|
|
2013-12-04 16:55:18 +00:00
|
|
|
G_GNUC_INTERNAL
|
2013-07-29 05:34:06 +00:00
|
|
|
GstVaapiSurfaceProxy *
|
|
|
|
gst_vaapi_encoder_create_surface (GstVaapiEncoder *
|
|
|
|
encoder);
|
|
|
|
|
2013-12-04 16:55:18 +00:00
|
|
|
static inline void
|
2013-07-29 05:34:06 +00:00
|
|
|
gst_vaapi_encoder_release_surface (GstVaapiEncoder * encoder,
|
2013-12-04 16:55:18 +00:00
|
|
|
GstVaapiSurfaceProxy * proxy)
|
|
|
|
{
|
|
|
|
gst_vaapi_surface_proxy_unref (proxy);
|
|
|
|
}
|
2013-07-29 05:34:06 +00:00
|
|
|
|
encoders: add quality level tuning
This patch adds the handling of VAEncMiscParameterTypeQualityLevel,
in gstreamer-vaapi encoders:
The encoding quality could be set through this structure, if the
implementation supports multiple quality levels. The quality level set
through this structure is persistent over the entire coded sequence, or
until a new structure is being sent. The quality level range can be queried
through the VAConfigAttribEncQualityRange attribute. A lower value means
higher quality, and a value of 1 represents the highest quality. The quality
level setting is used as a trade-off between quality and speed/power
consumption, with higher quality corresponds to lower speed and higher power
consumption.
The quality level is set by the element's parameter "quality-level" with a
hard-coded range of 1 to 8.
Later, when the encoder is configured in run time, just before start
processing, the quality level is scaled to the codec range. If
VAConfigAttribEncQualityRange is not available in the used VA backend, then
the quality level is set to zero, which means "disabled".
All the available codecs now process this parameter if it is available.
https://bugzilla.gnome.org/show_bug.cgi?id=778733
Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
2017-04-19 20:04:44 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_param_quality_level (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture * picture);
|
|
|
|
|
2017-06-05 15:31:10 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_param_control_rate (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture * picture);
|
|
|
|
|
2018-02-22 20:20:42 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_param_roi_regions (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture * picture);
|
|
|
|
|
2019-05-08 15:39:20 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_param_trellis (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiEncPicture * picture);
|
|
|
|
|
2017-05-15 16:38:29 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_num_slices (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiProfile profile, GstVaapiEntrypoint entrypoint,
|
|
|
|
guint media_max_slices, guint * num_slices);
|
|
|
|
|
2017-07-28 06:27:20 +00:00
|
|
|
G_GNUC_INTERNAL
|
|
|
|
gboolean
|
|
|
|
gst_vaapi_encoder_ensure_max_num_ref_frames (GstVaapiEncoder * encoder,
|
|
|
|
GstVaapiProfile profile, GstVaapiEntrypoint entrypoint);
|
|
|
|
|
2013-07-29 05:34:06 +00:00
|
|
|
G_END_DECLS
|
|
|
|
|
|
|
|
#endif /* GST_VAAPI_ENCODER_PRIV_H */
|