encoder(h264,h263,mpeg4): changed styles, names
[vaapi:windyuan-gstreamer-vaapi.git] / gst-libs / gst / vaapi / gstvaapiencoder.h
1 /*
2  *  gstvaapiencoder.h - VA-API encoder interface
3  *
4  *  Copyright (C) 2011 Intel Corporation
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public License
8  *  as published by the Free Software Foundation; either version 2.1
9  *  of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free
18  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  *  Boston, MA 02110-1301 USA
20  */
21
22 #ifndef GST_VAAPI_ENCODER_H
23 #define GST_VAAPI_ENCODER_H
24
25 #include <stdio.h>
26 #include <stdint.h>
27
28 #include "gst/gstinfo.h"
29 #include "gst/gstbuffer.h"
30 #include "gst/vaapi/gstvaapidisplay.h"
31 #include "gst/vaapi/gstvaapicontext.h"
32
33 G_BEGIN_DECLS
34
35 #define ENCODER_NO_ERROR       0
36 #define ENCODER_NO_DATA        1
37 #define ENCODER_BUFFER_WAITING 2
38 #define ENCODER_BUFFER_EMPTY   3
39
40
41 #define ENCODER_MEM_ERR       -1
42 #define ENCODER_DISPLAY_ERR   -2
43 #define ENCODER_CONFIG_ERR    -3
44 #define ENCODER_CONTEXT_ERR    -3
45 #define ENCODER_STATE_ERR     -4
46 #define ENCODER_ENC_RES_ERR   -5
47 #define ENCODER_PICTURE_ERR   -6
48 #define ENCODER_SURFACE_ERR   -7
49 #define ENCODER_QUERY_STATUS_ERR -8
50 #define ENCODER_DATA_NOT_READY   -9
51 #define ENCODER_DATA_ERR      -10
52 #define ENCODER_PROFILE_ERR   -11
53 #define ENCODER_PARAMETER_ERR -12
54 #define ENCODER_FUNC_PTR_ERR  -13
55
56 #ifdef DEBUG
57   #define ENCODER_LOG_ERROR(str_fmt,...)    fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
58   #define ENCODER_LOG_WARNING(str_fmt,...)  fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
59   #define ENCODER_LOG_DEBUG(str_fmt,...)    fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
60   #define ENCODER_LOG_INFO(str_fmt,...)     fprintf(stdout, str_fmt "\n", ## __VA_ARGS__)
61 #else
62   #define ENCODER_LOG_ERROR(...)   GST_ERROR( __VA_ARGS__)
63   #define ENCODER_LOG_WARNING(...) GST_WARNING( __VA_ARGS__)
64   #define ENCODER_LOG_DEBUG(...)   GST_DEBUG( __VA_ARGS__)
65   #define ENCODER_LOG_INFO(...)    GST_INFO( __VA_ARGS__)
66 #endif
67
68 #define VAAPI_UNUSED_ARG(arg) (void)(arg)
69
70 #ifdef DEBUG
71 #include <assert.h>
72 #define ENCODER_ASSERT(exp) assert(exp)
73 #else
74 #define ENCODER_ASSERT(exp) g_assert(exp)
75 #endif
76
77 #define ENCODER_CHECK_STATUS(exp, err_num, err_reason, ...)  \
78   if (!(exp)) {                                   \
79     ENCODER_ASSERT(FALSE);                         \
80     ret = err_num;                                 \
81     ENCODER_LOG_ERROR(err_reason, ## __VA_ARGS__); \
82     goto end;                                      \
83   }
84
85 /* must have <gboolean is_locked = FALSE;> declared first*/
86 #define ENCODER_ACQUIRE_DISPLAY_LOCK(display)    \
87      if (!is_locked) {                     \
88       GST_VAAPI_DISPLAY_LOCK(display);     \
89       is_locked = TRUE;                    \
90      }
91
92 #define ENCODER_RELEASE_DISPLAY_LOCK(display)    \
93     if (is_locked) {                       \
94      GST_VAAPI_DISPLAY_UNLOCK(display);    \
95      is_locked = FALSE;                    \
96     }
97
98
99 typedef enum {
100   VAAPI_ENC_NULL,
101   VAAPI_ENC_INIT,
102   VAAPI_ENC_OPENED,
103   VAAPI_ENC_ENCODING,
104 } VAAPI_Encode_State;
105
106 typedef int                                  EncoderStatus;
107 typedef struct _GstVaapiEncoder              GstVaapiEncoder;
108 typedef struct _GstVaapiEncoderPrivate       GstVaapiEncoderPrivate;
109 typedef struct _GstVaapiEncoderClass         GstVaapiEncoderClass;
110
111 #define GST_TYPE_VAAPI_ENCODER             (gst_vaapi_encoder_get_type())
112 #define GST_IS_VAAPI_ENCODER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VAAPI_ENCODER))
113 #define GST_IS_VAAPI_ENCODER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VAAPI_ENCODER))
114 #define GST_VAAPI_ENCODER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VAAPI_ENCODER,  GstVaapiEncoderClass))
115 #define GST_VAAPI_ENCODER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VAAPI_ENCODER, GstVaapiEncoder))
116 #define GST_VAAPI_ENCODER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VAAPI_ENCODER,  GstVaapiEncoderClass))
117 #define GST_VAAPI_ENCODER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),GST_TYPE_VAAPI_ENCODER,  GstVaapiEncoderPrivate))
118
119 #define ENCODER_DISPLAY(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->display)
120 #define ENCODER_CONTEXT(encoder) (GST_VAAPI_ENCODER_GET_PRIVATE(encoder)->context)
121 #define ENCODER_WIDTH(encoder)   (((GstVaapiEncoder*)(encoder))->width)
122 #define ENCODER_HEIGHT(encoder)  (((GstVaapiEncoder*)(encoder))->height)
123 #define ENCODER_FPS(encoder)     (((GstVaapiEncoder*)(encoder))->frame_rate)
124
125 struct _GstVaapiEncoder {
126   GObject parent;
127
128   guint32 width;
129   guint32 height;
130   guint32 frame_rate;
131 };
132
133 struct _GstVaapiEncoderClass {
134   GObjectClass parent_class;
135
136   EncoderStatus (*initialize)    (GstVaapiEncoder* encoder, GstVaapiDisplay *display);  /* can be NULL */
137   EncoderStatus (*uninitialize)  (GstVaapiEncoder* encoder, GstVaapiDisplay *display);  /* can be NULL */
138
139   /* context [out] */
140   EncoderStatus (*open)          (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
141                                   void* private_data, GstVaapiContext **context);
142
143   EncoderStatus (*close)         (GstVaapiEncoder* encoder, GstVaapiDisplay *display, GstVaapiContext *context);
144   /* coded_pics [out] */
145   EncoderStatus (*encode)        (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
146                                   GstVaapiContext *context, GstBuffer *raw_pic, GList **coded_pics);
147   /* coded_pics [out] */
148   EncoderStatus (*flush)         (GstVaapiEncoder* encoder, GstVaapiDisplay *display,
149                                   GstVaapiContext *context, GList **coded_pics);
150
151   EncoderStatus (*get_codec_data)(GstVaapiEncoder* encoder, GstBuffer **codec_data); /* can be NULL */
152 };
153
154 struct _GstVaapiEncoderPrivate {
155   GstVaapiDisplay     *display;
156   GstVaapiContext     *context;
157   VAAPI_Encode_State   state;
158 };
159
160 GType         gst_vaapi_encoder_get_type(void);
161
162 /* set/get display */
163 gboolean      gst_vaapi_encoder_set_display(GstVaapiEncoder* encoder, GstVaapiDisplay *display);
164 GstVaapiDisplay   *gst_vaapi_encoder_get_display(GstVaapiEncoder* encoder);
165
166 /* get context */
167 GstVaapiContext   *gst_vaapi_encoder_get_context(GstVaapiEncoder* encoder);
168
169 /* get encoding state */
170 VAAPI_Encode_State gst_vaapi_encoder_get_state(GstVaapiEncoder* encoder);
171
172 /* check/open display */
173 EncoderStatus gst_vaapi_encoder_initialize(GstVaapiEncoder* encoder);
174
175 /* check/open context */
176 EncoderStatus gst_vaapi_encoder_open(GstVaapiEncoder* encoder, void* private_data);
177
178 /* encode one frame */
179 EncoderStatus gst_vaapi_encoder_encode(GstVaapiEncoder* encoder, GstBuffer *raw_pic, GList **coded_pics);
180
181 EncoderStatus gst_vaapi_encoder_get_codec_data(GstVaapiEncoder* encoder, GstBuffer **codec_data);
182
183 /* flush all frames */
184 EncoderStatus gst_vaapi_encoder_flush(GstVaapiEncoder* encoder, GList **coded_pics);
185
186 /* close context */
187 EncoderStatus gst_vaapi_encoder_close(GstVaapiEncoder* encoder);
188
189 /* close display */
190 EncoderStatus gst_vaapi_encoder_uninitialize(GstVaapiEncoder* encoder);
191
192 static inline void gst_vaapi_encoder_unref (GstVaapiEncoder *encoder)
193 {
194   g_object_unref (encoder);
195 }
196
197 /* other functions */
198 char *vaapi_encoder_dump_bytes(const guint8 *buf, guint32 num);
199
200
201 G_END_DECLS
202
203 #endif
204