3 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #ifndef __TIZEN_MEDIA_CODEC_PORT_GST_H__
19 #define __TIZEN_MEDIA_CODEC_PORT_GST_H__
23 #include <media_codec.h>
24 #include <media_codec_private.h>
25 #include <media_codec_port.h>
26 #include <media_codec_bitstream.h>
29 #include <tbm_surface.h>
30 #include <tbm_bufmgr.h>
31 #include <tbm_surface_internal.h>
32 #include <gst/video/video-format.h>
38 #define GST_INIT_STRUCTURE(param) \
39 memset(&(param), 0, sizeof(param));
41 #define MEDIACODEC_ELEMENT_SET_STATE(x_element, x_state) \
43 LOGD("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \
44 if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(x_element, x_state)) { \
45 LOGE("failed to set state %s to %s\n", #x_state, GST_ELEMENT_NAME(x_element)); \
46 goto STATE_CHANGE_FAILED; \
50 #define SCMN_IMGB_MAX_PLANE 4
51 #define TBM_API_CHANGE
52 #define DEFAULT_DEC_POOL_SIZE 20
53 #define DEFAULT_ENC_POOL_SIZE 13
54 #define CODECDATA_NOT_USE 0x7FFFFFFF
55 #define AAC_CODECDATA_SIZE 16
56 #define WMA_CODECDATA_SIZE 64
57 #define VORBIS_CODECDATA_SIZE 4096
58 #define MAXINUM_QNUM 20
59 #define THRESHOLD_QNUM 5
62 typedef struct _mc_gst_port_def_t mc_gst_port_def_t;
63 typedef struct _mc_gst_port_t mc_gst_port_t;
64 typedef struct _mc_gst_core_t mc_gst_core_t;
65 typedef struct _GstMCBuffer GstMCBuffer;
74 struct _mc_gst_port_def_t {
76 media_format_mimetype_e coding_type;
78 mc_audio_port_definition_t audio;
79 mc_video_port_definition_t video;
83 struct _mc_gst_port_t {
88 gboolean is_allocated;
92 mc_gst_port_def_t port_def;
95 struct _mc_gst_core_t {
100 GstElement *audioconvert;
101 GstElement *audioresample;
102 GstElement *videoscale;
103 GstElement *videoconvert;
104 GstElement *capsfilter;
106 GstElement *fakesink;
112 GMainContext *thread_default;
113 gulong signal_handoff;
118 GMutex eos_wait_mutex;
122 GCond out_buffer_cond;
124 GCond eos_waiting_cond;
126 gboolean output_allocated;
131 gboolean eos_waiting;
132 gboolean codec_config;
135 gboolean need_codec_data;
136 gboolean need_sync_flag;
137 gboolean unprepare_flag;
139 guint num_live_buffers;
143 mediacodec_codec_type_e codec_id;
144 media_format_mimetype_e out_mime;
145 media_format_h output_fmt;
146 mc_gst_port_t *ports[2];
149 mc_aqueue_t *available_queue;
150 GQueue *output_queue;
152 GstBuffer *codec_data;
153 GstCaps* (*mc_caps_new)(mc_gst_core_t *, mediacodec_codec_type_e, gint);
155 void* user_cb[_MEDIACODEC_EVENT_TYPE_NUM];
156 void* user_data[_MEDIACODEC_EVENT_TYPE_NUM];
159 struct _GstMCBuffer {
163 media_packet_h packet;
168 enum { fill_inbuf, fill_outbuf };
170 int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer);
171 int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer);
173 int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer);
174 int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer);
175 int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer);
177 int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer);
178 int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer);
179 int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer);
180 int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer);
182 mc_gst_core_t *mc_gst_core_new();
183 void mc_gst_core_free(mc_gst_core_t *core);
185 mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core);
186 void mc_gst_port_free(mc_gst_port_t *port);
188 mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle);
189 mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle);
191 mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeOutUs);
192 mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeOutUs);
194 mc_ret_e mc_gst_flush_buffers(mc_handle_t *mc_handle);
196 mc_ret_e mc_gst_get_packet_pool(mc_handle_t *mc_handle, media_packet_pool_h *packet_pool);
202 #endif /* __TIZEN_MEDIA_CODEC_PORT_GST_H__ */