vaapiencode: additional clean-ups.

Constify pointers wherever possible. Drop unused variables, and use
consistent variable names. Fix gst_vaapiencode_h264_allocate_buffer()
to correctly report errors, especially when in-place conversion from
bytestream to avcC format failed.
This commit is contained in:
Gwenole Beauchesne 2013-11-28 13:57:54 +01:00
parent d759fe34e6
commit 8116d8a50e
5 changed files with 46 additions and 48 deletions

View file

@ -162,7 +162,7 @@ gst_vaapiencode_query (GST_PAD_QUERY_FUNCTION_ARGS)
GST_VAAPIENCODE_CAST (gst_pad_get_parent_element (pad));
gboolean success;
GST_INFO_OBJECT(encode, "query type %s", GST_QUERY_TYPE_NAME(query));
GST_INFO_OBJECT (encode, "query type %s", GST_QUERY_TYPE_NAME (query));
if (gst_vaapi_reply_to_query (query, encode->display))
success = TRUE;
@ -236,23 +236,23 @@ static GstFlowReturn
gst_vaapiencode_push_frame (GstVaapiEncode * encode, gint64 ms_timeout)
{
GstVideoEncoder *const venc = GST_VIDEO_ENCODER_CAST (encode);
GstVaapiEncodeClass *klass = GST_VAAPIENCODE_GET_CLASS (encode);
GstVaapiEncodeClass *const klass = GST_VAAPIENCODE_GET_CLASS (encode);
GstVideoCodecFrame *out_frame = NULL;
GstVaapiCodedBufferProxy *coded_buf_proxy = NULL;
GstVaapiCodedBuffer *coded_buf;
GstVaapiEncoderStatus encode_status;
GstBuffer *output_buf;
GstVaapiEncoderStatus status;
GstBuffer *out_buffer;
GstFlowReturn ret;
g_return_val_if_fail (klass->allocate_buffer, GST_FLOW_ERROR);
encode_status = gst_vaapi_encoder_get_buffer (encode->encoder,
status = gst_vaapi_encoder_get_buffer (encode->encoder,
&out_frame, &coded_buf_proxy, ms_timeout);
if (encode_status == GST_VAAPI_ENCODER_STATUS_TIMEOUT)
if (status == GST_VAAPI_ENCODER_STATUS_TIMEOUT)
return GST_VAAPI_ENCODE_FLOW_TIMEOUT;
if (encode_status != GST_VAAPI_ENCODER_STATUS_SUCCESS) {
GST_ERROR ("get encoded buffer failed, status:%d", encode_status);
if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS) {
GST_ERROR ("get encoded buffer failed, status:%d", status);
ret = GST_FLOW_ERROR;
goto error;
}
@ -264,24 +264,22 @@ gst_vaapiencode_push_frame (GstVaapiEncode * encode, gint64 ms_timeout)
g_assert (coded_buf);
/* alloc buffer */
ret = klass->allocate_buffer (encode, coded_buf, &output_buf);
ret = klass->allocate_buffer (encode, coded_buf, &out_buffer);
if (ret != GST_FLOW_OK)
goto error;
out_frame->output_buffer = output_buf;
out_frame->output_buffer = out_buffer;
gst_vaapi_coded_buffer_proxy_replace (&coded_buf_proxy, NULL);
/* check out_caps, need lock first */
GST_VIDEO_ENCODER_STREAM_LOCK (encode);
if (!encode->out_caps_done) {
GstVaapiEncoderStatus encoder_status;
GstVideoCodecState *old_state, *new_state;
GstBuffer *codec_data;
encoder_status =
gst_vaapi_encoder_get_codec_data (encode->encoder, &codec_data);
if (encoder_status != GST_VAAPI_ENCODER_STATUS_SUCCESS) {
status = gst_vaapi_encoder_get_codec_data (encode->encoder, &codec_data);
if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS) {
ret = GST_VAAPI_ENCODE_FLOW_CODEC_DATA_ERROR;
goto error_unlock;
}
@ -313,7 +311,7 @@ gst_vaapiencode_push_frame (GstVaapiEncode * encode, gint64 ms_timeout)
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
GST_DEBUG ("output:%" GST_TIME_FORMAT ", size:%d",
GST_TIME_ARGS (out_frame->pts), gst_buffer_get_size (output_buf));
GST_TIME_ARGS (out_frame->pts), gst_buffer_get_size (out_buffer));
ret = gst_video_encoder_finish_frame (venc, out_frame);
out_frame = NULL;
@ -472,7 +470,7 @@ gst_vaapiencode_update_src_caps (GstVaapiEncode * encode,
GstVideoCodecState *out_state;
GstStructure *structure;
GstCaps *outcaps, *allowed_caps, *template_caps, *intersect;
GstVaapiEncoderStatus encoder_status;
GstVaapiEncoderStatus status;
GstBuffer *codec_data = NULL;
g_return_val_if_fail (encode->encoder, FALSE);
@ -498,9 +496,8 @@ gst_vaapiencode_update_src_caps (GstVaapiEncode * encode,
}
structure = gst_caps_get_structure (outcaps, 0);
if (!gst_structure_has_field (structure, "codec_data")) {
encoder_status =
gst_vaapi_encoder_get_codec_data (encode->encoder, &codec_data);
if (encoder_status == GST_VAAPI_ENCODER_STATUS_SUCCESS) {
status = gst_vaapi_encoder_get_codec_data (encode->encoder, &codec_data);
if (status == GST_VAAPI_ENCODER_STATUS_SUCCESS) {
if (codec_data) {
outcaps = gst_caps_make_writable (outcaps);
gst_caps_set_simple (outcaps,
@ -626,7 +623,6 @@ gst_vaapiencode_reset (GstVideoEncoder * venc, gboolean hard)
GST_DEBUG ("vaapiencode starting reset");
/* FIXME: compare sink_caps with encoder */
encode->is_running = FALSE;
encode->out_caps_done = FALSE;
return TRUE;
}
@ -782,7 +778,7 @@ gst_vaapiencode_handle_frame (GstVideoEncoder * venc,
{
GstVaapiEncode *const encode = GST_VAAPIENCODE_CAST (venc);
GstFlowReturn ret = GST_FLOW_OK;
GstVaapiEncoderStatus encoder_ret = GST_VAAPI_ENCODER_STATUS_SUCCESS;
GstVaapiEncoderStatus status = GST_VAAPI_ENCODER_STATUS_SUCCESS;
GstBuffer *buf;
gpointer user_data;
@ -801,11 +797,11 @@ gst_vaapiencode_handle_frame (GstVideoEncoder * venc,
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
/*encoding frames */
encoder_ret = gst_vaapi_encoder_put_frame (encode->encoder, frame);
status = gst_vaapi_encoder_put_frame (encode->encoder, frame);
GST_VIDEO_ENCODER_STREAM_LOCK (encode);
GST_VAAPI_ENCODER_CHECK_STATUS (GST_VAAPI_ENCODER_STATUS_SUCCESS <=
encoder_ret, GST_FLOW_ERROR, "gst_vaapiencoder_encode failed.");
status, GST_FLOW_ERROR, "gst_vaapiencoder_encode failed.");
end:
gst_video_codec_frame_unref (frame);

View file

@ -74,7 +74,6 @@ struct _GstVaapiEncode
GstVaapiRateControl rate_control;
guint32 bitrate; /* kbps */
guint32 is_running:1;
guint32 out_caps_done:1;
};

View file

@ -180,7 +180,7 @@ static guint8 *
_h264_byte_stream_next_nal (guint8 * buffer, guint32 len, guint32 * nal_size)
{
const guint8 *cur = buffer;
const guint8 *end = buffer + len;
const guint8 *const end = buffer + len;
guint8 *nal_start = NULL;
guint32 flag = 0xFFFFFFFF;
guint32 nal_start_len = 0;
@ -268,30 +268,35 @@ error:
}
static GstFlowReturn
gst_vaapiencode_h264_alloc_buffer (GstVaapiEncode * encode,
GstVaapiCodedBuffer * coded_buf, GstBuffer ** out_buf)
gst_vaapiencode_h264_allocate_buffer (GstVaapiEncode * encode,
GstVaapiCodedBuffer * coded_buf, GstBuffer ** out_buffer_ptr)
{
GstVaapiEncoderH264 *const encoder = GST_VAAPI_ENCODER_H264 (encode->encoder);
GstFlowReturn ret;
GstVaapiEncoderH264 *h264encoder;
g_return_val_if_fail (encode->encoder, GST_FLOW_ERROR);
g_return_val_if_fail (encoder != NULL, GST_FLOW_ERROR);
ret =
GST_VAAPIENCODE_CLASS (gst_vaapiencode_h264_parent_class)->allocate_buffer
(encode, coded_buf, out_buf);
(encode, coded_buf, out_buffer_ptr);
if (ret != GST_FLOW_OK)
return ret;
h264encoder = GST_VAAPI_ENCODER_H264 (encode->encoder);
if (!gst_vaapi_encoder_h264_is_avc (h264encoder))
return ret;
if (!gst_vaapi_encoder_h264_is_avc (encoder))
return GST_FLOW_OK;
/* Convert to avcC format */
if (!_h264_convert_byte_stream_to_avc (*out_buf)) {
GST_ERROR ("convert H.264 bytestream to avc buf failed.");
gst_buffer_replace (out_buf, NULL);
}
if (!_h264_convert_byte_stream_to_avc (*out_buffer_ptr))
goto error_convert_buffer;
return GST_FLOW_OK;
/* ERRORS */
error_convert_buffer:
{
GST_ERROR ("failed to convert from bytestream format to avcC format");
gst_buffer_replace (out_buffer_ptr, NULL);
return GST_FLOW_ERROR;
}
}
static void
@ -309,7 +314,7 @@ gst_vaapiencode_h264_class_init (GstVaapiEncodeH264Class * klass)
object_class->get_property = gst_vaapiencode_h264_get_property;
encode_class->create_encoder = gst_vaapiencode_h264_create_encoder;
encode_class->allocate_buffer = gst_vaapiencode_h264_alloc_buffer;
encode_class->allocate_buffer = gst_vaapiencode_h264_allocate_buffer;
gst_element_class_set_static_metadata (element_class,
"VA-API H.264 encoder",

View file

@ -53,8 +53,6 @@ struct _GstVaapiEncodeH264
/*< private >*/
GstVaapiEncode parent_instance;
GstVaapiProfile profile;
guint32 level;
guint32 intra_period;
guint32 init_qp;
guint32 min_qp;

View file

@ -82,14 +82,14 @@ enum
};
static void
gst_vaapiencode_mpeg2_init (GstVaapiEncodeMpeg2 * mpeg2_encode)
gst_vaapiencode_mpeg2_init (GstVaapiEncodeMpeg2 * encode)
{
GstVaapiEncode *const base_encode = GST_VAAPIENCODE_CAST (mpeg2_encode);
GstVaapiEncode *const base_encode = GST_VAAPIENCODE_CAST (encode);
base_encode->rate_control = GST_VAAPI_ENCODER_MPEG2_DEFAULT_RATE_CONTROL;
mpeg2_encode->quantizer = GST_VAAPI_ENCODER_MPEG2_DEFAULT_CQP;
mpeg2_encode->intra_period = GST_VAAPI_ENCODER_MPEG2_DEFAULT_GOP_SIZE;
mpeg2_encode->ip_period = GST_VAAPI_ENCODER_MPEG2_DEFAULT_MAX_BFRAMES;
encode->quantizer = GST_VAAPI_ENCODER_MPEG2_DEFAULT_CQP;
encode->intra_period = GST_VAAPI_ENCODER_MPEG2_DEFAULT_GOP_SIZE;
encode->ip_period = GST_VAAPI_ENCODER_MPEG2_DEFAULT_MAX_BFRAMES;
}
static void
@ -102,7 +102,7 @@ static void
gst_vaapiencode_mpeg2_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec)
{
GstVaapiEncodeMpeg2 *encode = GST_VAAPIENCODE_MPEG2_CAST (object);
GstVaapiEncodeMpeg2 *const encode = GST_VAAPIENCODE_MPEG2_CAST (object);
switch (prop_id) {
case PROP_QUANTIZER:
@ -124,7 +124,7 @@ static void
gst_vaapiencode_mpeg2_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec)
{
GstVaapiEncodeMpeg2 *encode = GST_VAAPIENCODE_MPEG2_CAST (object);
GstVaapiEncodeMpeg2 *const encode = GST_VAAPIENCODE_MPEG2_CAST (object);
switch (prop_id) {
case PROP_QUANTIZER:
@ -146,7 +146,7 @@ static GstVaapiEncoder *
gst_vaapiencode_mpeg2_create_encoder (GstVaapiEncode * base,
GstVaapiDisplay * display)
{
GstVaapiEncodeMpeg2 *encode = GST_VAAPIENCODE_MPEG2_CAST (base);
GstVaapiEncodeMpeg2 *const encode = GST_VAAPIENCODE_MPEG2_CAST (base);
GstVaapiEncode *const base_encode = GST_VAAPIENCODE_CAST (base);
GstVaapiEncoder *base_encoder;
GstVaapiEncoderMpeg2 *encoder;