vaapiencode: use more GstVaapiPluginBase facilities.

Avoid duplication of pad references or query functions since they are
provided through the GstVaapiPluginBase object.
This commit is contained in:
Gwenole Beauchesne 2014-01-09 18:20:24 +01:00
parent 449ac54348
commit ea7c1d87c5
3 changed files with 28 additions and 57 deletions

View file

@ -70,22 +70,22 @@ ensure_uploader (GstVaapiEncode * encode)
static gboolean static gboolean
gst_vaapiencode_query (GST_PAD_QUERY_FUNCTION_ARGS) gst_vaapiencode_query (GST_PAD_QUERY_FUNCTION_ARGS)
{ {
GstVaapiEncode *const encode = GstVaapiPluginBase *const plugin =
GST_VAAPIENCODE_CAST (gst_pad_get_parent_element (pad)); GST_VAAPI_PLUGIN_BASE (gst_pad_get_parent_element (pad));
gboolean success; gboolean success;
GST_INFO_OBJECT (encode, "query type %s", GST_QUERY_TYPE_NAME (query)); GST_INFO_OBJECT (plugin, "query type %s", GST_QUERY_TYPE_NAME (query));
if (gst_vaapi_reply_to_query (query, GST_VAAPI_PLUGIN_BASE_DISPLAY (encode))) if (gst_vaapi_reply_to_query (query, plugin->display))
success = TRUE; success = TRUE;
else if (GST_PAD_IS_SINK (pad)) else if (GST_PAD_IS_SINK (pad))
success = GST_PAD_QUERY_FUNCTION_CALL (encode->sinkpad_query, success = GST_PAD_QUERY_FUNCTION_CALL (plugin->sinkpad_query,
encode->sinkpad, parent, query); plugin->sinkpad, parent, query);
else else
success = GST_PAD_QUERY_FUNCTION_CALL (encode->srcpad_query, success = GST_PAD_QUERY_FUNCTION_CALL (plugin->srcpad_query,
encode->srcpad, parent, query); plugin->srcpad, parent, query);
gst_object_unref (encode); gst_object_unref (plugin);
return success; return success;
} }
@ -334,25 +334,25 @@ gst_vaapiencode_buffer_loop (GstVaapiEncode * encode)
if (ret == GST_FLOW_OK || ret == GST_VAAPI_ENCODE_FLOW_TIMEOUT) if (ret == GST_FLOW_OK || ret == GST_VAAPI_ENCODE_FLOW_TIMEOUT)
return; return;
gst_pad_pause_task (encode->srcpad); gst_pad_pause_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode));
} }
static GstCaps * static GstCaps *
gst_vaapiencode_get_caps_impl (GstVideoEncoder * venc) gst_vaapiencode_get_caps_impl (GstVideoEncoder * venc)
{ {
GstVaapiEncode *const encode = GST_VAAPIENCODE_CAST (venc); GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (venc);
GstCaps *caps; GstCaps *caps;
if (encode->sinkpad_caps) if (plugin->sinkpad_caps)
caps = gst_caps_ref (encode->sinkpad_caps); caps = gst_caps_ref (plugin->sinkpad_caps);
else { else {
#if GST_CHECK_VERSION(1,0,0) #if GST_CHECK_VERSION(1,0,0)
caps = gst_pad_get_pad_template_caps (encode->sinkpad); caps = gst_pad_get_pad_template_caps (plugin->sinkpad);
#else #else
caps = gst_caps_from_string (GST_VAAPI_SURFACE_CAPS); caps = gst_caps_from_string (GST_VAAPI_SURFACE_CAPS);
if (caps && ensure_uploader (encode)) { if (caps && ensure_uploader (GST_VAAPIENCODE_CAST (plugin))) {
GstCaps *const yuv_caps = GST_VAAPI_PLUGIN_BASE_UPLOADER_CAPS (encode); GstCaps *const yuv_caps = GST_VAAPI_PLUGIN_BASE_UPLOADER_CAPS (plugin);
if (yuv_caps) { if (yuv_caps) {
caps = gst_caps_make_writable (caps); caps = gst_caps_make_writable (caps);
gst_caps_append (caps, gst_caps_copy (yuv_caps)); gst_caps_append (caps, gst_caps_copy (yuv_caps));
@ -394,8 +394,6 @@ gst_vaapiencode_destroy (GstVaapiEncode * encode)
encode->output_state = NULL; encode->output_state = NULL;
} }
gst_vaapi_encoder_replace (&encode->encoder, NULL); gst_vaapi_encoder_replace (&encode->encoder, NULL);
gst_caps_replace (&encode->sinkpad_caps, NULL);
gst_caps_replace (&encode->srcpad_caps, NULL);
return TRUE; return TRUE;
} }
@ -456,24 +454,17 @@ gst_vaapiencode_close (GstVideoEncoder * venc)
return TRUE; return TRUE;
} }
static inline gboolean
gst_vaapiencode_update_sink_caps (GstVaapiEncode * encode,
GstVideoCodecState * state)
{
gst_caps_replace (&encode->sinkpad_caps, state->caps);
return TRUE;
}
static gboolean static gboolean
set_codec_state (GstVaapiEncode * encode, GstVideoCodecState * state) set_codec_state (GstVaapiEncode * encode, GstVideoCodecState * state)
{ {
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (encode);
GstCaps *out_caps, *allowed_caps, *template_caps, *intersect; GstCaps *out_caps, *allowed_caps, *template_caps, *intersect;
g_return_val_if_fail (encode->encoder, FALSE); g_return_val_if_fail (encode->encoder, FALSE);
/* get peer caps for stream-format avc/bytestream, codec_data */ /* get peer caps for stream-format avc/bytestream, codec_data */
template_caps = gst_pad_get_pad_template_caps (encode->srcpad); template_caps = gst_pad_get_pad_template_caps (plugin->srcpad);
allowed_caps = gst_pad_get_allowed_caps (encode->srcpad); allowed_caps = gst_pad_get_allowed_caps (plugin->srcpad);
intersect = gst_caps_intersect (template_caps, allowed_caps); intersect = gst_caps_intersect (template_caps, allowed_caps);
gst_caps_unref (template_caps); gst_caps_unref (template_caps);
gst_caps_unref (allowed_caps); gst_caps_unref (allowed_caps);
@ -490,7 +481,6 @@ set_codec_state (GstVaapiEncode * encode, GstVideoCodecState * state)
} }
GST_DEBUG ("set srcpad caps to: %" GST_PTR_FORMAT, out_caps); GST_DEBUG ("set srcpad caps to: %" GST_PTR_FORMAT, out_caps);
gst_caps_replace (&encode->srcpad_caps, out_caps);
gst_caps_unref (out_caps); gst_caps_unref (out_caps);
return TRUE; return TRUE;
} }
@ -507,9 +497,6 @@ gst_vaapiencode_set_format (GstVideoEncoder * venc, GstVideoCodecState * state)
if (!set_codec_state (encode, state)) if (!set_codec_state (encode, state))
return FALSE; return FALSE;
if (!gst_vaapiencode_update_sink_caps (encode, state))
return FALSE;
if (!gst_vaapi_plugin_base_set_caps (GST_VAAPI_PLUGIN_BASE (encode), if (!gst_vaapi_plugin_base_set_caps (GST_VAAPI_PLUGIN_BASE (encode),
state->caps, NULL)) state->caps, NULL))
return FALSE; return FALSE;
@ -519,7 +506,7 @@ gst_vaapiencode_set_format (GstVideoEncoder * venc, GstVideoCodecState * state)
encode->input_state = gst_video_codec_state_ref (state); encode->input_state = gst_video_codec_state_ref (state);
encode->input_state_changed = TRUE; encode->input_state_changed = TRUE;
return gst_pad_start_task (encode->srcpad, return gst_pad_start_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode),
(GstTaskFunction) gst_vaapiencode_buffer_loop, encode, NULL); (GstTaskFunction) gst_vaapiencode_buffer_loop, encode, NULL);
} }
@ -603,7 +590,7 @@ gst_vaapiencode_finish (GstVideoEncoder * venc)
status = gst_vaapi_encoder_flush (encode->encoder); status = gst_vaapi_encoder_flush (encode->encoder);
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode); GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
gst_pad_stop_task (encode->srcpad); gst_pad_stop_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode));
GST_VIDEO_ENCODER_STREAM_LOCK (encode); GST_VIDEO_ENCODER_STREAM_LOCK (encode);
while (status == GST_VAAPI_ENCODER_STATUS_SUCCESS && ret == GST_FLOW_OK) while (status == GST_VAAPI_ENCODER_STATUS_SUCCESS && ret == GST_FLOW_OK)
@ -638,9 +625,6 @@ gst_vaapiencode_finalize (GObject * object)
encode->prop_values = NULL; encode->prop_values = NULL;
} }
encode->sinkpad = NULL;
encode->srcpad = NULL;
gst_vaapi_plugin_base_finalize (GST_VAAPI_PLUGIN_BASE (object)); gst_vaapi_plugin_base_finalize (GST_VAAPI_PLUGIN_BASE (object));
G_OBJECT_CLASS (gst_vaapiencode_parent_class)->finalize (object); G_OBJECT_CLASS (gst_vaapiencode_parent_class)->finalize (object);
} }
@ -648,19 +632,13 @@ gst_vaapiencode_finalize (GObject * object)
static void static void
gst_vaapiencode_init (GstVaapiEncode * encode) gst_vaapiencode_init (GstVaapiEncode * encode)
{ {
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (encode);
gst_vaapi_plugin_base_init (GST_VAAPI_PLUGIN_BASE (encode), GST_CAT_DEFAULT); gst_vaapi_plugin_base_init (GST_VAAPI_PLUGIN_BASE (encode), GST_CAT_DEFAULT);
/* sink pad */ gst_pad_set_query_function (plugin->sinkpad, gst_vaapiencode_query);
encode->sinkpad = GST_VIDEO_ENCODER_SINK_PAD (encode); gst_pad_set_query_function (plugin->srcpad, gst_vaapiencode_query);
encode->sinkpad_query = GST_PAD_QUERYFUNC (encode->sinkpad); gst_pad_use_fixed_caps (plugin->srcpad);
gst_pad_set_query_function (encode->sinkpad, gst_vaapiencode_query);
/* src pad */
encode->srcpad = GST_VIDEO_ENCODER_SRC_PAD (encode);
encode->srcpad_query = GST_PAD_QUERYFUNC (encode->srcpad);
gst_pad_set_query_function (encode->srcpad, gst_vaapiencode_query);
gst_pad_use_fixed_caps (encode->srcpad);
} }
static void static void

