BaseJpegDeocde exampe program
Dependencies: BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos
Fork of BaseJpegDecode by
Diff: example1_c270.cpp
- Revision:
- 0:7121d9fb45f4
- Child:
- 2:697ebeb8336f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example1_c270.cpp Sun Oct 07 12:03:40 2012 +0000 @@ -0,0 +1,84 @@ +#if 1 +#include "mbed.h" +#include "BaseJpegDecode.h" +#include "uvc.h" + +// Logitech C270 +#define WIDTH 320 +#define HEIGHT 176 + +#define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; + +DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); +Serial pc(USBTX, USBRX); + +class CalcCenter : public BaseJpegDecode { +public: + int y_center, x_center; + int m_x_sum, m_y_sum, m_sum; + int8_t m_buf[WIDTH/16*HEIGHT/8]; + virtual void outputDC(int mcu, int block, int value) { + if (mcu >= (WIDTH/16*HEIGHT/8)) { + return; + } + if (block == 3) { // 0-1:Y 2:Cb 3:Cr + m_buf[mcu] = value; // debug + if (value >= 2) { // red + m_x_sum += value*(mcu%(WIDTH/16)); + m_y_sum += value*(mcu/(WIDTH/16)); + m_sum += value; + } + } + } + virtual void outputAC(int mcu, int block, int scan, int value){}; + virtual void outputMARK(uint8_t c){ + if (c == 0xd9) { // EOI + if(m_sum == 0) { + x_center = y_center = -1; // not found + } else { + x_center = m_x_sum / m_sum; + y_center = m_y_sum / m_sum; + } + m_x_sum = m_y_sum = m_sum = 0; // reset + led2 = !led2; + } + }; +}; + +CalcCenter* calc = NULL; + +void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) +{ + if (calc) { + calc->input(buf+12, len-12); + } + led1 = buf[1]&1; // FID +} + +int main() { + pc.baud(921600); + printf("%s\n", __FILE__); + + calc = new CalcCenter; + ASSERT(calc); + uvc* cam = new uvc; + ASSERT(cam); + cam->SetImageSize(WIDTH, HEIGHT); + cam->SetFrameInterval(2000000); // 5.0fps + cam->setOnResult(callback_motion_jpeg); + ASSERT(cam->setup() >= 0); + while(1) { + printf("\n"); // start debug dump + for(int y = 0; y < HEIGHT/8; y++) { + for(int x = 0; x < WIDTH/16; x++) { + printf("%+3d,", calc->m_buf[y*WIDTH/16+x]); + cam->poll(); + } + printf("\n"); + } + printf("red:(%d,%d)\n", calc->x_center, calc->y_center); + cam->wait_ms(500); + led3 = !led3; + } +} +#endif