Modified in acordance to coding guidelines.
[glsdk/dual-decode.git] / include / gui.h
1 /*\r
2  *  Copyright (c) 2012-2013, Texas Instruments Incorporated\r
3  *\r
4  *  Redistribution and use in source and binary forms, with or without\r
5  *  modification, are permitted provided that the following conditions\r
6  *  are met:\r
7  *\r
8  *  *  Redistributions of source code must retain the above copyright\r
9  *     notice, this list of conditions and the following disclaimer.\r
10  *\r
11  *  *  Redistributions in binary form must reproduce the above copyright\r
12  *     notice, this list of conditions and the following disclaimer in the\r
13  *     documentation and/or other materials provided with the distribution.\r
14  *\r
15  *  *  Neither the name of Texas Instruments Incorporated nor the names of\r
16  *     its contributors may be used to endorse or promote products derived\r
17  *     from this software without specific prior written permission.\r
18  *\r
19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
21  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
22  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
23  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
24  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
25  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
26  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
27  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
28  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
29  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
30  *\r
31  *  Contact information for paper mail:\r
32  *  Texas Instruments\r
33  *  Post Office Box 655303\r
34  *  Dallas, Texas 75265\r
35  *  Contact information:\r
36  *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm\r
37  *  ?DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact\r
38  *  ============================================================================\r
39  *\r
40  */\r
41 \r
42 /**\r
43  * @file                gui.h\r
44  *\r
45  * @brief               Declares the data structures and the functions exported by the \r
46  *                              GUI. \r
47  */\r
48 \r
49 #ifndef __GUI_H__\r
50 #define __GUI_H__\r
51 \r
52 #include <gtk/gtk.h>\r
53 #include <gst/gst.h>\r
54 \r
55 /******************************************************************************\r
56  \r
57                         Public functions declarations\r
58  \r
59 ******************************************************************************/\r
60 \r
61 /**\r
62  *      @brief                  initialises GTK if X is present\r
63  *\r
64  *      @param[in,out] argc             number of command line arguments\r
65  *      @param[in,out] argv             command line arguments\r
66  *\r
67  *      @return                 TRUE if X present, FALSE otherwise              \r
68  *\r
69  *      Called From             main()\r
70  */\r
71 gboolean DualDecode_initGUI(gint *argc, char **argv[]);\r
72 \r
73 /**\r
74  *      @brief                  start the application\r
75  *\r
76  *      Called From             main()\r
77  */\r
78 void DualDecode_startApplication();\r
79 \r
80 /**\r
81  *      @brief                  stop the application and return to main()\r
82  *\r
83  *      Called From             delete-event handlers of the windows\r
84  */\r
85 void DualDecode_exitApplication();\r
86 \r
87 /******************************************************************************\r
88  \r
89                          Structure Definitions\r
90  \r
91 *****************************************************************************/\r
92 \r
93 /**\r
94  *      @brief                  This structure defines all the components and the signals\r
95  *                                      for a Dual-Decode GUI window. There will be two such\r
96  *                                      windows when the application is running \r
97  */\r
98 typedef struct{\r
99 \r
100         /*The Window and its delete-event signal handler*/\r
101         GtkWidget *window;\r
102         gulong windowCloseSignal;\r
103  \r
104     /*Image sink for the window*/\r
105     GstElement *sink;\r
106 \r
107         /*The Seekbar widget and the value-changed signal handler                       */\r
108         /*value-changed handler is called when media is seeked using seekbar*/\r
109         GtkWidget *seekScale;\r
110         gulong seekSignal;\r
111 \r
112         /*File Open button and clicked signal handler*/\r
113         GtkWidget *openButton;\r
114         gulong openSignal;\r
115 \r
116         /*Media control buttons and clicked signal handlers*/\r
117         GtkWidget *playButton;\r
118         gulong playSignal;\r
119         GtkWidget *pauseButton;\r
120         gulong pauseSignal;\r
121         GtkWidget *stopButton;\r
122         gulong stopSignal;\r
123         GtkWidget *forwardButton;\r
124         gulong forwardSignal;\r
125         GtkWidget *rewindButton;\r
126         gulong rewindSignal;\r
127 \r
128         /*Help Button and clicked signal handler*/\r
129         GtkWidget *helpButton;\r
130         gulong helpSignal;\r
131 \r
132         /*The decode mode switch button and the clicked signal handler*/\r
133         GtkWidget *switchButton;\r
134         gulong switchSignal;\r
135 \r
136         /*Labels to display media playback status and position in media*/\r
137         GtkWidget *statusLabel;\r
138         GtkWidget *timeLabel;\r
139 \r
140         /*The timer signal to report position in media every*/\r
141         /*REPORT_INTERVAL seconds                                                       */\r
142         gulong timerSignal;\r
143 \r
144         /*The draw area where the video is displayed*/\r
145         GtkWidget *drawArea;\r
146 \r
147         /*The state of the controls*/\r
148         gint activeFlag;\r
149         gint modeFlag;\r
150 } GUIWindow;\r
151 \r
152 \r
153 \r
154 /******************************************************************************\r
155  \r
156               Statically used variables per GUI component file\r
157 \r
158  *****************************************************************************/\r
159 \r
160 static GError *error                    = NULL;\r
161 static GtkBuilder *builder              = NULL;\r
162 \r
163 /******************************************************************************\r
164  \r
165                         Static Inline functions\r
166  \r
167 *****************************************************************************/\r
168 \r
169 /**\r
170  * Report and then free the error, if error is not NULL\r
171  *This function is called when a NULL is returned from\r
172  *an allocation function\r
173  */                              \r
174 static inline void DualDecode_checkError(){\r
175         if(NULL == error){\r
176                 g_printerr("GError Report : Unknown error\n");\r
177         }else{\r
178                 g_printerr("GError Report : %s\n",error->message);\r
179                 g_error_free(error);\r
180                 error = NULL;\r
181         }\r
182 }\r
183 \r
184 /*create and close a static GtkBuilder*/\r
185 static inline void DualDecode_builderClose() {\r
186         g_object_unref(G_OBJECT(builder));\r
187         builder = NULL;\r
188 }\r
189 static inline void DualDecode_builderCreate() {\r
190         builder = gtk_builder_new();\r
191         if(0 == gtk_builder_add_from_file(builder,GLADE_FILE,&error)){\r
192                 DualDecode_checkError();\r
193                 DualDecode_builderClose();\r
194         }\r
195 }\r
196 \r
197 /*get a widget from the builder*/\r
198 static inline GtkWidget *DualDecode_getWidget(const char *widget) {\r
199         GtkWidget *retWidget = NULL;\r
200         if(NULL == builder){\r
201                 retWidget = NULL;\r
202         }else{\r
203                 retWidget = (GtkWidget *)gtk_builder_get_object(builder,widget);\r
204         }\r
205         return retWidget;\r
206 }\r
207 \r
208 /**\r
209  * Get a widget exclusively from the builder                      \r
210  * this will let the application create two instances             \r
211  * of a widget defined in the glade file.                         \r
212  *                                                                \r
213  * For example : this macro can be used like -                    \r
214  *                                                                \r
215  * widget0 = DualDecode_getWidgetExclusive("applicationWindow")   \r
216  * widget1 = DualDecode_getWidgetExclusive("applicationWindow")   \r
217  *                                                                \r
218  * this will create two different widgets with the same           \r
219  * look and feel                                                  \r
220  */\r
221 \r
222 static inline GtkWidget *DualDecode_getWidgetExclusive(const char *widget) {\r
223         GtkWidget *retWidget = NULL;\r
224         DualDecode_builderCreate();\r
225         retWidget=DualDecode_getWidget(widget);\r
226         DualDecode_builderClose();\r
227         return retWidget;\r
228 }\r
229 /******************************************************************************\r
230 \r
231                                 Macros\r
232 \r
233  *****************************************************************************/\r
234 /*To index the static GUIWindow and Pipeline structures                 */\r
235 /*There are two of them, since it is a dual-decode application  */\r
236 #define DECODER_INDEX_SINGLE 0\r
237 #define DECODER_INDEX_DOUBLE 1\r
238 \r
239 /*ratio of screen size per window*/\r
240 #define SCREEN_WIDTH_FACTOR 3\r
241 #define SCREEN_HEIGHT_FACTOR 2\r
242 \r
243 /*Whether the control buttons are active*/\r
244 #define CONTROL_MODE_ACTIVE TRUE\r
245 #define CONTROL_MODE_INACTIVE FALSE\r
246 \r
247 #define CONTROL_MODE_STOPPED 0\r
248 #define CONTROL_MODE_PLAYING 1\r
249 #define CONTROL_MODE_PAUSED 2\r
250 #define CONTROL_MODE_NO_FILE 4\r
251 \r
252 #define LABEL_TEXT_NO_FILE "No File"\r
253 #define LABEL_TEXT_PLAYING "Playing"\r
254 #define LABEL_TEXT_STOPPED "Stopped"\r
255 #define LABEL_TEXT_PAUSED "Paused"\r
256 \r
257 #define TIME_LABEL_ORIGIN "--:--:--/--:--:--"\r
258 \r
259 #define FORWARD 3000000000\r
260 #define REWIND 3000000000\r
261 #define SWITCH_TEXT_SINGLE "Single Decode"\r
262 #define SWITCH_TEXT_DUAL "Dual Decode"\r
263 \r
264 #define TIMER_INTERVAL 1000\r
265 #define TIMER_SIGNAL_NONE 0\r
266 \r
267 /*The glade file to import widgets from*/\r
268 #define GLADE_FILE "res/gui.xml"\r
269 \r
270 \r
271 #endif /*__GUI_H__*/\r