BaseJpegDeocde exampe program
Dependencies: BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos
Fork of BaseJpegDecode by
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 | #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 | } |