1 /***************************************************************************
2
3 Handle preview mode
4
5 It is displayed in 3 layers
6
7
8 Engine : Call setPreviewMode and amdPreview depending on the actions
9 previewMode is the **current** preview mode
10
11 admPreview :
12 Allocate/desallocate ressources
13 Build preview window
14 Call display properly to display it
15
16 GUI_PreviewXXXX
17 UI toolkit to actually display the window
18 See GUI_ui.h to see them
19
20
21
22 copyright : (C) 2007 by mean
23 email : fixounet@free.fr
24 ***************************************************************************/
25
26 /***************************************************************************
27 * *
28 * This program is free software; you can redistribute it and/or modify *
29 * it under the terms of the GNU General Public License as published by *
30 * the Free Software Foundation; either version 2 of the License, or *
31 * (at your option) any later version. *
32 * *
33 ***************************************************************************/
34 #include "config.h"
35 #include "ADM_cpp.h"
36
37 #include "ADM_default.h"
38 #include "ADM_edit.hxx"
39 #include "ADM_render/GUI_render.h"
40 #include "ADM_commonUI/GUI_ui.h"
41 #include "ADM_preview.h"
42 #include "DIA_coreToolkit.h"
43
44 extern uint8_t UI_getPhysicalScreenSize(void* window, uint32_t *w,uint32_t *h);
45 //static void previewBlit(ADMImage *from,ADMImage *to,uint32_t startx,uint32_t starty);
46 static ADM_PREVIEW_MODE previewMode=ADM_PREVIEW_NONE;
47
48 static bool defered_display=false; /* When 1, it means we are in playback mode */
49 static float zoom=ZOOM_1_1;
50
51 /*************************************/
52 ADMImage *admPreview::rdrImage=NULL; /* Unprocessed image */
53
54 static uint32_t rdrPhysicalW=0; /* W*H of the INPUT window */
55 static uint32_t rdrPhysicalH=0;
56
57
58
59 /*************************************/
60 extern ADM_Composer *video_body;
61 /**
62 \fn getBuffer
63 */
getBuffer(void)64 ADMImage *admPreview::getBuffer(void)
65 {
66 return rdrImage;
67 }
68 /**
69 \fn getPreferedHwImageFormat
70 */
getPreferedHwImageFormat(void)71 ADM_HW_IMAGE admPreview::getPreferedHwImageFormat(void)
72 {
73 return renderGetPreferedImageFormat();
74 }
75 /**
76 \fn admPreview::setMainDimension
77 \brief Update width & height of input video
78 @param w : width
79 @param h : height
80 */
81
setMainDimension(uint32_t w,uint32_t h,float nzoom)82 void admPreview::setMainDimension(uint32_t w, uint32_t h, float nzoom)
83 {
84 destroy();
85 if(!w || !h)
86 {
87 renderDisplayResize(0,0,ZOOM_1_1);
88 UI_setDisplayName("XXXX");
89 return;
90 }
91
92 rdrImage=new ADMImageDefault(w,h);
93 rdrPhysicalW=w;
94 rdrPhysicalH=h;
95 if(nzoom==ZOOM_AUTO)
96 {
97 uint32_t phyW,phyH;
98 UI_getPhysicalScreenSize(NULL, &phyW,&phyH);
99 if(3*phyW<4*w || 3*phyH<4*h)
100 {
101 if(5*phyW<4*w || 5*phyH<4*h)
102 {
103 nzoom=ZOOM_1_4;
104 }else
105 {
106 nzoom=ZOOM_1_2;
107 }
108
109 }
110 else
111 {
112 nzoom=ZOOM_1_1;
113 }
114 }
115 zoom=nzoom;
116 renderDisplayResize(rdrPhysicalW,rdrPhysicalH,zoom);
117 // Install our hook, we will do it more than needed
118 // but it does not really harm
119 renderHookRefreshRequest(admPreview::updateImage);
120 std::string rendererName;
121 renderGetName(rendererName);
122 UI_setDisplayName(rendererName.c_str());
123 }
124 /**
125 \fn getCurrentZoom
126 */
getCurrentZoom(void)127 float admPreview::getCurrentZoom(void)
128 {
129 return zoom;
130 }
131
132 /**
133 \fn getPreviewMode
134 \brief returns current preview mode
135 @return current preview mode
136
137 */
138
getPreviewMode(void)139 ADM_PREVIEW_MODE getPreviewMode(void)
140 {
141 return previewMode;
142 }
143 /**
144 \fn changePreviewZoom
145 */
changePreviewZoom(float nzoom)146 void changePreviewZoom(float nzoom)
147 {
148 admPreview::stop();
149 ADM_info("Preview :: Change zoom %.4f->%.4f\n",zoom,nzoom);
150 zoom=nzoom;
151 renderDisplayResize(rdrPhysicalW,rdrPhysicalH,zoom);
152 admPreview::start();
153 }
154
155 /**
156 \fn setPreviewMode
157 \brief set current preview mode an update UI
158 @param mode new preview mode
159
160 */
161
setPreviewMode(ADM_PREVIEW_MODE mode)162 void setPreviewMode(ADM_PREVIEW_MODE mode)
163 {
164 previewMode=mode;
165 UI_setCurrentPreview( (int)mode);
166 }
167 /**
168 \fn deferDisplay
169 \brief Enable or disable defered display. Used by playback mode to have smooth output
170
171 */
deferDisplay(bool onoff)172 void admPreview::deferDisplay(bool onoff)
173 {
174
175 if(true==onoff)
176 {
177 renderStartPlaying();
178 defered_display=1;
179 }
180 else
181 {
182 renderStopPlaying();
183 defered_display=0;
184 }
185 }
186 /**
187 \fn admPreview::start
188 \brief start preview, reiginite preview with new parameters
189
190 */
191
start(void)192 void admPreview::start( void )
193 {
194 ADM_info("admPreview,starting\n");
195 }
196 /**
197 \fn admPreview::stop
198 \brief kill preview and associated datas
199 */
200
stop(void)201 void admPreview::stop( void )
202 {
203 renderLock();
204
205 renderUnlock();
206 }
207
208 /**
209 \fn previewBlit(ADMImage *from,ADMImage *to,uint32_t startx,uint32_t starty)
210 \brief Blit "from" to "to" at position startx,starty
211
212 void previewBlit(ADMImage *from,ADMImage *to,uint32_t startx,uint32_t starty)
213 {
214
215 from->copyTo(to,startx,starty);
216
217 }
218 /**
219 \fn displayNow
220 \brief display on screen immediately. The image has been calculated previously by update
221 */
222
displayNow(void)223 void admPreview::displayNow(void)
224 {
225 switch(previewMode)
226 {
227 case ADM_PREVIEW_NONE:
228 case ADM_PREVIEW_OUTPUT:
229 renderUpdateImage(rdrImage);
230 break;
231 default: ADM_assert(0);break;
232 }
233 }
234 /**
235 \fn cleanUp
236 \brief do the cleanup, what else ?
237 */
cleanUp(void)238 void admPreview::cleanUp(void)
239 {
240 admPreview::stop();
241
242 destroy();
243 }
244 /**
245 \fn cleanUp
246 \brief do the cleanup, what else ?
247 */
destroy(void)248 void admPreview::destroy(void)
249 {
250 ADM_info("Destroying preview\n");
251 if(rdrImage)
252 {
253 delete rdrImage;
254 rdrImage = NULL;
255 }
256 }
257 /**
258 \fn updateImage
259 */
updateImage(void)260 bool admPreview::updateImage(void)
261 {
262 UI_setFrameType( rdrImage->flags,rdrImage->_Qp);
263 if(!defered_display)
264 renderUpdateImage(rdrImage);
265 return true;
266 }
267
getFrameFlags(uint32_t * flags,uint32_t * quantiser)268 void admPreview::getFrameFlags(uint32_t *flags, uint32_t *quantiser)
269 {
270 *flags = rdrImage->flags;
271 *quantiser = rdrImage->_Qp;
272 }
273 // EOF
274