BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

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?

UserRevisionLine numberNew contents of line
va009039 4:7d88de31c55a 1 #include "SimpleJpegDecode.h"
va009039 4:7d88de31c55a 2
va009039 4:7d88de31c55a 3 #define DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);} while(0);
va009039 4:7d88de31c55a 4 #define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 4:7d88de31c55a 5
va009039 4:7d88de31c55a 6 SimpleJpegDecode::SimpleJpegDecode()
va009039 4:7d88de31c55a 7 {
va009039 4:7d88de31c55a 8 for(int i = 0; i < 6; i++) {
va009039 4:7d88de31c55a 9 m_block_data[i] = new uint8_t[64];
va009039 4:7d88de31c55a 10 ASSERT(m_block_data[i]);
va009039 4:7d88de31c55a 11 }
va009039 4:7d88de31c55a 12 clearOnResult();
va009039 4:7d88de31c55a 13 }
va009039 4:7d88de31c55a 14
va009039 4:7d88de31c55a 15 void SimpleJpegDecode::output(int mcu, int block, int scan, int value)
va009039 4:7d88de31c55a 16 {
va009039 4:7d88de31c55a 17 int sc = (block < m_yblocks) ? 0 : 1;
va009039 4:7d88de31c55a 18 inputBLOCK(mcu, block, scan, value * qt[sc][scan]);
va009039 4:7d88de31c55a 19 }
va009039 4:7d88de31c55a 20
va009039 4:7d88de31c55a 21 void SimpleJpegDecode::outputDC(int mcu, int block, int value)
va009039 4:7d88de31c55a 22 {
va009039 4:7d88de31c55a 23 output(mcu, block, 0, value);
va009039 4:7d88de31c55a 24 DC_count++;
va009039 4:7d88de31c55a 25 }
va009039 4:7d88de31c55a 26
va009039 4:7d88de31c55a 27 void SimpleJpegDecode::outputAC(int mcu, int block, int scan, int value)
va009039 4:7d88de31c55a 28 {
va009039 4:7d88de31c55a 29 output(mcu, block, scan, value);
va009039 4:7d88de31c55a 30 AC_count++;
va009039 4:7d88de31c55a 31 }
va009039 4:7d88de31c55a 32
va009039 4:7d88de31c55a 33 void SimpleJpegDecode::outputMARK(uint8_t c)
va009039 4:7d88de31c55a 34 {
va009039 4:7d88de31c55a 35 }
va009039 4:7d88de31c55a 36
va009039 4:7d88de31c55a 37 void SimpleJpegDecode::outputBLOCK(int mcu, int block, uint8_t* values)
va009039 4:7d88de31c55a 38 {
va009039 4:7d88de31c55a 39 BLOCK_count++;
va009039 4:7d88de31c55a 40
va009039 4:7d88de31c55a 41 memcpy(m_block_data[block], values, 64);
va009039 4:7d88de31c55a 42 if (block < m_yblocks+1) {
va009039 4:7d88de31c55a 43 return;
va009039 4:7d88de31c55a 44 }
va009039 4:7d88de31c55a 45 int mcu_x = mcu % (width/16);
va009039 4:7d88de31c55a 46 int mcu_y = mcu / (width/16);
va009039 4:7d88de31c55a 47 uint8_t yuv[3];
va009039 4:7d88de31c55a 48 if (m_yblocks == 2) {
va009039 4:7d88de31c55a 49 for(int y = 0; y < 8; y++) {
va009039 4:7d88de31c55a 50 for(int x = 0; x < 16; x++) {
va009039 4:7d88de31c55a 51 yuv[0] = m_block_data[x/8][y*8+x%8];
va009039 4:7d88de31c55a 52 yuv[1] = m_block_data[2][y*8+x/2];
va009039 4:7d88de31c55a 53 yuv[2] = m_block_data[3][y*8+x/2];
va009039 4:7d88de31c55a 54 onResult(mcu_x * 16 + x, mcu_y * 8 + y, yuv);
va009039 4:7d88de31c55a 55 }
va009039 4:7d88de31c55a 56 }
va009039 4:7d88de31c55a 57 } else if (m_yblocks == 4) {
va009039 4:7d88de31c55a 58 for(int y = 0; y < 16; y++) {
va009039 4:7d88de31c55a 59 for(int x = 0; x < 16; x++) {
va009039 4:7d88de31c55a 60 int block = (y/8)*2+x/8;
va009039 4:7d88de31c55a 61 yuv[0] = m_block_data[block][(y%8)*8+x%8];
va009039 4:7d88de31c55a 62 yuv[1] = m_block_data[4][(y/2)*8+x/2];
va009039 4:7d88de31c55a 63 yuv[2] = m_block_data[5][(y/2)*8+x/2];
va009039 4:7d88de31c55a 64 onResult(mcu_x * 16 + x, mcu_y * 16 + y, yuv);
va009039 4:7d88de31c55a 65 }
va009039 4:7d88de31c55a 66 }
va009039 4:7d88de31c55a 67 } else {
va009039 4:7d88de31c55a 68 ASSERT(m_yblocks == 2 || m_yblocks == 4);
va009039 4:7d88de31c55a 69 }
va009039 4:7d88de31c55a 70 }
va009039 4:7d88de31c55a 71
va009039 4:7d88de31c55a 72 void SimpleJpegDecode::onResult(int x, int y, uint8_t* yuv)
va009039 4:7d88de31c55a 73 {
va009039 4:7d88de31c55a 74 if(m_pCbItem && m_pCbMeth)
va009039 4:7d88de31c55a 75 (m_pCbItem->*m_pCbMeth)(x, y, yuv);
va009039 4:7d88de31c55a 76 else if(m_pCb)
va009039 4:7d88de31c55a 77 m_pCb(x, y, yuv);
va009039 4:7d88de31c55a 78 }
va009039 4:7d88de31c55a 79
va009039 4:7d88de31c55a 80 void SimpleJpegDecode::setOnResult( void (*pMethod)(int, int, uint8_t*) )
va009039 4:7d88de31c55a 81 {
va009039 4:7d88de31c55a 82 m_pCb = pMethod;
va009039 4:7d88de31c55a 83 m_pCbItem = NULL;
va009039 4:7d88de31c55a 84 m_pCbMeth = NULL;
va009039 4:7d88de31c55a 85 }
va009039 4:7d88de31c55a 86
va009039 4:7d88de31c55a 87 void SimpleJpegDecode::clearOnResult()
va009039 4:7d88de31c55a 88 {
va009039 4:7d88de31c55a 89 m_pCb = NULL;
va009039 4:7d88de31c55a 90 m_pCbItem = NULL;
va009039 4:7d88de31c55a 91 m_pCbMeth = NULL;
va009039 4:7d88de31c55a 92 }