1 #ifndef GST_VAAPI_ENCODER_H
2 #define GST_VAAPI_ENCODER_H
7 #include "gst/gstinfo.h"
8 #include "gst/gstbuffer.h"
9 #include "gst/vaapi/gstvaapidisplay.h"
10 #include "gst/vaapi/gstvaapicontext.h"
14 #define ENCODER_NO_ERROR 0
15 #define ENCODER_BUFFER_WAITING 1
16 #define ENCODER_BUFFER_EMPTY 2
19 #define ENCODER_MEM_ERR -1
20 #define ENCODER_DISPLAY_ERR -2
21 #define ENCODER_CONFIG_ERR -3
22 #define ENCODER_CONTEXT_ERR -3
23 #define ENCODER_STATE_ERR -4
24 #define ENCODER_ENC_RES_ERR -5
25 #define ENCODER_PICTURE_ERR -6
26 #define ENCODER_SURFACE_ERR -7
27 #define ENCODER_QUERY_STATUS_ERR -8
28 #define ENCODER_DATA_NOT_READY -9
29 #define ENCODER_DATA_ERR -10
30 #define ENCODER_PROFILE_ERR -11
31 #define ENCODER_PARAMETER_ERR -12
32 #define ENCODER_FUNC_PTR_ERR -13
35 #define ENCODER_LOG_ERROR(str_fmt,...) fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
36 #define ENCODER_LOG_WARNING(str_fmt,...) fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
37 #define ENCODER_LOG_DEBUG(str_fmt,...) fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
38 #define ENCODER_LOG_INFO(str_fmt,...) fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
40 #define ENCODER_LOG_ERROR(...) GST_ERROR( __VA_ARGS__)
41 #define ENCODER_LOG_WARNING(...) GST_WARNING( __VA_ARGS__)
42 #define ENCODER_LOG_DEBUG(...) GST_DEBUG( __VA_ARGS__)
43 #define ENCODER_LOG_INFO(...) GST_INFO( __VA_ARGS__)
46 #define VAAPI_UNUSED_ARG(arg) (void)(arg)
50 #define ENCODER_ASSERT(exp) assert(exp)
52 #define ENCODER_ASSERT(exp) g_assert(exp)
55 #define ENCODER_CHECK_STATUS(exp, err_num, err_reason, ...) \
57 ENCODER_ASSERT(FALSE); \
59 ENCODER_LOG_ERROR(err_reason, ## __VA_ARGS__); \
63 /* must have <gboolean is_locked = FALSE;> declared first*/
64 #define ENCODER_ACQUIRE_DISPLAY_LOCK(display) \
66 GST_VAAPI_DISPLAY_LOCK(display); \
70 #define ENCODER_RELEASE_DISPLAY_LOCK(display) \
72 GST_VAAPI_DISPLAY_UNLOCK(display); \
84 typedef int EncoderStatus;
85 typedef struct _GstVaapiEncoder GstVaapiEncoder;
86 typedef struct _GstVaapiEncoderPrivate GstVaapiEncoderPrivate;
87 typedef struct _GstVaapiEncoderClass GstVaapiEncoderClass;
89 #define GST_TYPE_VAAPI_ENCODER (gst_vaapi_encoder_get_type())
90 #define GST_IS_VAAPI_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VAAPI_ENCODER))
91 #define GST_IS_VAAPI_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VAAPI_ENCODER))
92 #define GST_VAAPI_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VAAPI_ENCODER, GstVaapiEncoderClass))
93 #define GST_VAAPI_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VAAPI_ENCODER, GstVaapiEncoder))
94 #define GST_VAAPI_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VAAPI_ENCODER, GstVaapiEncoderClass))
95 #define GST_VAAPI_ENCODER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),GST_TYPE_VAAPI_ENCODER, GstVaapiEncoderPrivate))
97 #define ENCODER_DISPLAY(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->display)
98 #define ENCODER_CONTEXT(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->context)
99 #define ENCODER_WIDTH(encoder) (((GstVaapiEncoder*)(encoder))->width)
100 #define ENCODER_HEIGHT(encoder) (((GstVaapiEncoder*)(encoder))->height)
101 #define ENCODER_FPS(encoder) (((GstVaapiEncoder*)(encoder))->frame_rate)
103 struct _GstVaapiEncoder {
111 struct _GstVaapiEncoderClass {
112 GObjectClass parent_class;
114 EncoderStatus (*initialize) (GstVaapiEncoder* encoder, GstVaapiDisplay *display); /* can be NULL */
115 EncoderStatus (*uninitialize) (GstVaapiEncoder* encoder, GstVaapiDisplay *display); /* can be NULL */
118 EncoderStatus (*open) (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
119 void* private_data, GstVaapiContext **context);
121 EncoderStatus (*close) (GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext *context);
122 /* coded_pics [out] */
123 EncoderStatus (*encode) (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
124 GstVaapiContext *context, GstBuffer *raw_pic, GList **coded_pics);
125 /* coded_pics [out] */
126 EncoderStatus (*flush) (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
127 GstVaapiContext *context, GList **coded_pics);
129 EncoderStatus (*get_codec_data)(GstVaapiEncoder* encoder, GstBuffer **codec_data); /* can be NULL */
132 struct _GstVaapiEncoderPrivate {
133 GstVaapiDisplay *display;
134 GstVaapiContext *context;
135 VAAPI_Encode_State state;
138 GType gst_vaapi_encoder_get_type(void);
140 /* set/get display */
141 gboolean gst_vaapi_encoder_set_display(GstVaapiEncoder* encoder, GstVaapiDisplay *display);
142 GstVaapiDisplay *gst_vaapi_encoder_get_display(GstVaapiEncoder* encoder);
145 GstVaapiContext *gst_vaapi_encoder_get_context(GstVaapiEncoder* encoder);
147 /* get encoding state */
148 VAAPI_Encode_State gst_vaapi_encoder_get_state(GstVaapiEncoder* encoder);
150 /* check/open display */
151 EncoderStatus gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder);
153 /* check/open context */
154 EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data);
156 /* encode one frame */
157 EncoderStatus gst_vaapi_encoder_encode(GstVaapiEncoder* encoder, GstBuffer *raw_pic, GList **coded_pics);
159 EncoderStatus gst_vaapi_encoder_get_codec_data(GstVaapiEncoder* encoder, GstBuffer **codec_data);
161 /* flush all frames */
162 EncoderStatus gst_vaapi_encoder_flush(GstVaapiEncoder* encoder, GList **coded_pics);
165 EncoderStatus gst_vaapi_encoder_close(GstVaapiEncoder* encoder);
168 EncoderStatus gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder);
170 static inline void gst_vaapi_encoder_unref (GstVaapiEncoder *encoder)
172 g_object_unref (encoder);
175 /* other functions */
176 char *vaapi_encoder_dump_bytes(const guint8 *buf, guint32 num);