modify to create caps
[platform/core/api/mediacodec.git] / include / media_codec_port.h
1 /*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef __TIZEN_MEDIA_CODEC_PORT_H__
18 #define __TIZEN_MEDIA_CODEC_PORT_H__
19
20 #include <tizen.h>
21 #include <glib.h>
22 #include <dlfcn.h>
23 #include <gst/gst.h>
24
25 #include <media_codec.h>
26 #include <media_codec_queue.h>
27 #include <media_codec_bitstream.h>
28 #include <media_codec_spec_emul.h>
29 #include <media_codec_ini.h>
30
31
32 /*===========================================================================================
33 |                                                                                                                                                                                      |
34 |  GLOBAL DEFINITIONS AND DECLARATIONS FOR MODULE                                                                                      |
35 |                                                                                                                                                                                      |
36 ========================================================================================== */
37
38 /*---------------------------------------------------------------------------
39 |    GLOBAL #defines:                                                                                                                    |
40 ---------------------------------------------------------------------------*/
41 #define CHECK_BIT(x, y) (((x) >> (y)) & 0x01)
42 #define GET_IS_ENCODER(x) CHECK_BIT(x, 0)
43 #define GET_IS_DECODER(x) CHECK_BIT(x, 1)
44 #define GET_IS_HW(x) CHECK_BIT(x, 2)
45 #define GET_IS_SW(x) CHECK_BIT(x, 3)
46 /*
47 #define GET_IS_OMX(x) CHECK_BIT(x, 4)
48 #define GET_IS_GEN(x) CHECK_BIT(x, 5)
49 */
50
51 #if 1
52 #define MEDIACODEC_FENTER();
53 #define MEDIACODEC_FLEAVE();
54 #else
55 #define MEDIACODEC_FENTER();    LOGW("%s Enter", __FUNCTION__);
56 #define MEDIACODEC_FLEAVE();    LOGW("%s Exit", __FUNCTION__);
57 #endif
58
59 /*---------------------------------------------------------------------------
60 |    GLOBAL CONSTANT DEFINITIONS:                                                                                          |
61 ---------------------------------------------------------------------------*/
62 /**
63  * @brief Enumerations of media codec port's retrun value
64  */
65 typedef enum {
66         MC_ERROR_NONE               =    0,
67         MC_ERROR                    =   -1,     /**< codec happens error */
68         MC_MEMORY_ERROR             =   -2,     /**< codec memory is not enough */
69         MC_PARAM_ERROR              =   -3,     /**< codec parameter is error */
70         MC_INVALID_ARG              =   -4,     /** < codec has invalid arguments */
71         MC_PERMISSION_DENIED        =   -5,
72         MC_INVALID_STATUS           =   -6,     /**< codec works at invalid status */
73         MC_NOT_SUPPORTED            =   -7,     /**< codec can't support this specific video format */
74         MC_INVALID_IN_BUF           =   -8,
75         MC_INVALID_OUT_BUF          =   -9,
76         MC_INTERNAL_ERROR           =   -10,
77         MC_HW_ERROR                 =   -11,    /**< codec happens hardware error */
78         MC_NOT_INITIALIZED          =   -12,
79         MC_INVALID_STREAM           =   -13,
80         MC_CODEC_NOT_FOUND          =   -14,
81         MC_ERROR_DECODE             =   -15,
82         MC_OUTPUT_BUFFER_EMPTY      =   -16,
83         MC_OUTPUT_BUFFER_OVERFLOW   =   -17,    /**< codec output buffer is overflow */
84         MC_MEMORY_ALLOCED           =   -18,    /**< codec has got memory and can decode one frame */
85         MC_COURRPTED_INI            =   -19,
86         MC_OUT_OF_MEMORY                        =       -20,    /**< when memory is not allocated */
87 } mc_ret_e;
88
89 /*---------------------------------------------------------------------------
90 |    GLOBAL DATA TYPE DEFINITIONS:                                                                                         |
91 ---------------------------------------------------------------------------*/
92 /**
93  * @brief Called when the dequeue input buffer done
94  * @details It will be invoked when mediacodec has released dequeue buffer.
95  * @param[in]   user_data  The user data passed from the callback registration function
96  * @pre It will be invoked when dequeue buffer process completed if you register this callback using mediacodec_set_dequeue_input_buffer_cb().
97  * @see mediacodec_set_dequeue_input_buffer_cb()
98  * @see mediacodec_unset_dequeue_input_buffer_cb()
99  */
100
101
102 typedef struct _mc_decoder_info_t mc_decoder_info_t;
103 typedef struct _mc_encoder_info_t mc_encoder_info_t;
104 typedef struct _mc_handle_t mc_handle_t;
105
106 typedef void (*mc_dequeue_input_buffer_cb)(media_packet_h pkt, void *user_data);
107 typedef void (*mc_empty_buffer_cb)(media_packet_h pkt, void *user_data);
108 typedef void (*mc_fill_buffer_cb)(media_packet_h pkt, void *user_data);
109 typedef void (*mc_error_cb)(mediacodec_error_e error, void *user_data);
110 typedef void (*mc_eos_cb)(void *user_data);
111 typedef void (*mc_buffer_status_cb)(mediacodec_status_e status, void *user_data);
112 typedef void (*mc_supported_codec_cb)(mediacodec_codec_type_e codec_type, void *user_data);
113
114 typedef enum {
115         _MEDIACODEC_EVENT_TYPE_COMPLETE,
116         _MEDIACODEC_EVENT_TYPE_EMPTYBUFFER,
117         _MEDIACODEC_EVENT_TYPE_FILLBUFFER,
118         _MEDIACODEC_EVENT_TYPE_ERROR,
119         _MEDIACODEC_EVENT_TYPE_EOS,
120         _MEDIACODEC_EVENT_TYPE_BUFFER_STATUS,
121         _MEDIACODEC_EVENT_TYPE_INTERNAL_FILLBUFFER,
122         _MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC,
123         _MEDIACODEC_EVENT_TYPE_NUM
124 } _mediacodec_event_e;
125
126
127 typedef enum _mc_codec_port_type_e {
128         CODEC_PORT_TYPE_GENERAL,
129         CODEC_PORT_TYPE_OMX,
130         CODEC_PORT_TYPE_GST,
131         CODEC_PORT_TYPE_MAX,
132 } mc_codec_port_type_e;
133
134 typedef enum _mc_vendor_e {
135         MC_VENDOR_DEFAULT,
136         MC_VENDOR_SLSI_SEC,
137         MC_VENDOR_SLSI_EXYNOS,
138         MC_VENDOR_QCT,
139         MC_VENDOR_SPRD
140 } mc_vendor_e;
141
142 struct _mc_decoder_info_t {
143         int width;
144         int height;
145         int actwidth;
146         int actheight;
147
148         int samplerate;
149         int channel;
150         int bit;
151 };
152
153 struct _mc_encoder_info_t {
154         int width;
155         int height;
156         int bitrate;
157         int format;
158         int fps;
159         int qp_min;
160         int qp_max;
161         int vbvbuffer_size;
162         int level;
163         int profile;
164
165         int samplerate;
166         int channel;
167         int bit;
168 };
169
170 /* Codec Private data */
171 struct _mc_handle_t {
172         int state;                                  /**<  mc current state */
173         bool is_encoder;
174         bool is_video;
175         bool is_hw;
176         bool is_prepared;
177
178         GList *supported_codecs;
179         mediacodec_port_type_e port_type;
180         mediacodec_codec_type_e codec_id;
181         mc_vendor_e vendor;
182
183         void *ports[2];
184         void *core;
185
186         union {
187                 mc_decoder_info_t decoder;
188                 mc_encoder_info_t encoder;
189         } info;
190
191         /* for process done cb */
192         void* user_cb[_MEDIACODEC_EVENT_TYPE_NUM];
193         void* user_data[_MEDIACODEC_EVENT_TYPE_NUM];
194
195         mc_codec_map_t encoder_map[MEDIA_CODEC_MAX_CODEC_TYPE];
196         mc_codec_map_t decoder_map[MEDIA_CODEC_MAX_CODEC_TYPE];
197
198         int num_supported_codecs;
199         int num_supported_decoder;
200         int num_supported_encoder;
201
202         mc_ini_t ini;
203 };
204
205 /*===========================================================================================
206 |                                                                                                                                                                                      |
207 |  GLOBAL FUNCTION PROTOTYPES                                                                                                                            |
208 |                                                                                                                                                                                      |
209 ========================================================================================== */
210
211 #ifdef __cplusplus
212 extern "C" {
213 #endif
214
215 int mc_create(MMHandleType *mediacodec);
216 int mc_destroy(MMHandleType mediacodec);
217
218 int mc_set_codec(MMHandleType mediacodec, mediacodec_codec_type_e codec_id, int flags);
219
220 int mc_set_vdec_info(MMHandleType mediacodec, int width, int height);
221 int mc_set_venc_info(MMHandleType mediacodec, int width, int height, int fps, int target_bits);
222
223 int mc_set_adec_info(MMHandleType mediacodec, int samplerate, int channel, int bit);
224 int mc_set_aenc_info(MMHandleType mediacodec, int samplerate, int channel, int bit,  int bitrate);
225
226 int mc_prepare(MMHandleType mediacodec);
227 int mc_unprepare(MMHandleType mediacodec);
228
229 int mc_process_input(MMHandleType mediacodec, media_packet_h inbuf, uint64_t timeOutUs);
230 int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t timeOutUs);
231
232 int mc_flush_buffers(MMHandleType mediacodec);
233 int mc_get_supported_type(MMHandleType mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type);
234
235 int mc_get_packet_pool(MMHandleType mediacodec, media_packet_pool_h *pool);
236
237 int mc_set_empty_buffer_cb(MMHandleType mediacodec, mediacodec_input_buffer_used_cb callback, void* user_data);
238 int mc_unset_empty_buffer_cb(MMHandleType mediacodec);
239
240 int mc_set_fill_buffer_cb(MMHandleType mediacodec, mediacodec_output_buffer_available_cb callback, void* user_data);
241 int mc_unset_fill_buffer_cb(MMHandleType mediacodec);
242
243 int mc_set_error_cb(MMHandleType mediacodec, mediacodec_error_cb callback, void* user_data);
244 int mc_unset_error_cb(MMHandleType mediacodec);
245
246 int mc_set_eos_cb(MMHandleType mediacodec, mediacodec_eos_cb callback, void* user_data);
247 int mc_unset_eos_cb(MMHandleType mediacodec);
248
249 int mc_set_buffer_status_cb(MMHandleType mediacodec, mediacodec_buffer_status_cb callback, void* user_data);
250 int mc_unset_buffer_status_cb(MMHandleType mediacodec);
251 int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data);
252 int _mediacodec_foreach_supported_codec(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data);
253
254 void _mc_create_codec_map_from_ini(mc_handle_t *mc_handle, mc_codec_spec_t *spec_emul);
255 void _mc_create_decoder_map_from_ini(mc_handle_t *mc_handle);
256 void _mc_create_encoder_map_from_ini(mc_handle_t *mc_handle);
257
258 #ifdef __cplusplus
259 }
260 #endif
261
262 #endif /* __TIZEN_MEDIA_CODEC_PORT_H__ */