From 4481c155b8726190dfb466dc0b9d2fb41d92ae12 Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Thu, 23 Jan 2014 15:13:06 +0100 Subject: [PATCH] encoder: notify the encoder of the submitted packed headers. Make sure to configure the encoder with the set of packed headers we intend to generate and submit. i.e. make selection of packed headers to submit more robust. --- gst-libs/gst/vaapi/gstvaapicontext.c | 22 +++++++++++++++++++++- gst-libs/gst/vaapi/gstvaapicontext.h | 2 ++ gst-libs/gst/vaapi/gstvaapiencoder.c | 26 ++++++++++++++++++-------- gst-libs/gst/vaapi/gstvaapiencoder_h264.c | 5 +++++ gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c | 5 +++++ gst-libs/gst/vaapi/gstvaapiencoder_priv.h | 3 +++ 6 files changed, 54 insertions(+), 9 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapicontext.c b/gst-libs/gst/vaapi/gstvaapicontext.c index 92a591e..96f1499 100644 --- a/gst-libs/gst/vaapi/gstvaapicontext.c +++ b/gst-libs/gst/vaapi/gstvaapicontext.c @@ -144,7 +144,7 @@ context_create (GstVaapiContext * context) const GstVaapiContextInfo *const cip = &context->info; GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (context); guint va_rate_control; - VAConfigAttrib attribs[2], *attrib = attribs; + VAConfigAttrib attribs[3], *attrib = attribs; VAContextID context_id; VASurfaceID surface_id; VAStatus status; @@ -204,6 +204,21 @@ context_create (GstVaapiContext * context) } attrib->value = va_rate_control; attrib++; + + /* Packed headers */ + if (config->packed_headers) { + attrib->type = VAConfigAttribEncPackedHeaders; + if (!gst_vaapi_context_get_attribute (context, attrib->type, &value)) + goto cleanup; + + if ((value & config->packed_headers) != config->packed_headers) { + GST_ERROR ("unsupported packed headers 0x%08x", + config->packed_headers & ~(value & config->packed_headers)); + goto cleanup; + } + attrib->value = config->packed_headers; + attrib++; + } break; } default: @@ -250,6 +265,11 @@ context_update_config_encoder (GstVaapiContext * context, config->rc_mode = new_config->rc_mode; config_changed = TRUE; } + + if (config->packed_headers != new_config->packed_headers) { + config->packed_headers = new_config->packed_headers; + config_changed = TRUE; + } return config_changed; } diff --git a/gst-libs/gst/vaapi/gstvaapicontext.h b/gst-libs/gst/vaapi/gstvaapicontext.h index 680dc3e..24ba697 100644 --- a/gst-libs/gst/vaapi/gstvaapicontext.h +++ b/gst-libs/gst/vaapi/gstvaapicontext.h @@ -59,12 +59,14 @@ typedef enum { /** * GstVaapiConfigInfoEncoder: * @rc_mode: rate-control mode (#GstVaapiRateControl). + * @packed_headers: notify encoder that packed headers are submitted (mask). * * Extra configuration for encoding. */ struct _GstVaapiConfigInfoEncoder { GstVaapiRateControl rc_mode; + guint packed_headers; }; /** diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c index 550e3fa..89eb579 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder.c @@ -534,14 +534,24 @@ get_config_attribute (GstVaapiEncoder * encoder, VAConfigAttribType type, return TRUE; } -/* Determines the set of required packed headers */ -static void -ensure_packed_headers (GstVaapiEncoder * encoder) +/* Determines the set of supported packed headers */ +static guint +get_packed_headers (GstVaapiEncoder * encoder) { - if (!gst_vaapi_context_get_attribute (encoder->context, - VAConfigAttribEncPackedHeaders, &encoder->packed_headers)) - encoder->packed_headers = 0; - GST_INFO ("packed headers mask: 0x%08x", encoder->packed_headers); + const GstVaapiEncoderClassData *const cdata = + GST_VAAPI_ENCODER_GET_CLASS (encoder)->class_data; + guint value; + + if (encoder->got_packed_headers) + return encoder->packed_headers; + + if (!get_config_attribute (encoder, VAConfigAttribEncPackedHeaders, &value)) + value = 0; + GST_INFO ("supported packed headers: 0x%08x", value); + + encoder->got_packed_headers = TRUE; + encoder->packed_headers = cdata->packed_headers & value; + return encoder->packed_headers; } /* Updates video context */ @@ -560,6 +570,7 @@ set_context_info (GstVaapiEncoder * encoder) memset (config, 0, sizeof (*config)); config->rc_mode = GST_VAAPI_ENCODER_RATE_CONTROL (encoder); + config->packed_headers = get_packed_headers (encoder); } /* Ensures the underlying VA context for encoding is created */ @@ -602,7 +613,6 @@ gst_vaapi_encoder_reconfigure_internal (GstVaapiEncoder * encoder) if (!gst_vaapi_encoder_ensure_context (encoder)) goto error_reset_context; - ensure_packed_headers (encoder); codedbuf_size = encoder->codedbuf_pool ? gst_vaapi_coded_buffer_pool_get_buffer_size (GST_VAAPI_CODED_BUFFER_POOL diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c index 22845e6..9f90ea2 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c @@ -63,6 +63,11 @@ (GST_VAAPI_ENCODER_TUNE_MASK (NONE) | \ GST_VAAPI_ENCODER_TUNE_MASK (HIGH_COMPRESSION)) +/* Supported set of VA packed headers, within this implementation */ +#define SUPPORTED_PACKED_HEADERS \ + (VA_ENC_PACKED_HEADER_SEQUENCE | \ + VA_ENC_PACKED_HEADER_PICTURE) + #define GST_VAAPI_ENCODER_H264_NAL_REF_IDC_NONE 0 #define GST_VAAPI_ENCODER_H264_NAL_REF_IDC_LOW 1 #define GST_VAAPI_ENCODER_H264_NAL_REF_IDC_MEDIUM 2 diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c index d9938cb..4536365 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c @@ -50,6 +50,11 @@ #define SUPPORTED_TUNE_OPTIONS \ (GST_VAAPI_ENCODER_TUNE_MASK (NONE)) +/* Supported set of VA packed headers, within this implementation */ +#define SUPPORTED_PACKED_HEADERS \ + (VA_ENC_PACKED_HEADER_SEQUENCE | \ + VA_ENC_PACKED_HEADER_PICTURE) + static gboolean gst_bit_writer_write_sps (GstBitWriter * bitwriter, const VAEncSequenceParameterBufferMPEG2 * seq_param); diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_priv.h b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h index 96b0d1e..5cf748a 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_priv.h +++ b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h @@ -225,6 +225,7 @@ struct _GstVaapiEncoder GAsyncQueue *codedbuf_queue; guint32 num_codedbuf_queued; + guint got_packed_headers:1; guint got_rate_control_mask:1; }; @@ -232,6 +233,7 @@ struct _GstVaapiEncoderClassData { /*< private >*/ GstVaapiCodec codec; + guint32 packed_headers; GType (*rate_control_get_type)(void); GstVaapiRateControl default_rate_control; @@ -255,6 +257,7 @@ struct _GstVaapiEncoderClassData \ static const GstVaapiEncoderClassData g_class_data = { \ .codec = G_PASTE (GST_VAAPI_CODEC_, CODEC), \ + .packed_headers = SUPPORTED_PACKED_HEADERS, \ .rate_control_get_type = \ G_PASTE (G_PASTE (gst_vaapi_rate_control_, CODEC), _get_type), \ .default_rate_control = DEFAULT_RATECONTROL, \ -- 2.7.4