As of Monday morning, so this is the code we showed at Uncraftivism.

Dependencies:   mbed

Committer:
voidnoise
Date:
Mon Dec 14 08:25:07 2009 +0000
Revision:
1:5d20e168f467
Parent:
0:da6a22da11a2

        

Who changed what in which revision?

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