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