[Pkg-gstreamer-commits] [gstreamer-vaapi] 03/176: libs: add support for rate-control to GstVaapiContext.
Vincent Cheng
vcheng at moszumanska.debian.org
Tue Jun 3 08:09:22 UTC 2014
This is an automated email from the git hooks/post-receive script.
vcheng pushed a commit to branch upstream
in repository gstreamer-vaapi.
commit 02e174c8bc473c6c2fb8b6a5ecf288839537d27e
Author: Wind Yuan <feng.yuan at intel.com>
Date: Fri Jul 12 22:07:59 2013 +0800
libs: add support for rate-control to GstVaapiContext.
Extend GstVaapiContextInfo structure to hold the desired rate control
mode for encoding purposes. For decoding purposes, this field is not
used and it is initialized to GST_VAAPI_RATECONTROL_NONE.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
---
gst-libs/gst/vaapi/gstvaapicontext.c | 40 ++++++++++++++++++++++++++++++------
gst-libs/gst/vaapi/gstvaapicontext.h | 4 ++++
2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/gst-libs/gst/vaapi/gstvaapicontext.c b/gst-libs/gst/vaapi/gstvaapicontext.c
index dce82f4..0628224 100644
--- a/gst-libs/gst/vaapi/gstvaapicontext.c
+++ b/gst-libs/gst/vaapi/gstvaapicontext.c
@@ -522,7 +522,9 @@ gst_vaapi_context_create(GstVaapiContext *context)
GstVaapiDisplay * const display = GST_VAAPI_OBJECT_DISPLAY(context);
VAProfile va_profile;
VAEntrypoint va_entrypoint;
- VAConfigAttrib attrib;
+ guint va_rate_control;
+ VAConfigAttrib attribs[2];
+ guint num_attribs;
VAContextID context_id;
VASurfaceID surface_id;
VAStatus status;
@@ -557,26 +559,42 @@ gst_vaapi_context_create(GstVaapiContext *context)
va_profile = gst_vaapi_profile_get_va_profile(cip->profile);
va_entrypoint = gst_vaapi_entrypoint_get_va_entrypoint(cip->entrypoint);
+ num_attribs = 0;
+ attribs[num_attribs++].type = VAConfigAttribRTFormat;
+ if (cip->entrypoint == GST_VAAPI_ENTRYPOINT_SLICE_ENCODE)
+ attribs[num_attribs++].type = VAConfigAttribRateControl;
+
GST_VAAPI_DISPLAY_LOCK(display);
- attrib.type = VAConfigAttribRTFormat;
status = vaGetConfigAttributes(
GST_VAAPI_DISPLAY_VADISPLAY(display),
va_profile,
va_entrypoint,
- &attrib, 1
+ attribs, num_attribs
);
GST_VAAPI_DISPLAY_UNLOCK(display);
if (!vaapi_check_status(status, "vaGetConfigAttributes()"))
goto end;
- if (!(attrib.value & VA_RT_FORMAT_YUV420))
+ if (!(attribs[0].value & VA_RT_FORMAT_YUV420))
goto end;
+ if (cip->entrypoint == GST_VAAPI_ENTRYPOINT_SLICE_ENCODE) {
+ va_rate_control = from_GstVaapiRateControl(cip->rc_mode);
+ if (va_rate_control == VA_RC_NONE)
+ attribs[1].value = VA_RC_NONE;
+ if ((attribs[1].value & va_rate_control) != va_rate_control) {
+ GST_ERROR("unsupported %s rate control",
+ string_of_VARateControl(va_rate_control));
+ goto end;
+ }
+ attribs[1].value = va_rate_control;
+ }
+
GST_VAAPI_DISPLAY_LOCK(display);
status = vaCreateConfig(
GST_VAAPI_DISPLAY_VADISPLAY(display),
va_profile,
va_entrypoint,
- &attrib, 1,
+ attribs, num_attribs,
&context->config_id
);
GST_VAAPI_DISPLAY_UNLOCK(display);
@@ -651,6 +669,7 @@ gst_vaapi_context_new(
info.profile = profile;
info.entrypoint = entrypoint;
+ info.rc_mode = GST_VAAPI_RATECONTROL_NONE;
info.width = width;
info.height = height;
info.ref_frames = get_max_ref_frames(profile);
@@ -719,6 +738,7 @@ gst_vaapi_context_reset(
info.profile = profile;
info.entrypoint = entrypoint;
+ info.rc_mode = GST_VAAPI_RATECONTROL_NONE;
info.width = width;
info.height = height;
info.ref_frames = context->info.ref_frames;
@@ -742,7 +762,7 @@ gst_vaapi_context_reset_full(GstVaapiContext *context,
const GstVaapiContextInfo *new_cip)
{
GstVaapiContextInfo * const cip = &context->info;
- gboolean size_changed, codec_changed;
+ gboolean size_changed, codec_changed, rc_mode_changed;
size_changed = cip->width != new_cip->width ||
cip->height != new_cip->height;
@@ -760,6 +780,14 @@ gst_vaapi_context_reset_full(GstVaapiContext *context,
cip->entrypoint = new_cip->entrypoint;
}
+ if (new_cip->entrypoint == GST_VAAPI_ENTRYPOINT_SLICE_ENCODE) {
+ rc_mode_changed = cip->rc_mode != cip->rc_mode;
+ if (rc_mode_changed) {
+ gst_vaapi_context_destroy(context);
+ cip->rc_mode = new_cip->rc_mode;
+ }
+ }
+
if (size_changed && !gst_vaapi_context_create_surfaces(context))
return FALSE;
diff --git a/gst-libs/gst/vaapi/gstvaapicontext.h b/gst-libs/gst/vaapi/gstvaapicontext.h
index 8260e14..771f505 100644
--- a/gst-libs/gst/vaapi/gstvaapicontext.h
+++ b/gst-libs/gst/vaapi/gstvaapicontext.h
@@ -45,10 +45,14 @@ typedef struct _GstVaapiContextInfo GstVaapiContextInfo;
* Structure holding VA context info like encoded size, decoder
* profile and entry-point to use, and maximum number of reference
* frames reported by the bitstream.
+ *
+ * Note: @rc_mode is only valid for VA context used for encoding,
+ * i.e. if @entrypoint is set to @GST_VAAPI_ENTRYPOINT_SLICE_ENCODE.
*/
struct _GstVaapiContextInfo {
GstVaapiProfile profile;
GstVaapiEntrypoint entrypoint;
+ GstVaapiRateControl rc_mode;
guint width;
guint height;
guint ref_frames;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gstreamer/gstreamer-vaapi.git
More information about the Pkg-gstreamer-commits
mailing list