[wfdsink] Change the way to wayland surface setting
[platform/core/multimedia/libmm-wfd.git] / src / include / mm_wfd_sink_priv.h
1 /*
2  * libmm-wfd
3  *
4  * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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>
8  *
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
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
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.
20  *
21  */
22
23 #ifndef _MM_WFD_SINK_PRIV_H_
24 #define _MM_WFD_SINK_PRIV_H_
25
26 #include <string.h>
27 #include <stdlib.h>
28 #include <glib.h>
29 #include <gst/gst.h>
30 #include <mm_types.h>
31 #include <mm_attrs.h>
32 #include <mm_message.h>
33 #include <mm_error.h>
34 #include <mm_types.h>
35
36 #include "mm_wfd_sink_ini.h"
37 #include "mm_wfd_sink_attrs.h"
38 #include "mm_wfd_sink.h"
39
40 /* main pipeline's element id */
41 enum WFDSinkMainElementID {
42         WFD_SINK_M_PIPE = 0, /* NOTE : WFD_SINK_M_PIPE should be zero */
43         WFD_SINK_M_SRC,
44         WFD_SINK_M_DEPAY,
45         WFD_SINK_M_QUEUE,
46         WFD_SINK_M_D_VALVE,
47         WFD_SINK_M_DEMUX,
48         WFD_SINK_M_A_VALVE,
49         WFD_SINK_M_V_VALVE,
50         WFD_SINK_M_NUM
51 };
52
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 */
56         WFD_SINK_A_D_QUEUE,
57         WFD_SINK_A_D_HDCP,
58         WFD_SINK_A_D_AAC_PARSE,
59         WFD_SINK_A_D_AAC_DEC,
60         WFD_SINK_A_D_AC3_PARSE,
61         WFD_SINK_A_D_AC3_DEC,
62         WFD_SINK_A_D_LPCM_CONVERTER,
63         WFD_SINK_A_D_LPCM_FILTER,
64         WFD_SINK_A_D_NUM
65 };
66
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,
71         WFD_SINK_A_S_VOLUME,
72         WFD_SINK_A_S_QUEUE,
73         WFD_SINK_A_S_SINK,
74         WFD_SINK_A_S_NUM
75 };
76
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 */
80         WFD_SINK_V_D_QUEUE,
81         WFD_SINK_V_D_HDCP,
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,
87         WFD_SINK_V_D_VP9_DEC,
88         WFD_SINK_V_D_NUM
89 };
90
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 */
94         WFD_SINK_V_S_CONVERT,
95         WFD_SINK_V_S_FILTER,
96         WFD_SINK_V_S_SINK,
97         WFD_SINK_V_S_NUM
98 };
99
100 /**
101  *  * Enumerations of wifi-display command.
102  *   */
103 typedef enum {
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;
116
117 /**
118  *  * Enumerations of thread command.
119  *   */
120 typedef enum {
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;
130
131 /**
132  *  * Enumerations of resolution.
133  *   */
134 typedef enum {
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;
145
146 typedef struct {
147         gint codec;
148         gint width;
149         gint height;
150         gint frame_rate;
151 } MMWFDSinkVideoStreamInfo;
152
153 typedef struct {
154         gint codec;
155         gint channels;
156         gint sample_rate;
157         gint bitwidth;
158 } MMWFDSinkAudioStreamInfo;
159
160 typedef struct {
161         MMWFDSinkAudioStreamInfo audio_stream_info;
162         MMWFDSinkVideoStreamInfo video_stream_info;
163 } MMWFDSinkStreamInfo;
164
165
166 typedef struct {
167         gint id;
168         GstElement *gst;
169 } MMWFDSinkGstElement;
170
171 typedef struct {
172         MMWFDSinkGstElement     *mainbin;
173         MMWFDSinkGstElement     *a_decodebin;
174         MMWFDSinkGstElement     *v_decodebin;
175         MMWFDSinkGstElement     *a_sinkbin;
176         MMWFDSinkGstElement     *v_sinkbin;
177 } MMWFDSinkGstPipelineInfo;
178
179 typedef struct {
180         MMWFDSinkStateType state;         /* wfd current state */
181         MMWFDSinkStateType prev_state;    /* wfd  previous state */
182         MMWFDSinkStateType pending_state; /* wfd  state which is going to now */
183 } MMWFDSinkState;
184
185 /* priv func */
186 typedef struct {
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;
195
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)
198
199 typedef struct {
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;
206
207         /* timestamp compensation */
208         gboolean need_to_reset_basetime;
209
210         GstClock *clock;
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;
218
219         /* attributes */
220         MMHandleType attrs;
221
222         /* state */
223         MMWFDSinkState state;
224
225         /* initialize values */
226         mm_wfd_sink_ini_t ini;
227
228         /* command */
229         MMWFDSinkCommandType cmd;
230         GMutex cmd_lock;
231         gboolean waiting_cmd;
232
233         /* stream information */
234         MMWFDSinkStreamInfo stream_info;
235
236         /* Message handling */
237         MMWFDMessageCallback msg_cb;
238         void *msg_user_data;
239
240         /* video resolution for negotiation */
241         MMWFDSinkResolution supportive_resolution;
242
243         GThread         *manager_thread;
244         GMutex manager_thread_mutex;
245         GCond manager_thread_cond;
246         GList *manager_thread_cmd;
247         gboolean manager_thread_exit;
248
249         MMWFDSinkPrivateFunc *func_table;
250         MMHandleType extend_handle;
251         guint msg_callback_id;
252
253         guint coupled_sink_status;
254         gchar *coupled_sink_address;
255         gboolean is_coupled_sink_supported;
256         int display_surface_id;
257 } mm_wfd_sink_t;
258
259
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);
271
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);
282
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);
292
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);
300
301 int _mm_wfd_sink_set_display_overlay(mm_wfd_sink_t *wfd_sink, void *display_object);
302
303 /* state */
304 int __mm_wfd_sink_set_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkStateType state);
305
306 #endif