2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __TIZEN_MEDIA_CODEC_PORT_H__
18 #define __TIZEN_MEDIA_CODEC_PORT_H__
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>
32 /*===========================================================================================
34 | GLOBAL DEFINITIONS AND DECLARATIONS FOR MODULE |
36 ========================================================================================== */
38 /*---------------------------------------------------------------------------
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)
47 #define GET_IS_OMX(x) CHECK_BIT(x, 4)
48 #define GET_IS_GEN(x) CHECK_BIT(x, 5)
52 #define MEDIACODEC_FENTER();
53 #define MEDIACODEC_FLEAVE();
55 #define MEDIACODEC_FENTER(); LOGW("%s Enter", __FUNCTION__);
56 #define MEDIACODEC_FLEAVE(); LOGW("%s Exit", __FUNCTION__);
59 /*---------------------------------------------------------------------------
60 | GLOBAL CONSTANT DEFINITIONS: |
61 ---------------------------------------------------------------------------*/
63 * @brief Enumerations of media codec port's retrun value
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 */
121 /*---------------------------------------------------------------------------
122 | GLOBAL DATA TYPE DEFINITIONS: |
123 ---------------------------------------------------------------------------*/
125 * @brief Called when the dequeue input buffer done
126 * @details It will be invoked when mediacodec has released dequeue buffer.
127 * @param[in] user_data The user data passed from the callback registration function
128 * @pre It will be invoked when dequeue buffer process completed if you register this callback using mediacodec_set_dequeue_input_buffer_cb().
129 * @see mediacodec_set_dequeue_input_buffer_cb()
130 * @see mediacodec_unset_dequeue_input_buffer_cb()
134 typedef struct _mc_decoder_info_t mc_decoder_info_t;
135 typedef struct _mc_encoder_info_t mc_encoder_info_t;
136 typedef struct _mc_handle_t mc_handle_t;
138 typedef void (*mc_dequeue_input_buffer_cb)(media_packet_h pkt, void *user_data);
139 typedef void (*mc_empty_buffer_cb)(media_packet_h pkt, void *user_data);
140 typedef void (*mc_fill_buffer_cb)(media_packet_h pkt, void *user_data);
141 typedef void (*mc_error_cb)(mediacodec_error_e error, void *user_data);
142 typedef void (*mc_eos_cb)(void *user_data);
143 typedef void (*mc_buffer_status_cb)(mediacodec_status_e status, void *user_data);
144 typedef void (*mc_supported_codec_cb)(mediacodec_codec_type_e codec_type, void *user_data);
147 _MEDIACODEC_EVENT_TYPE_COMPLETE,
148 _MEDIACODEC_EVENT_TYPE_EMPTYBUFFER,
149 _MEDIACODEC_EVENT_TYPE_FILLBUFFER,
150 _MEDIACODEC_EVENT_TYPE_ERROR,
151 _MEDIACODEC_EVENT_TYPE_EOS,
152 _MEDIACODEC_EVENT_TYPE_BUFFER_STATUS,
153 _MEDIACODEC_EVENT_TYPE_INTERNAL_FILLBUFFER,
154 _MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC,
155 _MEDIACODEC_EVENT_TYPE_NUM
156 } _mediacodec_event_e;
159 typedef enum _mc_codec_port_type_e {
160 CODEC_PORT_TYPE_GENERAL,
164 } mc_codec_port_type_e;
166 typedef struct mc_audio_port_definition_t {
171 } mc_audio_port_definition_t;
173 typedef struct mc_video_port_definition_t {
180 } mc_video_port_definition_t;
182 /* Codec Private data */
183 struct _mc_handle_t {
184 int state; /**< mc current state */
190 mediacodec_port_type_e port_type;
191 mediacodec_codec_type_e codec_id;
197 mc_audio_port_definition_t audio;
198 mc_video_port_definition_t video;
201 /* for process done cb */
202 void* user_cb[_MEDIACODEC_EVENT_TYPE_NUM];
203 void* user_data[_MEDIACODEC_EVENT_TYPE_NUM];
205 mc_codec_map_t encoder_map[MEDIA_CODEC_MAX_CODEC_TYPE];
206 mc_codec_map_t decoder_map[MEDIA_CODEC_MAX_CODEC_TYPE];
208 int num_supported_decoder;
209 int num_supported_encoder;
214 /*===========================================================================================
216 | GLOBAL FUNCTION PROTOTYPES |
218 ========================================================================================== */
224 int mc_create(MMHandleType *mediacodec);
225 int mc_destroy(MMHandleType mediacodec);
227 int mc_set_codec(MMHandleType mediacodec, mediacodec_codec_type_e codec_id, int flags);
229 int mc_set_vdec_info(MMHandleType mediacodec, int width, int height);
230 int mc_set_venc_info(MMHandleType mediacodec, int width, int height, int fps, int target_bits);
232 int mc_set_adec_info(MMHandleType mediacodec, int samplerate, int channel, int bit);
233 int mc_set_aenc_info(MMHandleType mediacodec, int samplerate, int channel, int bit, int bitrate);
235 int mc_configure(MMHandleType mediacodec, media_format_h format, int flags);
237 int mc_prepare(MMHandleType mediacodec);
238 int mc_unprepare(MMHandleType mediacodec);
240 int mc_process_input(MMHandleType mediacodec, media_packet_h inbuf, uint64_t timeOutUs);
241 int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t timeOutUs);
243 int mc_flush_buffers(MMHandleType mediacodec);
244 int mc_get_supported_type(MMHandleType mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type);
246 int mc_get_packet_pool(MMHandleType mediacodec, media_packet_pool_h *pool);
248 int mc_set_empty_buffer_cb(MMHandleType mediacodec, mediacodec_input_buffer_used_cb callback, void* user_data);
249 int mc_unset_empty_buffer_cb(MMHandleType mediacodec);
251 int mc_set_fill_buffer_cb(MMHandleType mediacodec, mediacodec_output_buffer_available_cb callback, void* user_data);
252 int mc_unset_fill_buffer_cb(MMHandleType mediacodec);
254 int mc_set_error_cb(MMHandleType mediacodec, mediacodec_error_cb callback, void* user_data);
255 int mc_unset_error_cb(MMHandleType mediacodec);
257 int mc_set_eos_cb(MMHandleType mediacodec, mediacodec_eos_cb callback, void* user_data);
258 int mc_unset_eos_cb(MMHandleType mediacodec);
260 int mc_set_buffer_status_cb(MMHandleType mediacodec, mediacodec_buffer_status_cb callback, void* user_data);
261 int mc_unset_buffer_status_cb(MMHandleType mediacodec);
262 int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data);
263 int _mediacodec_foreach_supported_codec(mediacodec_supported_codec_cb callback, void* user_data);
265 void _mc_create_codec_map_from_ini(mc_handle_t *mc_handle, mc_codec_spec_t *spec_emul);
266 void _mc_create_codec_map_from_ini_static(mc_ini_t *ini, mc_codec_spec_t *spec_emul);
267 void _mc_create_decoder_map_from_ini(mc_handle_t *mc_handle);
268 void _mc_create_encoder_map_from_ini(mc_handle_t *mc_handle);
270 mediacodec_codec_type_e simple_to_codec_type_enumeration(codec_type_e codec_id);
271 codec_type_e codec_type_to_simple_enumeration(mediacodec_codec_type_e media_codec_id);
277 #endif /* __TIZEN_MEDIA_CODEC_PORT_H__ */