This is the code we showed at Uncraftivism

Dependencies:   mbed

Committer:
jarkman
Date:
Mon Dec 14 08:28:21 2009 +0000
Revision:
2:01115080f6da
Parent:
0:57f4fdadc97f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jarkman 0:57f4fdadc97f 1 #include "stdafx.h"
jarkman 0:57f4fdadc97f 2
jarkman 0:57f4fdadc97f 3 #include "mbed.h"
jarkman 0:57f4fdadc97f 4 #include "ucam.h"
jarkman 0:57f4fdadc97f 5 #include "Frame.h"
jarkman 0:57f4fdadc97f 6
jarkman 0:57f4fdadc97f 7 extern Logger pcSerial;
jarkman 0:57f4fdadc97f 8
jarkman 0:57f4fdadc97f 9 Frame* Frame::m_frames[MAX_FRAMES]; // array of reusable frames
jarkman 0:57f4fdadc97f 10
jarkman 0:57f4fdadc97f 11 Frame::Frame() // don't construct Frame yourself - call allocFrame instead
jarkman 0:57f4fdadc97f 12 {
jarkman 0:57f4fdadc97f 13 m_pixels = NULL;
jarkman 0:57f4fdadc97f 14 m_width = 0;
jarkman 0:57f4fdadc97f 15 m_height = 0;
jarkman 0:57f4fdadc97f 16 m_pixelFormat = 0;
jarkman 0:57f4fdadc97f 17 m_deleted = true;
jarkman 0:57f4fdadc97f 18 m_numPixels = 0;
jarkman 0:57f4fdadc97f 19 m_bad = false;
jarkman 0:57f4fdadc97f 20 }
jarkman 0:57f4fdadc97f 21
jarkman 0:57f4fdadc97f 22
jarkman 0:57f4fdadc97f 23 Frame::~Frame()
jarkman 0:57f4fdadc97f 24 {
jarkman 0:57f4fdadc97f 25 if( m_pixels != NULL )
jarkman 0:57f4fdadc97f 26 free( m_pixels );
jarkman 0:57f4fdadc97f 27
jarkman 0:57f4fdadc97f 28 }
jarkman 0:57f4fdadc97f 29
jarkman 0:57f4fdadc97f 30 // static - initialise the array of frames - call once at app start time
jarkman 0:57f4fdadc97f 31 void Frame::initFrames()
jarkman 0:57f4fdadc97f 32 {
jarkman 0:57f4fdadc97f 33 for( int f = 0; f < MAX_FRAMES; f ++ )
jarkman 0:57f4fdadc97f 34 m_frames[f] = NULL;
jarkman 0:57f4fdadc97f 35 }
jarkman 0:57f4fdadc97f 36
jarkman 0:57f4fdadc97f 37 //static - reuse an existing frame, or make a new one
jarkman 0:57f4fdadc97f 38 void Frame::allocFrame( Frame **frame, uint8_t pixelFormat, uint16_t width, uint16_t height, uint16_t frameSize )
jarkman 0:57f4fdadc97f 39 {
jarkman 0:57f4fdadc97f 40 for( int f = 0; f < MAX_FRAMES; f ++ )
jarkman 0:57f4fdadc97f 41 if( m_frames[f] == NULL )
jarkman 0:57f4fdadc97f 42 {
jarkman 0:57f4fdadc97f 43 m_frames[f] = new Frame();
jarkman 0:57f4fdadc97f 44 m_frames[f]->init( pixelFormat, width, height, frameSize );
jarkman 0:57f4fdadc97f 45 *frame = m_frames[f];
jarkman 0:57f4fdadc97f 46
jarkman 0:57f4fdadc97f 47 return;
jarkman 0:57f4fdadc97f 48 }
jarkman 0:57f4fdadc97f 49 else
jarkman 0:57f4fdadc97f 50 {
jarkman 0:57f4fdadc97f 51 if( m_frames[f]->m_deleted )
jarkman 0:57f4fdadc97f 52 {
jarkman 0:57f4fdadc97f 53 m_frames[f]->init( pixelFormat, width, height, frameSize );
jarkman 0:57f4fdadc97f 54 *frame = m_frames[f];
jarkman 0:57f4fdadc97f 55 return;
jarkman 0:57f4fdadc97f 56 }
jarkman 0:57f4fdadc97f 57
jarkman 0:57f4fdadc97f 58 }
jarkman 0:57f4fdadc97f 59
jarkman 0:57f4fdadc97f 60 pcSerial.printf("No free frames!\r\n");
jarkman 0:57f4fdadc97f 61 *frame = NULL;
jarkman 0:57f4fdadc97f 62
jarkman 0:57f4fdadc97f 63 }
jarkman 0:57f4fdadc97f 64
jarkman 0:57f4fdadc97f 65 //static - make an existing frame available for reuse
jarkman 0:57f4fdadc97f 66 void Frame::releaseFrame( Frame **frame )
jarkman 0:57f4fdadc97f 67 {
jarkman 0:57f4fdadc97f 68 for( int f = 0; f < MAX_FRAMES; f ++ )
jarkman 0:57f4fdadc97f 69 if( m_frames[f] == *frame )
jarkman 0:57f4fdadc97f 70 {
jarkman 0:57f4fdadc97f 71 m_frames[f]->m_deleted = true;
jarkman 0:57f4fdadc97f 72 *frame = NULL;
jarkman 0:57f4fdadc97f 73 return;
jarkman 0:57f4fdadc97f 74 }
jarkman 0:57f4fdadc97f 75 }
jarkman 0:57f4fdadc97f 76
jarkman 0:57f4fdadc97f 77 //static - make a new frame with the same parameters as an existing one, alloc a pixel buffer, but do not initialise the pixels
jarkman 0:57f4fdadc97f 78 void Frame::cloneFrame( Frame **clone, Frame* original )
jarkman 0:57f4fdadc97f 79 {
jarkman 0:57f4fdadc97f 80 allocFrame( clone, original->m_pixelFormat, original->m_width, original->m_height, original->m_frameSize );
jarkman 0:57f4fdadc97f 81
jarkman 0:57f4fdadc97f 82 }
jarkman 0:57f4fdadc97f 83
jarkman 0:57f4fdadc97f 84
jarkman 0:57f4fdadc97f 85 void Frame::init( uint8_t pixelFormat, uint16_t width, uint16_t height, uint32_t frameSize )
jarkman 0:57f4fdadc97f 86 {
jarkman 0:57f4fdadc97f 87
jarkman 0:57f4fdadc97f 88 if( m_frameSize != frameSize ) // keep the same pixel buffer if we can, to avoid fragmentation
jarkman 0:57f4fdadc97f 89 {
jarkman 0:57f4fdadc97f 90 free( m_pixels );
jarkman 0:57f4fdadc97f 91 m_pixels = (uint8_t *) malloc( frameSize );
jarkman 0:57f4fdadc97f 92 }
jarkman 0:57f4fdadc97f 93
jarkman 0:57f4fdadc97f 94 m_pixelFormat = pixelFormat;
jarkman 0:57f4fdadc97f 95 m_width = width;
jarkman 0:57f4fdadc97f 96 m_height = height;
jarkman 0:57f4fdadc97f 97 m_frameSize = frameSize;
jarkman 0:57f4fdadc97f 98 m_deleted = false;
jarkman 0:57f4fdadc97f 99 m_bad = false;
jarkman 0:57f4fdadc97f 100
jarkman 0:57f4fdadc97f 101 switch( m_pixelFormat )
jarkman 0:57f4fdadc97f 102 {
jarkman 0:57f4fdadc97f 103 case UCAM_COLOUR_2_BIT_GREY:
jarkman 0:57f4fdadc97f 104 m_bitsPerPixel = 2;
jarkman 0:57f4fdadc97f 105 break;
jarkman 0:57f4fdadc97f 106 case UCAM_COLOUR_4_BIT_GREY:
jarkman 0:57f4fdadc97f 107 m_bitsPerPixel = 4;
jarkman 0:57f4fdadc97f 108 break;
jarkman 0:57f4fdadc97f 109 case UCAM_COLOUR_8_BIT_GREY:
jarkman 0:57f4fdadc97f 110 m_bitsPerPixel = 8;
jarkman 0:57f4fdadc97f 111 break;
jarkman 0:57f4fdadc97f 112 case UCAM_COLOUR_8_BIT_COLOUR:
jarkman 0:57f4fdadc97f 113 m_bitsPerPixel = 8;
jarkman 0:57f4fdadc97f 114 break;
jarkman 0:57f4fdadc97f 115 case UCAM_COLOUR_12_BIT_COLOR:
jarkman 0:57f4fdadc97f 116 m_bitsPerPixel = 16;
jarkman 0:57f4fdadc97f 117 break;
jarkman 0:57f4fdadc97f 118 case UCAM_COLOUR_16_BIT_COLOR:
jarkman 0:57f4fdadc97f 119 m_bitsPerPixel = 16;
jarkman 0:57f4fdadc97f 120 break;
jarkman 0:57f4fdadc97f 121 case UCAM_COLOUR_JPEG:
jarkman 0:57f4fdadc97f 122 default:
jarkman 0:57f4fdadc97f 123 m_bitsPerPixel = 16; // ?? not at all sure, but we are not using frames to handle jpegs right now
jarkman 0:57f4fdadc97f 124 break;
jarkman 0:57f4fdadc97f 125 }
jarkman 0:57f4fdadc97f 126
jarkman 0:57f4fdadc97f 127 m_numPixels = (8 * m_frameSize) / m_bitsPerPixel;
jarkman 0:57f4fdadc97f 128 }
jarkman 0:57f4fdadc97f 129
jarkman 0:57f4fdadc97f 130 uint16_t Frame::getPixel( uint32_t p )
jarkman 0:57f4fdadc97f 131 {
jarkman 0:57f4fdadc97f 132 switch( m_bitsPerPixel )
jarkman 0:57f4fdadc97f 133 {
jarkman 0:57f4fdadc97f 134 case 4:
jarkman 0:57f4fdadc97f 135 if( p & 1 )
jarkman 0:57f4fdadc97f 136 return m_pixels[ p >> 1 ] & 0x0f;
jarkman 0:57f4fdadc97f 137 else
jarkman 0:57f4fdadc97f 138 return m_pixels[ p >> 1 ] >> 4;
jarkman 0:57f4fdadc97f 139
jarkman 0:57f4fdadc97f 140
jarkman 0:57f4fdadc97f 141 case 8:
jarkman 0:57f4fdadc97f 142 return m_pixels[ p ];
jarkman 0:57f4fdadc97f 143
jarkman 0:57f4fdadc97f 144 case 16:
jarkman 0:57f4fdadc97f 145 default:
jarkman 0:57f4fdadc97f 146 return ((m_pixels[p<<1]) << 8) + m_pixels[1 + (p<<1) ]; // todo - check bytes order
jarkman 0:57f4fdadc97f 147 }
jarkman 0:57f4fdadc97f 148 }
jarkman 0:57f4fdadc97f 149
jarkman 0:57f4fdadc97f 150 void Frame::setPixel( uint32_t p, uint16_t val )
jarkman 0:57f4fdadc97f 151 {
jarkman 0:57f4fdadc97f 152 switch( m_bitsPerPixel )
jarkman 0:57f4fdadc97f 153 {
jarkman 0:57f4fdadc97f 154 case 4:
jarkman 0:57f4fdadc97f 155 if( p & 1 )
jarkman 0:57f4fdadc97f 156 m_pixels[ p >> 1 ] = ( m_pixels[ p >> 1 ] & 0xf0) | (val & 0x0f);
jarkman 0:57f4fdadc97f 157 else
jarkman 0:57f4fdadc97f 158 m_pixels[ p >> 1 ] = ( m_pixels[ p >> 1 ] & 0x0f) | ((val & 0x0f) << 4 );
jarkman 0:57f4fdadc97f 159 break;
jarkman 0:57f4fdadc97f 160
jarkman 0:57f4fdadc97f 161 case 8:
jarkman 0:57f4fdadc97f 162 m_pixels[ p ] = (uint8_t) val;
jarkman 0:57f4fdadc97f 163 break;
jarkman 0:57f4fdadc97f 164 case 16:
jarkman 0:57f4fdadc97f 165 default:
jarkman 0:57f4fdadc97f 166 m_pixels[p<<1] = val>>8;
jarkman 0:57f4fdadc97f 167 m_pixels[1 + (p<<1) ] = val & 0xff;
jarkman 0:57f4fdadc97f 168 break;
jarkman 0:57f4fdadc97f 169 }
jarkman 0:57f4fdadc97f 170
jarkman 0:57f4fdadc97f 171
jarkman 0:57f4fdadc97f 172 }
jarkman 0:57f4fdadc97f 173
jarkman 0:57f4fdadc97f 174 void Frame::writeToFile( char *filename )
jarkman 0:57f4fdadc97f 175 {
jarkman 0:57f4fdadc97f 176 pcSerial.printf("writeToFile - %s\r\n", filename);
jarkman 0:57f4fdadc97f 177
jarkman 0:57f4fdadc97f 178 FILE *rawFile = fopen(filename, FILE_WRITE_STRING); // "w" or "wb" for Windows
jarkman 0:57f4fdadc97f 179
jarkman 0:57f4fdadc97f 180 fwrite( &m_pixelFormat, 1, 1, rawFile );
jarkman 0:57f4fdadc97f 181 fwrite( &m_width, 1, 2, rawFile );
jarkman 0:57f4fdadc97f 182 fwrite( &m_height, 1, 2, rawFile );
jarkman 0:57f4fdadc97f 183 fwrite( &m_frameSize, 1, 4, rawFile );
jarkman 0:57f4fdadc97f 184
jarkman 0:57f4fdadc97f 185 fwrite( m_pixels, 1, m_frameSize, rawFile );
jarkman 0:57f4fdadc97f 186
jarkman 0:57f4fdadc97f 187 fclose( rawFile );
jarkman 0:57f4fdadc97f 188
jarkman 0:57f4fdadc97f 189 }
jarkman 0:57f4fdadc97f 190
jarkman 0:57f4fdadc97f 191 // static
jarkman 0:57f4fdadc97f 192 void Frame::readFromFile( char *filename, Frame **frame )
jarkman 0:57f4fdadc97f 193 {
jarkman 0:57f4fdadc97f 194 *frame = NULL;
jarkman 0:57f4fdadc97f 195
jarkman 0:57f4fdadc97f 196 pcSerial.printf("readFromFile - %s\r\n", filename);
jarkman 0:57f4fdadc97f 197
jarkman 0:57f4fdadc97f 198 FILE *rawFile = fopen(filename, FILE_READ_STRING);
jarkman 0:57f4fdadc97f 199 if( rawFile == NULL )
jarkman 0:57f4fdadc97f 200 {
jarkman 0:57f4fdadc97f 201 pcSerial.printf("readFromFile - failed to open %s\r\n", filename);
jarkman 0:57f4fdadc97f 202 return;
jarkman 0:57f4fdadc97f 203 }
jarkman 0:57f4fdadc97f 204
jarkman 0:57f4fdadc97f 205 uint8_t pixelFormat;
jarkman 0:57f4fdadc97f 206 uint16_t width;
jarkman 0:57f4fdadc97f 207 uint16_t height;
jarkman 0:57f4fdadc97f 208 uint32_t frameSize;
jarkman 0:57f4fdadc97f 209
jarkman 0:57f4fdadc97f 210 if( 1 == fread( &pixelFormat, 1, 1, rawFile ))
jarkman 0:57f4fdadc97f 211 if( 2 == fread( &width, 1, 2, rawFile ))
jarkman 0:57f4fdadc97f 212 if( 2 == fread( &height, 1, 2, rawFile ))
jarkman 0:57f4fdadc97f 213 if( 4 == fread( &frameSize, 1, 4, rawFile ))
jarkman 0:57f4fdadc97f 214 {
jarkman 0:57f4fdadc97f 215
jarkman 0:57f4fdadc97f 216 allocFrame( frame, pixelFormat, width, height, frameSize );
jarkman 0:57f4fdadc97f 217
jarkman 0:57f4fdadc97f 218 if( frameSize != fread( (*frame)->m_pixels, 1, frameSize, rawFile ))
jarkman 0:57f4fdadc97f 219 {
jarkman 0:57f4fdadc97f 220 releaseFrame( frame );
jarkman 0:57f4fdadc97f 221 pcSerial.printf("readFromFile - bad size");
jarkman 0:57f4fdadc97f 222 }
jarkman 0:57f4fdadc97f 223 }
jarkman 0:57f4fdadc97f 224
jarkman 0:57f4fdadc97f 225 fclose( rawFile );
jarkman 0:57f4fdadc97f 226
jarkman 0:57f4fdadc97f 227 }