BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

Committer:
va009039
Date:
Thu Oct 25 11:02:17 2012 +0000
Revision:
3:2709bbf8baae
support DQT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:2709bbf8baae 1 #if 1
va009039 3:2709bbf8baae 2 //
va009039 3:2709bbf8baae 3 // dump YCrCb
va009039 3:2709bbf8baae 4 // [Y0, Y1],
va009039 3:2709bbf8baae 5 // (Cr, Cb),
va009039 3:2709bbf8baae 6 //
va009039 3:2709bbf8baae 7 #include "mbed.h"
va009039 3:2709bbf8baae 8 #include "BaseJpegDecode.h"
va009039 3:2709bbf8baae 9 #include "uvc.h"
va009039 3:2709bbf8baae 10 #include "Terminal.h"
va009039 3:2709bbf8baae 11
va009039 3:2709bbf8baae 12 // Logitech C270
va009039 3:2709bbf8baae 13 #define WIDTH 160
va009039 3:2709bbf8baae 14 #define HEIGHT 120
va009039 3:2709bbf8baae 15
va009039 3:2709bbf8baae 16 #define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 3:2709bbf8baae 17
va009039 3:2709bbf8baae 18 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
va009039 3:2709bbf8baae 19 Terminal term(USBTX, USBRX);
va009039 3:2709bbf8baae 20
va009039 3:2709bbf8baae 21 class Decode1 : public BaseJpegDecode {
va009039 3:2709bbf8baae 22 public:
va009039 3:2709bbf8baae 23 int16_t m_y0[WIDTH/16*HEIGHT/8];
va009039 3:2709bbf8baae 24 int16_t m_y1[WIDTH/16*HEIGHT/8];
va009039 3:2709bbf8baae 25 int16_t m_cb[WIDTH/16*HEIGHT/8];
va009039 3:2709bbf8baae 26 int16_t m_cr[WIDTH/16*HEIGHT/8];
va009039 3:2709bbf8baae 27 virtual void outputDC(int mcu, int block, int value) {
va009039 3:2709bbf8baae 28 if (mcu >= (WIDTH/16*HEIGHT/8)) {
va009039 3:2709bbf8baae 29 return;
va009039 3:2709bbf8baae 30 }
va009039 3:2709bbf8baae 31 switch(block) { // 0-1:Y 2:Cb 3:Cr
va009039 3:2709bbf8baae 32 case 0: m_y0[mcu] = value * qt[0][0]; break;
va009039 3:2709bbf8baae 33 case 1: m_y1[mcu] = value * qt[0][0]; break;
va009039 3:2709bbf8baae 34 case 2: m_cb[mcu] = value * qt[1][0]; break;
va009039 3:2709bbf8baae 35 case 3: m_cr[mcu] = value * qt[1][0]; break;
va009039 3:2709bbf8baae 36 }
va009039 3:2709bbf8baae 37 }
va009039 3:2709bbf8baae 38 virtual void outputAC(int mcu, int block, int scan, int value){};
va009039 3:2709bbf8baae 39 virtual void outputMARK(uint8_t c){
va009039 3:2709bbf8baae 40 if (c == 0xd9) { // EOI
va009039 3:2709bbf8baae 41 led2 = !led2;
va009039 3:2709bbf8baae 42 }
va009039 3:2709bbf8baae 43 };
va009039 3:2709bbf8baae 44 };
va009039 3:2709bbf8baae 45
va009039 3:2709bbf8baae 46 Decode1* decode = NULL;
va009039 3:2709bbf8baae 47
va009039 3:2709bbf8baae 48 void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len)
va009039 3:2709bbf8baae 49 {
va009039 3:2709bbf8baae 50 if (decode) {
va009039 3:2709bbf8baae 51 decode->input(buf+12, len-12);
va009039 3:2709bbf8baae 52 }
va009039 3:2709bbf8baae 53 led1 = buf[1]&1; // FID
va009039 3:2709bbf8baae 54 }
va009039 3:2709bbf8baae 55
va009039 3:2709bbf8baae 56 int main() {
va009039 3:2709bbf8baae 57 term.baud(921600);
va009039 3:2709bbf8baae 58 printf("%s\n", __FILE__);
va009039 3:2709bbf8baae 59
va009039 3:2709bbf8baae 60 decode = new Decode1;
va009039 3:2709bbf8baae 61 ASSERT(decode);
va009039 3:2709bbf8baae 62 uvc* cam = new uvc;
va009039 3:2709bbf8baae 63 ASSERT(cam);
va009039 3:2709bbf8baae 64 cam->SetImageSize(WIDTH, HEIGHT);
va009039 3:2709bbf8baae 65 cam->SetFrameInterval(2000000); // 5.0fps
va009039 3:2709bbf8baae 66 cam->setOnResult(callback_motion_jpeg);
va009039 3:2709bbf8baae 67 ASSERT(cam->setup() >= 0);
va009039 3:2709bbf8baae 68 term.cls();
va009039 3:2709bbf8baae 69 while(1) {
va009039 3:2709bbf8baae 70 int column = 0;
va009039 3:2709bbf8baae 71 term.locate(0, column++);
va009039 3:2709bbf8baae 72 term.printf("Y: qt:");
va009039 3:2709bbf8baae 73 for(int i = 0; i < 16; i++) {
va009039 3:2709bbf8baae 74 term.printf(" %d", decode->qt[0][i]);
va009039 3:2709bbf8baae 75 }
va009039 3:2709bbf8baae 76 term.printf("]");
va009039 3:2709bbf8baae 77 for(int y = 0; y < HEIGHT/8; y++) {
va009039 3:2709bbf8baae 78 term.locate(0, column++);
va009039 3:2709bbf8baae 79 for(int x = 0; x < WIDTH/16; x++) {
va009039 3:2709bbf8baae 80 int mcu = y*WIDTH/16+x;
va009039 3:2709bbf8baae 81 term.printf("%+5d,%+5d,", decode->m_y0[mcu], decode->m_y1[mcu]);
va009039 3:2709bbf8baae 82 cam->poll();
va009039 3:2709bbf8baae 83 }
va009039 3:2709bbf8baae 84 }
va009039 3:2709bbf8baae 85 term.locate(0, column++);
va009039 3:2709bbf8baae 86 term.printf("CbCr: [qt:");
va009039 3:2709bbf8baae 87 for(int i = 0; i < 16; i++) {
va009039 3:2709bbf8baae 88 term.printf(" %d", decode->qt[1][i]);
va009039 3:2709bbf8baae 89 }
va009039 3:2709bbf8baae 90 term.printf("]");
va009039 3:2709bbf8baae 91 for(int y = 0; y < HEIGHT/8; y++) {
va009039 3:2709bbf8baae 92 term.locate(0, column++);
va009039 3:2709bbf8baae 93 for(int x = 0; x < WIDTH/16; x++) {
va009039 3:2709bbf8baae 94 int mcu = y*WIDTH/16+x;
va009039 3:2709bbf8baae 95 term.printf("%+5d,%+5d|", decode->m_cb[mcu], decode->m_cr[mcu]);
va009039 3:2709bbf8baae 96 cam->poll();
va009039 3:2709bbf8baae 97 }
va009039 3:2709bbf8baae 98 }
va009039 3:2709bbf8baae 99 cam->wait_ms(500);
va009039 3:2709bbf8baae 100 led3 = !led3;
va009039 3:2709bbf8baae 101 }
va009039 3:2709bbf8baae 102 }
va009039 3:2709bbf8baae 103 #endif