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

Revision:
2:5b1dd4e34857
Parent:
1:bfbc18000cca
Child:
3:a7547692071d
--- a/BaseJpegDecode.cpp	Thu Oct 25 11:00:05 2012 +0000
+++ b/BaseJpegDecode.cpp	Tue Oct 30 13:22:08 2012 +0000
@@ -71,8 +71,9 @@
 {
     m_block = 0;
     m_scan = 0;
-    m_old_DC_value[0] = 0;
-    m_old_DC_value[1] = 0;
+    m_pre_DC_value[0] = 0;
+    m_pre_DC_value[1] = 0;
+    m_pre_DC_value[2] = 0;
     m_bitpat.clear();
     m_huff = NULL;
 }
@@ -95,10 +96,10 @@
             m_param1 = c<<8;
             break;
         case 2:
-            width = m_param1 | c;
+            height = m_param1 | c;
             break;
         case 4:
-            height = m_param1 | c;
+            width = m_param1 | c;
             break;
         case 7:
             if (c == 0x22) {
@@ -202,18 +203,25 @@
         DBG("%d %d %d %02x\n", m_huff->run, m_huff->value_size, m_huff->code_size, m_huff->code);
         int value = pHD->getValue(m_huff, &m_bitpat);
         if (tc == HT_DC) {
-            value += m_old_DC_value[th];
+            int sc = 0; // Y
+            if (m_block == m_yblocks) {
+                sc = 1; // Cb
+            } else if (m_block == (m_yblocks+1)) {
+                sc = 2; // Cr
+            }
+            value += m_pre_DC_value[sc];
             outputDC(m_mcu, m_block, value);
-            m_old_DC_value[th] = value;
+            m_pre_DC_value[sc] = value;
             m_scan++;
             REPORT_CODE(report_scan_dc_count++);
         } else { // AC
             if (m_huff->value_size == 0 && m_huff->run == 0) { // EOB
                 DBG("AC EOB\n");
+                outputAC(m_mcu, m_block, 63, 0);
                 m_scan = 64;
             } else {
                 for(int i = 0; i < m_huff->run; i++) {
-                    outputAC(m_mcu, m_block, m_scan, 0);
+                    //outputAC(m_mcu, m_block, m_scan, 0);
                     m_scan++;
                 }
                 outputAC(m_mcu, m_block, m_scan, value);