huffmancode to decode in real-time for motion-jpeg
Dependents: BaseJpegDecode_example SimpleJpegDecode_example Dumb_box_rev2
example code:
Import programBaseJpegDecode_example
BaseJpegDeocde exampe program
Import programSimpleJpegDecode_example
convert JPEG stream data to bitmap, BaseJpegDecode example program
Diff: inverseDCT.cpp
- Revision:
- 3:a7547692071d
- Parent:
- 2:5b1dd4e34857
--- a/inverseDCT.cpp Tue Oct 30 13:22:08 2012 +0000 +++ b/inverseDCT.cpp Mon Nov 05 22:47:05 2012 +0000 @@ -1,9 +1,7 @@ #include "mbed.h" -#include <math.h> #include "inverseDCT.h" -#define PI 3.14159265 - +#ifdef USE_IDCT_AAN const int zigzag[64] = {0, 1, 8, @@ -21,110 +19,50 @@ 55,62, 63}; -int adjust(int value) { - value += 128; - if (value < 0) { - return 0; - } else if (value > 255) { - return 255; - } - return value; -} - -#if DCT_USE_INT -inverseDCT::inverseDCT() -{ - for(int x = 0; x < 8; x++) { - for(int u = 0; u < 8; u++) { - float value = cos((x*2+1)*u*PI/16); - m_cosxu[x*8+u] = value * 32; - } - } - - for(int v = 0; v < 8; v++) { - for(int u = 0; u < 8; u++) { - float value = 1.0 / 4.0; - if (v == 0 && u == 0) { - value /= 2.0; - } else if (v == 0 || u == 0) { - value /= sqrt(2.0); - } - m_cucv[v*8+u] = value * 32; - } - } -} - -void inverseDCT::inputBLOCK(int mcu, int block, int scan, int value) -{ - if (scan == 0) { - for(int i = 0; i < 64; i++) { - m_sum[i] = 0; - } - } - - if (value != 0) { - int uv = zigzag[scan]; - int u = uv % 8; - int v = uv / 8; - for(int y = 0; y < 8; y++) { - for(int x = 0; x < 8; x++) { - int t = m_cucv[uv] * value * m_cosxu[x*8+u] * m_cosxu[y*8+v] / 32 / 32; - m_sum[y*8+x] += t; - } - } - } - - if (scan == 63) { - uint8_t result[64]; - for(int i = 0; i < 64; i++) { - int value = m_sum[i] / 32; - result[i] = adjust(value); - } - outputBLOCK(mcu, block, result); - } -} - -#else - -inverseDCT::inverseDCT() -{ -} - -void inverseDCT::input(int mcu, int block, int scan, int value) { +void inverseDCT::inputBLOCK(int mcu, int block, int scan, int value) { if (scan == 0) { for(int i = 0; i < 64; i++) { m_s[i] = 0; } } m_s[zigzag[scan]] = value; + if (scan == 63) { // last + idct.conv(reinterpret_cast<int8_t*>(m_s), m_s); + outputBLOCK(mcu, block, reinterpret_cast<int8_t*>(m_s)); + } +}; +#endif //USE_IDCT_AAN + +#ifdef USE_IDCT_TABLE +#include "inverseDCT_table.h" +void inverseDCT::inputBLOCK(int mcu, int block, int scan, int value) +{ + if (scan == 0) { + int t = value * 32 / 8; + for(int i = 0; i < 64; i++) { + m_sum[i] = t; + } + return; + } + + if (value != 0) { + for(int xy = 0; xy < 64; xy++) { + m_sum[xy] += idct_table[scan*64+xy] * value / 16; + } + } + if (scan == 63) { - calc(mcu, block, m_s); + int8_t* result = reinterpret_cast<int8_t*>(m_sum); + for(int i = 0; i < 64; i++) { + int t = m_sum[i] / 32; + if (t > 127) { + t = 127; + } else if (t < -128) { + t = -128; + } + result[i] = t; + } + outputBLOCK(mcu, block, result); } } - -void inverseDCT::calc(int mcu, int block, int s[]) { - for(int y = 0; y < 8; y++) { - for(int x = 0; x < 8; x++) { - float sum = 0.0; - for(int v = 0; v < 8; v++) { - float cv = 1.0; - if (v == 0) { - cv /= sqrt(2.0); - } - for(int u = 0; u < 8; u++) { - float cu = 1.0; - if (u == 0) { - cu /= sqrt(2.0); - } - int vu = v * 8 + u; - float cosxu = cos((x*2+1) * u * PI / 16); - float cosyv = cos((y*2+1) * v * PI / 16); - sum += cu * cv * s[vu] * cosxu * cosyv; - } - } - sum /= 4; - m_result[y*8+x] = adjust(sum); - } - } -} -#endif +#endif //USE_IDCT_TABLE