4 * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, ByungWook Jang <bw.jang@samsung.com>,
7 * Maksym Ukhanov <m.ukhanov@samsung.com>, Hyunjun Ko <zzoon.ko@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 #ifndef _MM_WFD_SINK_PRIV_H_
24 #define _MM_WFD_SINK_PRIV_H_
32 #include <mm_message.h>
36 #include "mm_wfd_sink_ini.h"
37 #include "mm_wfd_sink_attrs.h"
38 #include "mm_wfd_sink.h"
40 /* main pipeline's element id */
41 enum WFDSinkMainElementID {
42 WFD_SINK_M_PIPE = 0, /* NOTE : WFD_SINK_M_PIPE should be zero */
53 /* audio decodebin's element id */
54 enum WFDSinkAudioDecodeBinElementID {
55 WFD_SINK_A_D_BIN = 0, /* NOTE : WFD_SINK_A_D_BIN should be zero */
58 WFD_SINK_A_D_AAC_PARSE,
60 WFD_SINK_A_D_AC3_PARSE,
62 WFD_SINK_A_D_LPCM_CONVERTER,
63 WFD_SINK_A_D_LPCM_FILTER,
67 /* audio sinkbin's element id */
68 enum WFDSinkAudioSinkBinElementID {
69 WFD_SINK_A_S_BIN = 0, /* NOTE : WFD_SINK_A_S_BIN should be zero */
70 WFD_SINK_A_S_RESAMPLER,
77 /* video decodebin's element id */
78 enum WFDSinkVideoDecodeBinElementID {
79 WFD_SINK_V_D_BIN = 0, /* NOTE : WFD_SINK_V_D_BIN should be zero */
82 WFD_SINK_V_D_H264_PARSE,
83 WFD_SINK_V_D_H264_DEC,
84 WFD_SINK_V_D_H265_PARSE,
85 WFD_SINK_V_D_H265_DEC,
86 WFD_SINK_V_D_VP9_PARSE,
91 /* video sinkbin's element id */
92 enum WFDSinkVideoSinkBinElementID {
93 WFD_SINK_V_S_BIN = 0, /* NOTE : WFD_SINK_V_S_BIN should be zero */
101 * * Enumerations of wifi-display command.
104 MM_WFD_SINK_COMMAND_NONE, /**< command for nothing */
105 MM_WFD_SINK_COMMAND_CREATE, /**< command for creating wifi-display sink */
106 MM_WFD_SINK_COMMAND_PREPARE, /**< command for preparing wifi-display sink */
107 MM_WFD_SINK_COMMAND_CONNECT, /**< command for connecting wifi-display sink */
108 MM_WFD_SINK_COMMAND_START, /**< command for starting wifi-display sink */
109 MM_WFD_SINK_COMMAND_PAUSE, /**< command for pausing wifi-display sink */
110 MM_WFD_SINK_COMMAND_RESUME, /**< command for resuming wifi-display sink */
111 MM_WFD_SINK_COMMAND_DISCONNECT, /**< command for disconnecting wifi-display sink */
112 MM_WFD_SINK_COMMAND_UNPREPARE, /**< command for unpreparing wifi-display sink */
113 MM_WFD_SINK_COMMAND_DESTROY, /**< command for destroting wifi-display sink */
114 MM_WFD_SINK_COMMAND_NUM, /**< Number of wifi-display commands */
115 } MMWFDSinkCommandType;
118 * * Enumerations of thread command.
121 WFD_SINK_MANAGER_CMD_NONE = 0,
122 WFD_SINK_MANAGER_CMD_LINK_A_DECODEBIN,
123 WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN,
124 WFD_SINK_MANAGER_CMD_PREPARE_A_PIPELINE,
125 WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE,
126 WFD_SINK_MANAGER_CMD_UNPREPARE_A_PIPELINE,
127 WFD_SINK_MANAGER_CMD_UNPREPARE_V_PIPELINE,
128 WFD_SINK_MANAGER_CMD_EXIT,
129 } WFDSinkManagerCMDType;
132 * * Enumerations of resolution.
135 MM_WFD_SINK_RESOLUTION_UNKNOWN = 0,
136 MM_WFD_SINK_RESOLUTION_1920x1080_P30 = (1 << 0), /**< W-1920, H-1080, 30 fps*/
137 MM_WFD_SINK_RESOLUTION_1280x720_P30 = (1 << 1), /**< W-1280, H-720, 30 fps*/
138 MM_WFD_SINK_RESOLUTION_960x540_P30 = (1 << 2), /**< W-960, H-540, 30 fps*/
139 MM_WFD_SINK_RESOLUTION_864x480_P30 = (1 << 3), /**< W-864, H-480, 30 fps*/
140 MM_WFD_SINK_RESOLUTION_720x480_P60 = (1 << 4), /**< W-720, H-480, 30 fps*/
141 MM_WFD_SINK_RESOLUTION_640x480_P60 = (1 << 5), /**< W-640, H-480, 60 fps*/
142 MM_WFD_SINK_RESOLUTION_640x360_P30 = (1 << 6), /**< W-640, H-360, 30 fps*/
143 MM_WFD_SINK_RESOLUTION_MAX = 128,
144 } MMWFDSinkResolution;
151 } MMWFDSinkVideoStreamInfo;
158 } MMWFDSinkAudioStreamInfo;
161 MMWFDSinkAudioStreamInfo audio_stream_info;
162 MMWFDSinkVideoStreamInfo video_stream_info;
163 } MMWFDSinkStreamInfo;
169 } MMWFDSinkGstElement;
172 MMWFDSinkGstElement *mainbin;
173 MMWFDSinkGstElement *a_decodebin;
174 MMWFDSinkGstElement *v_decodebin;
175 MMWFDSinkGstElement *a_sinkbin;
176 MMWFDSinkGstElement *v_sinkbin;
177 } MMWFDSinkGstPipelineInfo;
180 MMWFDSinkStateType state; /* wfd current state */
181 MMWFDSinkStateType prev_state; /* wfd previous state */
182 MMWFDSinkStateType pending_state; /* wfd state which is going to now */
187 int(*prepare)(MMHandleType wfd_sink);
188 int(*connect)(MMHandleType wfd_sink, const char *uri);
189 int(*start)(MMHandleType wfd_sink);
190 int(*pause)(MMHandleType wfd_sink);
191 int(*resume)(MMHandleType wfd_sink);
192 int(*disconnect)(MMHandleType wfd_sink);
193 int(*unprepare)(MMHandleType wfd_sink);
194 } MMWFDSinkPrivateFunc;
196 #define MMWFDSINK_CAST(x_wfd) ((mm_wfd_sink_t *)(x_wfd))
197 #define MMWFDSINK_GET_ATTRS(x_wfd) ((x_wfd) ? ((mm_wfd_sink_t*)x_wfd)->attrs : (MMHandleType)NULL)
200 /* gstreamer pipeline */
201 MMWFDSinkGstPipelineInfo *pipeline;
202 gboolean audio_decodebin_is_linked;
203 gboolean video_decodebin_is_linked;
204 gulong update_stream_info_sig_id;
205 gulong change_av_format_sig_id;
207 /* timestamp compensation */
208 gboolean need_to_reset_basetime;
211 gint64 video_average_gap;
212 gint64 video_accumulated_gap;
213 gint64 video_buffer_count;
214 gint64 audio_average_gap;
215 gint64 audio_accumulated_gap;
216 gint64 audio_buffer_count;
217 GstClockTime last_buffer_timestamp;
223 MMWFDSinkState state;
225 /* initialize values */
226 mm_wfd_sink_ini_t ini;
229 MMWFDSinkCommandType cmd;
231 gboolean waiting_cmd;
233 /* stream information */
234 MMWFDSinkStreamInfo stream_info;
236 /* Message handling */
237 MMWFDMessageCallback msg_cb;
240 /* video resolution for negotiation */
241 MMWFDSinkResolution supportive_resolution;
243 GThread *manager_thread;
244 GMutex manager_thread_mutex;
245 GCond manager_thread_cond;
246 GList *manager_thread_cmd;
247 gboolean manager_thread_exit;
249 MMWFDSinkPrivateFunc *func_table;
250 MMHandleType extend_handle;
251 guint msg_callback_id;
253 guint coupled_sink_status;
254 gchar *coupled_sink_address;
255 gboolean is_coupled_sink_supported;
256 int display_surface_id;
260 int _mm_wfd_sink_create(mm_wfd_sink_t **wfd_sink, const char *ini_path);
261 int _mm_wfd_sink_destroy(mm_wfd_sink_t *wfd_sink);
262 int _mm_wfd_sink_prepare(mm_wfd_sink_t *wfd_sink);
263 int _mm_wfd_sink_unprepare(mm_wfd_sink_t *wfd_sink);
264 int _mm_wfd_sink_connect(mm_wfd_sink_t *wfd_sink, const char *uri);
265 int _mm_wfd_sink_disconnect(mm_wfd_sink_t *wfd_sink);
266 int _mm_wfd_sink_start(mm_wfd_sink_t *wfd_sink);
267 int _mm_wfd_sink_pause(mm_wfd_sink_t *wfd_sink);
268 int _mm_wfd_sink_resume(mm_wfd_sink_t *wfd_sink);
269 int _mm_wfd_set_message_callback(mm_wfd_sink_t *wfd_sink, MMWFDMessageCallback callback, void *user_data);
270 int _mm_wfd_sink_set_resolution(mm_wfd_sink_t *wfd_sink, MMWFDSinkResolution resolution);
272 int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink);
273 int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink);
274 int __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **sinkpad);
275 int __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **sinkpad);
276 int __mm_wfd_sink_unprepare_audio_pipeline(mm_wfd_sink_t *wfd_sink);
277 int __mm_wfd_sink_unprepare_video_pipeline(mm_wfd_sink_t *wfd_sink);
278 int __mm_wfd_sink_activate_audio_stream(mm_wfd_sink_t *wfd_sink);
279 int __mm_wfd_sink_activate_video_stream(mm_wfd_sink_t *wfd_sink);
280 int __mm_wfd_sink_deactivate_audio_stream(mm_wfd_sink_t *wfd_sink, gboolean unprepare);
281 int __mm_wfd_sink_deactivate_video_stream(mm_wfd_sink_t *wfd_sink, gboolean unprepare);
283 const gchar *_mm_wfds_sink_get_state_name(MMWFDSinkStateType state);
284 int __mm_wfd_sink_check_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkCommandType cmd);
285 int __mm_wfd_sink_create_audio_decodebin(mm_wfd_sink_t *wfd_sink);
286 int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink);
287 int __mm_wfd_sink_create_video_sinkbin(mm_wfd_sink_t *wfd_sink);
288 int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink);
289 void __mm_wfd_sink_print_ref_count(mm_wfd_sink_t *wfd_sink);
290 int __mm_wfd_sink_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket, gboolean need_prepare);
291 int __mm_wfd_sink_gst_element_link_bucket(GList *element_bucket);
293 int __mm_wfd_sink_set_pipeline_state(mm_wfd_sink_t *wfd_sink, GstState state, gboolean async);
294 int __mm_wfd_sink_create_pipeline(mm_wfd_sink_t *wfd_sink);
295 int __mm_wfd_sink_destroy_audio_decodebin(mm_wfd_sink_t *wfd_sink);
296 int __mm_wfd_sink_destroy_video_decodebin(mm_wfd_sink_t *wfd_sink);
297 int __mm_wfd_sink_destroy_audio_sinkbin(mm_wfd_sink_t *wfd_sink);
298 int __mm_wfd_sink_destroy_video_sinkbin(mm_wfd_sink_t *wfd_sink);
299 int __mm_wfd_sink_destroy_pipeline(mm_wfd_sink_t *wfd_sink);
301 int _mm_wfd_sink_set_display_overlay(mm_wfd_sink_t *wfd_sink, void *display_object);
304 int __mm_wfd_sink_set_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkStateType state);