BaseJpegDeocde exampe program
Dependencies: BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos
Fork of BaseJpegDecode by
example_SimpleJpegDecode.cpp@4:7d88de31c55a, 2012-10-30 (annotated)
- Committer:
- va009039
- Date:
- Tue Oct 30 15:35:36 2012 +0000
- Revision:
- 4:7d88de31c55a
- Child:
- 5:033432f9baf3
add simpleJpegDecode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 4:7d88de31c55a | 1 | #if 1 |
va009039 | 4:7d88de31c55a | 2 | // |
va009039 | 4:7d88de31c55a | 3 | // split jpeg to bmp files |
va009039 | 4:7d88de31c55a | 4 | // |
va009039 | 4:7d88de31c55a | 5 | #include "mbed.h" |
va009039 | 4:7d88de31c55a | 6 | #include "SimpleJpegDecode.h" |
va009039 | 4:7d88de31c55a | 7 | #include "bmp24.h" |
va009039 | 4:7d88de31c55a | 8 | #include "uvc.h" |
va009039 | 4:7d88de31c55a | 9 | #include "msc.h" |
va009039 | 4:7d88de31c55a | 10 | |
va009039 | 4:7d88de31c55a | 11 | #define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; |
va009039 | 4:7d88de31c55a | 12 | |
va009039 | 4:7d88de31c55a | 13 | DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); |
va009039 | 4:7d88de31c55a | 14 | Serial pc(USBTX, USBRX); |
va009039 | 4:7d88de31c55a | 15 | |
va009039 | 4:7d88de31c55a | 16 | SimpleJpegDecode* decode = NULL; |
va009039 | 4:7d88de31c55a | 17 | bmp24* bmp = NULL; |
va009039 | 4:7d88de31c55a | 18 | |
va009039 | 4:7d88de31c55a | 19 | int offset_x = 0; |
va009039 | 4:7d88de31c55a | 20 | int offset_y = 0; |
va009039 | 4:7d88de31c55a | 21 | void callback(int x, int y, uint8_t* yuv) |
va009039 | 4:7d88de31c55a | 22 | { |
va009039 | 4:7d88de31c55a | 23 | led1 = !led1; |
va009039 | 4:7d88de31c55a | 24 | if (bmp) { |
va009039 | 4:7d88de31c55a | 25 | uint8_t rgb[3]; |
va009039 | 4:7d88de31c55a | 26 | int r = yuv[0] + (yuv[2]-128) * 1.4020; |
va009039 | 4:7d88de31c55a | 27 | if (r < 0) { |
va009039 | 4:7d88de31c55a | 28 | r = 0; |
va009039 | 4:7d88de31c55a | 29 | } else if (r > 255) { |
va009039 | 4:7d88de31c55a | 30 | r = 255; |
va009039 | 4:7d88de31c55a | 31 | } |
va009039 | 4:7d88de31c55a | 32 | rgb[0] = r; |
va009039 | 4:7d88de31c55a | 33 | int g = yuv[0] - (yuv[1]-128) * 0.3441 - (yuv[2]-128) * 0.7139; |
va009039 | 4:7d88de31c55a | 34 | if (g < 0) { |
va009039 | 4:7d88de31c55a | 35 | g = 0; |
va009039 | 4:7d88de31c55a | 36 | } else if (g > 255) { |
va009039 | 4:7d88de31c55a | 37 | g = 255; |
va009039 | 4:7d88de31c55a | 38 | } |
va009039 | 4:7d88de31c55a | 39 | rgb[1] = g; |
va009039 | 4:7d88de31c55a | 40 | int b = yuv[0] + (yuv[1]-128) * 1.7718 - (yuv[2]-128) * 0.0012; |
va009039 | 4:7d88de31c55a | 41 | if (b < 0) { |
va009039 | 4:7d88de31c55a | 42 | b = 0; |
va009039 | 4:7d88de31c55a | 43 | } else if (b > 255) { |
va009039 | 4:7d88de31c55a | 44 | b = 255; |
va009039 | 4:7d88de31c55a | 45 | } |
va009039 | 4:7d88de31c55a | 46 | rgb[2] = b; |
va009039 | 4:7d88de31c55a | 47 | bmp->point(x - offset_x, y - offset_y, rgb); |
va009039 | 4:7d88de31c55a | 48 | } |
va009039 | 4:7d88de31c55a | 49 | } |
va009039 | 4:7d88de31c55a | 50 | |
va009039 | 4:7d88de31c55a | 51 | int main() { |
va009039 | 4:7d88de31c55a | 52 | pc.baud(921600); |
va009039 | 4:7d88de31c55a | 53 | printf("%s\n", __FILE__); |
va009039 | 4:7d88de31c55a | 54 | |
va009039 | 4:7d88de31c55a | 55 | msc* usb = new msc("usb"); |
va009039 | 4:7d88de31c55a | 56 | int r = usb->setup(); |
va009039 | 4:7d88de31c55a | 57 | ASSERT(r == 0); |
va009039 | 4:7d88de31c55a | 58 | |
va009039 | 4:7d88de31c55a | 59 | bmp = new bmp24; |
va009039 | 4:7d88de31c55a | 60 | ASSERT(bmp); |
va009039 | 4:7d88de31c55a | 61 | |
va009039 | 4:7d88de31c55a | 62 | decode = new SimpleJpegDecode; |
va009039 | 4:7d88de31c55a | 63 | ASSERT(decode); |
va009039 | 4:7d88de31c55a | 64 | decode->setOnResult(callback); |
va009039 | 4:7d88de31c55a | 65 | |
va009039 | 4:7d88de31c55a | 66 | const char* input_file = "/usb/input.jpg"; |
va009039 | 4:7d88de31c55a | 67 | printf("input: %s\n", input_file); |
va009039 | 4:7d88de31c55a | 68 | int n = 0; |
va009039 | 4:7d88de31c55a | 69 | for(offset_y = 0; offset_y < 240; offset_y += 48) { |
va009039 | 4:7d88de31c55a | 70 | for(offset_x = 0; offset_x < 320; offset_x += 64) { |
va009039 | 4:7d88de31c55a | 71 | bmp->clear(); |
va009039 | 4:7d88de31c55a | 72 | decode->clear(); |
va009039 | 4:7d88de31c55a | 73 | FILE *fp = fopen(input_file, "rb"); |
va009039 | 4:7d88de31c55a | 74 | ASSERT(fp != NULL); |
va009039 | 4:7d88de31c55a | 75 | while(!feof(fp)) { |
va009039 | 4:7d88de31c55a | 76 | int c = fgetc(fp); |
va009039 | 4:7d88de31c55a | 77 | decode->input(c); |
va009039 | 4:7d88de31c55a | 78 | led2 = !led2; |
va009039 | 4:7d88de31c55a | 79 | } |
va009039 | 4:7d88de31c55a | 80 | fclose(fp); |
va009039 | 4:7d88de31c55a | 81 | char path[32]; |
va009039 | 4:7d88de31c55a | 82 | sprintf(path, "/usb/output%02d.bmp", n++); |
va009039 | 4:7d88de31c55a | 83 | printf("offset: (%3d,%3d) %s\n", offset_x, offset_y, path); |
va009039 | 4:7d88de31c55a | 84 | bmp->writeFile(path); |
va009039 | 4:7d88de31c55a | 85 | led3 = !led3; |
va009039 | 4:7d88de31c55a | 86 | } |
va009039 | 4:7d88de31c55a | 87 | led4 = !led4; |
va009039 | 4:7d88de31c55a | 88 | } |
va009039 | 4:7d88de31c55a | 89 | printf("width: %d, height: %d, yblock: %d\n", decode->width, decode->height, decode->m_yblocks); |
va009039 | 4:7d88de31c55a | 90 | exit(1); |
va009039 | 4:7d88de31c55a | 91 | } |
va009039 | 4:7d88de31c55a | 92 | #endif |