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>
35 #include <mm_wfd_sink_ini.h>
36 #include <mm_wfd_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 */
49 /* audio decodebin's element id */
50 enum WFDSinkAudioDecodeBinElementID {
51 WFD_SINK_A_D_BIN = 0, /* NOTE : WFD_SINK_A_D_BIN should be zero */
54 WFD_SINK_A_D_AAC_PARSE,
56 WFD_SINK_A_D_AC3_PARSE,
58 WFD_SINK_A_D_LPCM_CONVERTER,
59 WFD_SINK_A_D_LPCM_FILTER,
63 /* audio sinkbin's element id */
64 enum WFDSinkAudioSinkBinElementID {
65 WFD_SINK_A_S_BIN = 0, /* NOTE : WFD_SINK_A_S_BIN should be zero */
66 WFD_SINK_A_S_RESAMPLER,
72 /* video decodebin's element id */
73 enum WFDSinkVideoDecodeBinElementID {
74 WFD_SINK_V_D_BIN = 0, /* NOTE : WFD_SINK_V_D_BIN should be zero */
78 WFD_SINK_V_D_CAPSSETTER,
83 /* video sinkbin's element id */
84 enum WFDSinkVideoSinkBinElementID {
85 WFD_SINK_V_S_BIN = 0, /* NOTE : WFD_SINK_V_S_BIN should be zero */
93 * * Enumerations of wifi-display command.
96 MM_WFD_SINK_COMMAND_NONE, /**< command for nothing */
97 MM_WFD_SINK_COMMAND_CREATE, /**< command for creating wifi-display sink */
98 MM_WFD_SINK_COMMAND_PREPARE, /**< command for preparing wifi-display sink */
99 MM_WFD_SINK_COMMAND_CONNECT, /**< command for connecting wifi-display sink */
100 MM_WFD_SINK_COMMAND_START, /**< command for starting wifi-display sink */
101 MM_WFD_SINK_COMMAND_PAUSE, /**< command for pausing wifi-display sink */
102 MM_WFD_SINK_COMMAND_RESUME, /**< command for resuming wifi-display sink */
103 MM_WFD_SINK_COMMAND_DISCONNECT, /**< command for disconnecting wifi-display sink */
104 MM_WFD_SINK_COMMAND_UNPREPARE, /**< command for unpreparing wifi-display sink */
105 MM_WFD_SINK_COMMAND_DESTROY, /**< command for destroting wifi-display sink */
106 MM_WFD_SINK_COMMAND_NUM, /**< Number of wifi-display commands */
107 } MMWFDSinkCommandType;
110 * * Enumerations of thread command.
113 WFD_SINK_MANAGER_CMD_NONE = 0,
114 WFD_SINK_MANAGER_CMD_LINK_A_DECODEBIN,
115 WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN,
116 WFD_SINK_MANAGER_CMD_PREPARE_A_PIPELINE,
117 WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE,
118 WFD_SINK_MANAGER_CMD_EXIT,
119 } WFDSinkManagerCMDType;
122 * * Enumerations of resolution.
125 MM_WFD_SINK_RESOLUTION_UNKNOWN = 0,
126 MM_WFD_SINK_RESOLUTION_1920x1080_P30 = (1 << 0), /**< W-1920, H-1080, 30 fps*/
127 MM_WFD_SINK_RESOLUTION_1280x720_P30 = (1 << 1), /**< W-1280, H-720, 30 fps*/
128 MM_WFD_SINK_RESOLUTION_960x540_P30 = (1 << 2), /**< W-960, H-540, 30 fps*/
129 MM_WFD_SINK_RESOLUTION_864x480_P30 = (1 << 3), /**< W-864, H-480, 30 fps*/
130 MM_WFD_SINK_RESOLUTION_720x480_P60 = (1 << 4), /**< W-720, H-480, 30 fps*/
131 MM_WFD_SINK_RESOLUTION_640x480_P60 = (1 << 5), /**< W-640, H-480, 60 fps*/
132 MM_WFD_SINK_RESOLUTION_640x360_P30 = (1 << 6), /**< W-640, H-360, 30 fps*/
133 MM_WFD_SINK_RESOLUTION_MAX = 128,
134 } MMWFDSinkResolution;
141 } MMWFDSinkVideoStreamInfo;
148 } MMWFDSinkAudioStreamInfo;
151 MMWFDSinkAudioStreamInfo audio_stream_info;
152 MMWFDSinkVideoStreamInfo video_stream_info;
153 } MMWFDSinkStreamInfo;
159 } MMWFDSinkGstElement;
162 MMWFDSinkGstElement *mainbin;
163 MMWFDSinkGstElement *a_decodebin;
164 MMWFDSinkGstElement *v_decodebin;
165 MMWFDSinkGstElement *a_sinkbin;
166 MMWFDSinkGstElement *v_sinkbin;
167 } MMWFDSinkGstPipelineInfo;
170 MMWFDSinkStateType state; /* wfd current state */
171 MMWFDSinkStateType prev_state; /* wfd previous state */
172 MMWFDSinkStateType pending_state; /* wfd state which is going to now */
175 #define MMWFDSINK_GET_ATTRS(x_wfd) ((x_wfd)? ((mm_wfd_sink_t*)x_wfd)->attrs : (MMHandleType)NULL)
178 /* gstreamer pipeline */
179 MMWFDSinkGstPipelineInfo *pipeline;
180 gboolean audio_decodebin_is_linked;
181 gboolean video_decodebin_is_linked;
182 GstPad *prev_audio_dec_src_pad;
183 GstPad *next_audio_dec_sink_pad;
185 /* timestamp compensation */
186 gboolean need_to_reset_basetime;
189 gint64 video_average_gap;
190 gint64 video_accumulated_gap;
191 gint64 video_buffer_count;
192 gint64 audio_average_gap;
193 gint64 audio_accumulated_gap;
194 gint64 audio_buffer_count;
195 GstClockTime last_buffer_timestamp;
201 MMWFDSinkState state;
203 /* initialize values */
204 mm_wfd_sink_ini_t ini;
207 MMWFDSinkCommandType cmd;
209 gboolean waiting_cmd;
211 /* stream information */
212 MMWFDSinkStreamInfo stream_info;
214 /* Message handling */
215 MMWFDMessageCallback msg_cb;
218 /* video resolution for negotiation */
219 MMWFDSinkResolution supportive_resolution;
221 GThread *manager_thread;
222 GMutex manager_thread_mutex;
223 GCond manager_thread_cond;
224 GList *manager_thread_cmd;
225 gboolean manager_thread_exit;
229 int _mm_wfd_sink_create(mm_wfd_sink_t **wfd_sink);
230 int _mm_wfd_sink_destroy(mm_wfd_sink_t *wfd_sink);
231 int _mm_wfd_sink_prepare(mm_wfd_sink_t *wfd_sink);
232 int _mm_wfd_sink_unprepare(mm_wfd_sink_t *wfd_sink);
233 int _mm_wfd_sink_connect(mm_wfd_sink_t *wfd_sink, const char *uri);
234 int _mm_wfd_sink_disconnect(mm_wfd_sink_t *wfd_sink);
235 int _mm_wfd_sink_start(mm_wfd_sink_t *wfd_sink);
236 int _mm_wfd_sink_pause(mm_wfd_sink_t *wfd_sink);
237 int _mm_wfd_sink_resume(mm_wfd_sink_t *wfd_sink);
238 int _mm_wfd_set_message_callback(mm_wfd_sink_t *wfd_sink, MMWFDMessageCallback callback, void *user_data);
239 int _mm_wfd_sink_get_resource(mm_wfd_sink_t *wfd_sink);
240 int _mm_wfd_sink_set_resolution(mm_wfd_sink_t *wfd_sink, MMWFDSinkResolution resolution);
242 int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink);
243 int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink);
244 int __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink);
245 int __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink);
247 const gchar *_mm_wfds_sink_get_state_name(MMWFDSinkStateType state);