sdlgrab.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Component/ComponentOpts.H"
00039 #include "Component/ModelManager.H"
00040 #include "Devices/DeviceOpts.H"
00041 #include "Devices/FrameGrabberConfigurator.H"
00042 #include "Image/Image.H"
00043 #include "Psycho/PsychoDisplay.H"
00044 #include "Raster/GenericFrame.H"
00045 #include "Transport/FrameIstream.H"
00046 #include "Util/AllocAux.H"
00047 #include "Util/Types.H"
00048 #include "Util/csignals.H"
00049 #include "Video/VideoFrame.H"
00050 #include "rutz/time.h"
00051
00052 #include <SDL/SDL.h>
00053 #include <unistd.h>
00054
00055
00056 int submain(const int argc, char** argv)
00057 {
00058 MYLOGVERB = LOG_INFO;
00059
00060
00061 volatile int signum = 0;
00062 catchsignals(&signum);
00063
00064
00065 ModelManager manager("SDLgrab");
00066
00067
00068 nub::soft_ref<FrameGrabberConfigurator>
00069 fgc(new FrameGrabberConfigurator(manager));
00070 manager.addSubComponent(fgc);
00071
00072 nub::soft_ref<PsychoDisplay> d(new PsychoDisplay(manager));
00073 manager.addSubComponent(d);
00074
00075 nub::soft_ref<EventLog> el(new EventLog(manager));
00076 manager.addSubComponent(el);
00077
00078 d->setEventLog(el);
00079
00080
00081 manager.exportOptions(MC_RECURSE);
00082 manager.setOptionValString(&OPT_FrameGrabberType, "V4L");
00083 manager.setOptionValString(&OPT_FrameGrabberMode, "UYVY");
00084 manager.setOptionValString(&OPT_FrameGrabberDims, "640x480");
00085 manager.setOptionValString(&OPT_DeinterlacerType, "Bob");
00086
00087 manager.setOptionValString(&OPT_EventLogFileName, "psychodata.psy");
00088
00089
00090 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false)
00091 return 1;
00092
00093
00094 nub::soft_ref<FrameIstream> gb = fgc -> getFrameGrabber();
00095
00096
00097 manager.start();
00098
00099 d->setDesiredRefreshDelayUsec(gb->getNaturalFrameTime().usecs(), 0.2F);
00100
00101
00102 while (1)
00103 {
00104
00105 usleep(250000);
00106 sync();
00107
00108 d->clearScreen();
00109 d->displayText("[SPACE] start/stop - [ESC] quit");
00110
00111 while (1)
00112 {
00113 const char key = d->checkForKey();
00114 if (key == ' ') break;
00115 else
00116 {
00117 if (signum != 0)
00118 {
00119 LINFO("quitting because %s was caught", signame(signum));
00120 return -1;
00121 }
00122
00123 usleep(10000);
00124 }
00125 }
00126
00127
00128 d->createVideoOverlay(gb->peekFrameSpec().videoFormat);
00129
00130
00131 gb->startStream();
00132
00133
00134 bool keepgoing = true; int frame = 0;
00135 rutz::time start = rutz::time::wall_clock_now();
00136 while (keepgoing)
00137 {
00138 if (signum != 0)
00139 {
00140 LINFO("quitting because %s was caught", signame(signum));
00141 return -1;
00142 }
00143
00144
00145 d->displayVideoOverlay(gb->readFrame().asVideo(),
00146 frame, SDLdisplay::NO_WAIT);
00147
00148 ++frame;
00149
00150 const char key = d->checkForKey();
00151
00152
00153
00154 if (key == ' ') keepgoing = false;
00155 }
00156 rutz::time stop = rutz::time::wall_clock_now();
00157
00158 invt_allocation_show_stats();
00159
00160 const double secs = (stop-start).sec();
00161 LINFO("%d frames in %.02f sec (~%.02f fps)", frame, secs, frame/secs);
00162
00163
00164
00165
00166
00167 d->destroyYUVoverlay();
00168 d->clearScreen();
00169 d->clearScreen();
00170 }
00171
00172
00173 manager.stop();
00174
00175
00176 return 0;
00177 }
00178
00179 extern "C" int main(const int argc, char** argv)
00180 {
00181 try
00182 {
00183 return submain(argc, argv);
00184 }
00185 catch (...)
00186 {
00187 REPORT_CURRENT_EXCEPTION;
00188 }
00189
00190 return 1;
00191 }
00192
00193
00194
00195
00196
00197