}
/* ------------------------------------------------------------------------- */
+/* --- Quantization Matrices --- */
+/* ------------------------------------------------------------------------- */
+
+GST_VAAPI_CODEC_DEFINE_TYPE (GstVaapiEncQMatrix, gst_vaapi_enc_q_matrix);
+
+void
+gst_vaapi_enc_q_matrix_destroy (GstVaapiEncQMatrix * q_matrix)
+{
+ vaapi_destroy_buffer (GET_VA_DISPLAY (q_matrix), &q_matrix->param_id);
+ q_matrix->param = NULL;
+}
+
+gboolean
+gst_vaapi_enc_q_matrix_create (GstVaapiEncQMatrix * q_matrix,
+ const GstVaapiCodecObjectConstructorArgs * args)
+{
+ q_matrix->param_id = VA_INVALID_ID;
+ return vaapi_create_buffer (GET_VA_DISPLAY (q_matrix),
+ GET_VA_CONTEXT (q_matrix), VAQMatrixBufferType,
+ args->param_size, args->param, &q_matrix->param_id, &q_matrix->param);
+}
+
+GstVaapiEncQMatrix *
+gst_vaapi_enc_q_matrix_new (GstVaapiEncoder * encoder,
+ gconstpointer param, guint param_size)
+{
+ GstVaapiCodecObject *object;
+
+ object = gst_vaapi_codec_object_new (&GstVaapiEncQMatrixClass,
+ GST_VAAPI_CODEC_BASE (encoder), param, param_size, NULL, 0, 0);
+ if (!object)
+ return NULL;
+ return GST_VAAPI_ENC_Q_MATRIX_CAST (object);
+}
+
+/* ------------------------------------------------------------------------- */
+/* --- JPEG Huffman Tables --- */
+/* ------------------------------------------------------------------------- */
+
+#if USE_JPEG_ENCODER
+GST_VAAPI_CODEC_DEFINE_TYPE (GstVaapiEncHuffmanTable, gst_vaapi_enc_huffman_table);
+
+void
+gst_vaapi_enc_huffman_table_destroy (GstVaapiEncHuffmanTable * huf_table)
+{
+ vaapi_destroy_buffer (GET_VA_DISPLAY (huf_table), &huf_table->param_id);
+ huf_table->param = NULL;
+}
+
+gboolean
+gst_vaapi_enc_huffman_table_create (GstVaapiEncHuffmanTable * huf_table,
+ const GstVaapiCodecObjectConstructorArgs * args)
+{
+ huf_table->param_id = VA_INVALID_ID;
+ return vaapi_create_buffer (GET_VA_DISPLAY (huf_table),
+ GET_VA_CONTEXT (huf_table), VAHuffmanTableBufferType, args->param_size,
+ args->param, &huf_table->param_id, (void **) &huf_table->param);
+}
+
+GstVaapiEncHuffmanTable *
+gst_vaapi_enc_huffman_table_new (GstVaapiEncoder * encoder,
+ guint8 * data, guint data_size)
+{
+ GstVaapiCodecObject *object;
+
+ object = gst_vaapi_codec_object_new (&GstVaapiEncHuffmanTableClass,
+ GST_VAAPI_CODEC_BASE (encoder), data, data_size, NULL, 0, 0);
+ if (!object)
+ return NULL;
+ return GST_VAAPI_ENC_HUFFMAN_TABLE_CAST (object);
+}
+#endif
+
+/* ------------------------------------------------------------------------- */
/* --- Encoder Picture --- */
/* ------------------------------------------------------------------------- */
g_ptr_array_unref (picture->slices);
picture->slices = NULL;
}
+
+ gst_vaapi_codec_object_replace (&picture->q_matrix, NULL);
+ gst_vaapi_codec_object_replace (&picture->huf_table, NULL);
+
gst_vaapi_codec_object_replace (&picture->sequence, NULL);
gst_vaapi_surface_proxy_replace (&picture->proxy, NULL);
gst_vaapi_enc_picture_encode (GstVaapiEncPicture * picture)
{
GstVaapiEncSequence *sequence;
+ GstVaapiEncQMatrix *q_matrix;
+ GstVaapiEncHuffmanTable *huf_table;
VADisplay va_display;
VAContextID va_context;
VAStatus status;
&sequence->param_id, &sequence->param))
return FALSE;
+ /* Submit Quantization matrix */
+ q_matrix = picture->q_matrix;
+ if (q_matrix && !do_encode (va_display, va_context,
+ &q_matrix->param_id, &q_matrix->param))
+ return FALSE;
+
+ /* Submit huffman table */
+ huf_table = picture->huf_table;
+ if (huf_table && !do_encode (va_display, va_context,
+ &huf_table->param_id, (void **) &huf_table->param))
+ return FALSE;
+
/* Submit Packed Headers */
for (i = 0; i < picture->packed_headers->len; i++) {
GstVaapiEncPackedHeader *const header =
typedef struct _GstVaapiEncSequence GstVaapiEncSequence;
typedef struct _GstVaapiEncMiscParam GstVaapiEncMiscParam;
typedef struct _GstVaapiEncSlice GstVaapiEncSlice;
+typedef struct _GstVaapiEncQMatrix GstVaapiEncQMatrix;
+typedef struct _GstVaapiEncHuffmanTable GstVaapiEncHuffmanTable;
typedef struct _GstVaapiCodedBuffer GstVaapiCodedBuffer;
typedef struct _GstVaapiEncPackedHeader GstVaapiEncPackedHeader;
VAEncMiscParameterType type, guint data_size);
/* ------------------------------------------------------------------------- */
+/* --- Quantization Matrices --- */
+/* ------------------------------------------------------------------------- */
+
+#define GST_VAAPI_ENC_Q_MATRIX_CAST(obj) \
+ ((GstVaapiEncQMatrix *) (obj))
+
+/**
+ * GstVaapiEncQMatrix:
+ *
+ * A #GstVaapiCodecObject holding a quantization matrix parameter.
+ */
+struct _GstVaapiEncQMatrix
+{
+ /*< private >*/
+ GstVaapiCodecObject parent_instance;
+ VABufferID param_id;
+
+ /*< public >*/
+ gpointer param;
+};
+
+G_GNUC_INTERNAL
+GstVaapiEncQMatrix *
+gst_vaapi_enc_q_matrix_new (GstVaapiEncoder * encoder, gconstpointer param,
+ guint param_size);
+
+/* ------------------------------------------------------------------------- */
+/* --- JPEG Huffman Tables --- */
+/* ------------------------------------------------------------------------- */
+
+#define GST_VAAPI_ENC_HUFFMAN_TABLE_CAST(obj) \
+ ((GstVaapiEncHuffmanTable *) (obj))
+
+/**
+ * GstVaapiEncHuffmanTable:
+ *
+ * A #GstVaapiCodecObject holding huffman table.
+ */
+struct _GstVaapiEncHuffmanTable
+{
+ /*< private >*/
+ GstVaapiCodecObject parent_instance;
+ VABufferID param_id;
+
+ /*< public >*/
+ gpointer param;
+};
+
+G_GNUC_INTERNAL
+GstVaapiEncHuffmanTable *
+gst_vaapi_enc_huffman_table_new (GstVaapiEncoder * encoder, guint8 * data,
+ guint data_size);
+
+/* ------------------------------------------------------------------------- */
/* --- Encoder Picture --- */
/* ------------------------------------------------------------------------- */
VASurfaceID surface_id;
gpointer param;
GPtrArray *slices;
+ GstVaapiEncQMatrix *q_matrix;
+ GstVaapiEncHuffmanTable *huf_table;
GstClockTime pts;
guint frame_num;
guint poc;
gst_vaapi_enc_slice_new (GST_VAAPI_ENCODER_CAST (encoder), \
NULL, sizeof(G_PASTE (VAEncSliceParameterBuffer, codec)))
+/* GstVaapiEncQuantMatrix */
+#define GST_VAAPI_ENC_Q_MATRIX_NEW(codec, encoder) \
+ gst_vaapi_enc_q_matrix_new (GST_VAAPI_ENCODER_CAST (encoder), \
+ NULL, sizeof (G_PASTE (VAQMatrixBuffer, codec)))
+
+/* GstVaapiEncHuffmanTable */
+#define GST_VAAPI_ENC_HUFFMAN_TABLE_NEW(codec, encoder) \
+ gst_vaapi_enc_huffman_table_new (GST_VAAPI_ENCODER_CAST (encoder), \
+ NULL, sizeof (G_PASTE (VAHuffmanTableBuffer, codec)))
+
G_END_DECLS
#endif /* GST_VAAPI_ENCODER_OBJECTS_H */