show_yuv.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <unistd.h>
00024 #include <iostream>
00025
00026 #include <fvwidgets/image_display.h>
00027 #include <fvutils/color/conversions.h>
00028 #include <fvutils/color/yuv.h>
00029
00030 #include <SDL.h>
00031
00032 using namespace std;
00033 using namespace firevision;
00034
00035
00036
00037
00038
00039 class YUVSpaceDemo
00040 {
00041 public:
00042
00043
00044
00045 YUVSpaceDemo(unsigned char *yuv_buffer)
00046 {
00047 brightness = 128;
00048 buffer = yuv_buffer;
00049 }
00050
00051
00052 void
00053 fill()
00054 {
00055 unsigned char *yp = buffer;
00056 unsigned char *up = YUV422_PLANAR_U_PLANE(buffer, 512, 512);
00057 unsigned char *vp = YUV422_PLANAR_V_PLANE(buffer, 512, 512);
00058
00059 for (int v = 255; v >= 0 ; --v) {
00060 for (int u = 0; u < 256; ++u) {
00061 *yp++ = brightness;
00062 *yp++ = brightness;
00063 *up++ = u;
00064 *vp++ = v;
00065 }
00066
00067 memcpy(yp, (yp - 512), 512);
00068 yp += 512;
00069 memcpy(up, (up - 256), 256);
00070 memcpy(vp, (vp - 256), 256);
00071 up += 256;
00072 vp += 256;
00073 }
00074 }
00075
00076
00077
00078
00079 void brightness_up(unsigned int val = 1)
00080 {
00081 if ( brightness != 255 ) {
00082 if ( (brightness + val) < 255 ) {
00083 brightness += val;
00084 } else {
00085 brightness = 255;
00086 }
00087 printf("New brightness: %i\n", brightness);
00088 fill();
00089 }
00090 }
00091
00092
00093
00094
00095 void brightness_down(unsigned int val = 1) {
00096 if ( brightness != 0 ) {
00097 if ( (brightness - (int)val) > 0 ) {
00098 brightness -= val;
00099 } else {
00100 brightness = 0;
00101 }
00102 printf("New brightness: %i\n", brightness);
00103 fill();
00104 }
00105 }
00106
00107 private:
00108 unsigned char *buffer;
00109 int brightness;
00110
00111 };
00112
00113
00114 int
00115 main( int argc, char **argv )
00116 {
00117
00118 unsigned int width = 512;
00119 unsigned int height = 512;
00120
00121 unsigned char *yuv_buffer = malloc_buffer(YUV422_PLANAR, width, height);
00122 YUVSpaceDemo *yuvspace = new YUVSpaceDemo(yuv_buffer);
00123 ImageDisplay *display = new ImageDisplay(width, height);
00124
00125 cout << endl << endl
00126 << " V" << endl
00127 << " ^" << endl
00128 << " |" << endl
00129 << " +--> U" << endl << endl;
00130
00131 yuvspace->fill();
00132 display->show(yuv_buffer);
00133
00134 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
00135
00136 bool quit = false;
00137 while (! quit) {
00138 SDL_Event event;
00139 if ( SDL_WaitEvent(&event) ) {
00140 switch (event.type) {
00141 case SDL_QUIT:
00142 quit = true;
00143 break;
00144 case SDL_KEYDOWN:
00145 if ( event.key.keysym.sym == SDLK_UP ) {
00146 yuvspace->brightness_up();
00147 display->show(yuv_buffer);
00148 } else if ( event.key.keysym.sym == SDLK_DOWN ) {
00149 yuvspace->brightness_down();
00150 display->show(yuv_buffer);
00151 } else if ( event.key.keysym.sym == SDLK_PAGEUP ) {
00152 yuvspace->brightness_up(20);
00153 display->show(yuv_buffer);
00154 } else if ( event.key.keysym.sym == SDLK_PAGEDOWN ) {
00155 yuvspace->brightness_down(20);
00156 display->show(yuv_buffer);
00157 } else if ( event.key.keysym.sym == SDLK_ESCAPE ) {
00158 quit = true;
00159 } else if ( event.key.keysym.sym == SDLK_q ) {
00160 quit = true;
00161 }
00162 break;
00163 default:
00164 break;
00165 }
00166 }
00167 }
00168
00169 free(yuv_buffer);
00170 delete display;
00171 delete yuvspace;
00172 }