View file

@ -50,14 +50,6 @@ struct _GstVaapiEncode
/*< private >*/ /*< private >*/
GstVaapiPluginBase parent_instance; GstVaapiPluginBase parent_instance;
GstPad *sinkpad;
GstCaps *sinkpad_caps;
GstPadQueryFunction sinkpad_query;
GstPad *srcpad;
GstCaps *srcpad_caps;
GstPadQueryFunction srcpad_query;
GstVaapiEncoder *encoder; GstVaapiEncoder *encoder;
GstVideoCodecState *input_state; GstVideoCodecState *input_state;
gboolean input_state_changed; gboolean input_state_changed;

View file

@ -132,7 +132,8 @@ gst_vaapiencode_h264_get_caps (GstVaapiEncode * base_encode)
caps = gst_caps_from_string (GST_CODEC_CAPS); caps = gst_caps_from_string (GST_CODEC_CAPS);
/* Check whether "stream-format" is avcC mode */ /* Check whether "stream-format" is avcC mode */
allowed_caps = gst_pad_get_allowed_caps (base_encode->srcpad); allowed_caps =
gst_pad_get_allowed_caps (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode));
if (allowed_caps) { if (allowed_caps) {
const char *stream_format = NULL; const char *stream_format = NULL;
GstStructure *structure; GstStructure *structure;