f7c0249a3883ac4ce33e7c2b346e6ee2bac577f3
[platform/core/multimedia/libmm-wfd.git] / sink / 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 #include <mm_wfd_sink_ini.h>
36 #include <mm_wfd_attrs.h>
37
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_DEMUX,
46         WFD_SINK_M_NUM
47 };
48
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 */
52         WFD_SINK_A_D_QUEUE,
53         WFD_SINK_A_D_HDCP,
54         WFD_SINK_A_D_AAC_PARSE,
55         WFD_SINK_A_D_AAC_DEC,
56         WFD_SINK_A_D_AC3_PARSE,
57         WFD_SINK_A_D_AC3_DEC,
58         WFD_SINK_A_D_LPCM_CONVERTER,
59         WFD_SINK_A_D_LPCM_FILTER,
60         WFD_SINK_A_D_NUM
61 };
62
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,
67         WFD_SINK_A_S_VOLUME,
68         WFD_SINK_A_S_SINK,
69         WFD_SINK_A_S_NUM
70 };
71
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 */
75         WFD_SINK_V_D_QUEUE,
76         WFD_SINK_V_D_HDCP,
77         WFD_SINK_V_D_PARSE,
78         WFD_SINK_V_D_CAPSSETTER,
79         WFD_SINK_V_D_DEC,
80         WFD_SINK_V_D_NUM
81 };
82
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 */
86         WFD_SINK_V_S_CONVERT,
87         WFD_SINK_V_S_FILTER,
88         WFD_SINK_V_S_SINK,
89         WFD_SINK_V_S_NUM
90 };
91
92 /**
93  *  * Enumerations of wifi-display command.
94  *   */
95 typedef enum {
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;
108
109 /**
110  *  * Enumerations of thread command.
111  *   */
112 typedef enum {
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;
120
121 /**
122  *  * Enumerations of resolution.
123  *   */
124 typedef enum {
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;
135
136 typedef struct {
137         gint codec;
138         gint width;
139         gint height;
140         gint frame_rate;
141 } MMWFDSinkVideoStreamInfo;
142
143 typedef struct {
144         gint codec;
145         gint channels;
146         gint sample_rate;
147         gint bitwidth;
148 } MMWFDSinkAudioStreamInfo;
149
150 typedef struct {
151         MMWFDSinkAudioStreamInfo audio_stream_info;
152         MMWFDSinkVideoStreamInfo video_stream_info;
153 } MMWFDSinkStreamInfo;
154
155
156 typedef struct {
157         gint id;
158         GstElement *gst;
159 } MMWFDSinkGstElement;
160
161 typedef struct {
162         MMWFDSinkGstElement     *mainbin;
163         MMWFDSinkGstElement     *a_decodebin;
164         MMWFDSinkGstElement     *v_decodebin;
165         MMWFDSinkGstElement     *a_sinkbin;
166         MMWFDSinkGstElement     *v_sinkbin;
167 } MMWFDSinkGstPipelineInfo;
168
169 typedef struct {
170         MMWFDSinkStateType state;         /* wfd current state */
171         MMWFDSinkStateType prev_state;    /* wfd  previous state */
172         MMWFDSinkStateType pending_state; /* wfd  state which is going to now */
173 } MMWFDSinkState;
174
175 #define MMWFDSINK_GET_ATTRS(x_wfd) ((x_wfd)? ((mm_wfd_sink_t*)x_wfd)->attrs : (MMHandleType)NULL)
176
177 typedef struct {
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;
184
185         /* timestamp compensation */
186         gboolean need_to_reset_basetime;
187
188         GstClock *clock;
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;
196
197         /* attributes */
198         MMHandleType attrs;
199
200         /* state */
201         MMWFDSinkState state;
202
203         /* initialize values */
204         mm_wfd_sink_ini_t ini;
205
206         /* command */
207         MMWFDSinkCommandType cmd;
208         GMutex cmd_lock;
209         gboolean waiting_cmd;
210
211         /* stream information */
212         MMWFDSinkStreamInfo stream_info;
213
214         /* Message handling */
215         MMWFDMessageCallback msg_cb;
216         void *msg_user_data;
217
218         /* video resolution for negotiation */
219         MMWFDSinkResolution supportive_resolution;
220
221         GThread         *manager_thread;
222         GMutex manager_thread_mutex;
223         GCond manager_thread_cond;
224         GList *manager_thread_cmd;
225         gboolean manager_thread_exit;
226 } mm_wfd_sink_t;
227
228
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);
241
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);
246
247 const gchar *_mm_wfds_sink_get_state_name(MMWFDSinkStateType state);
248
249 #endif
250