Home | History | Annotate | Download | only in jpeg
      1 /*
      2  * Small jpeg decoder library
      3  *
      4  * Copyright (c) 2006, Luc Saillard <luc (at) saillard.org>
      5  * All rights reserved.
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions are met:
      8  *
      9  * - Redistributions of source code must retain the above copyright notice,
     10  *  this list of conditions and the following disclaimer.
     11  *
     12  * - Redistributions in binary form must reproduce the above copyright notice,
     13  *  this list of conditions and the following disclaimer in the documentation
     14  *  and/or other materials provided with the distribution.
     15  *
     16  * - Neither the name of the author nor the names of its contributors may be
     17  *  used to endorse or promote products derived from this software without
     18  *  specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  * POSSIBILITY OF SUCH DAMAGE.
     31  *
     32  */
     33 
     34 #include <stdio.h>
     35 #include <stdlib.h>
     36 #include <string.h>
     37 #include <stdint.h>
     38 
     39 #include "tinyjpeg.h"
     40 #include "tinyjpeg-internal.h"
     41 
     42 /*
     43  * Decode a 1x1 directly in 1 color
     44  */
     45 static void decode_MCU_1x1_1plane(struct jdec_private *priv)
     46 {
     47   // Y
     48   tinyjpeg_process_Huffman_data_unit(priv, cY);
     49   IDCT(&priv->component_infos[cY], priv->Y, 8);
     50 
     51   // Cb
     52   tinyjpeg_process_Huffman_data_unit(priv, cCb);
     53   IDCT(&priv->component_infos[cCb], priv->Cb, 8);
     54 
     55   // Cr
     56   tinyjpeg_process_Huffman_data_unit(priv, cCr);
     57   IDCT(&priv->component_infos[cCr], priv->Cr, 8);
     58 }
     59 
     60 
     61 /*
     62  * Decode a 2x1
     63  *  .-------.
     64  *  | 1 | 2 |
     65  *  `-------'
     66  */
     67 static void decode_MCU_2x1_1plane(struct jdec_private *priv)
     68 {
     69   // Y
     70   tinyjpeg_process_Huffman_data_unit(priv, cY);
     71   IDCT(&priv->component_infos[cY], priv->Y, 16);
     72   tinyjpeg_process_Huffman_data_unit(priv, cY);
     73   IDCT(&priv->component_infos[cY], priv->Y+8, 16);
     74 
     75   // Cb
     76   tinyjpeg_process_Huffman_data_unit(priv, cCb);
     77 
     78   // Cr
     79   tinyjpeg_process_Huffman_data_unit(priv, cCr);
     80 }
     81 
     82 
     83 /*
     84  * Decode a 2x2 directly in GREY format (8bits)
     85  *  .-------.
     86  *  | 1 | 2 |
     87  *  |---+---|
     88  *  | 3 | 4 |
     89  *  `-------'
     90  */
     91 static void decode_MCU_2x2_1plane(struct jdec_private *priv)
     92 {
     93   // Y
     94   tinyjpeg_process_Huffman_data_unit(priv, cY);
     95   IDCT(&priv->component_infos[cY], priv->Y, 16);
     96   tinyjpeg_process_Huffman_data_unit(priv, cY);
     97   IDCT(&priv->component_infos[cY], priv->Y+8, 16);
     98   tinyjpeg_process_Huffman_data_unit(priv, cY);
     99   IDCT(&priv->component_infos[cY], priv->Y+64*2, 16);
    100   tinyjpeg_process_Huffman_data_unit(priv, cY);
    101   IDCT(&priv->component_infos[cY], priv->Y+64*2+8, 16);
    102 
    103   // Cb
    104   tinyjpeg_process_Huffman_data_unit(priv, cCb);
    105 
    106   // Cr
    107   tinyjpeg_process_Huffman_data_unit(priv, cCr);
    108 }
    109 
    110 /*
    111  * Decode a 1x2 mcu
    112  *  .---.
    113  *  | 1 |
    114  *  |---|
    115  *  | 2 |
    116  *  `---'
    117  */
    118 static void decode_MCU_1x2_1plane(struct jdec_private *priv)
    119 {
    120   // Y
    121   tinyjpeg_process_Huffman_data_unit(priv, cY);
    122   IDCT(&priv->component_infos[cY], priv->Y, 8);
    123   tinyjpeg_process_Huffman_data_unit(priv, cY);
    124   IDCT(&priv->component_infos[cY], priv->Y+64, 8);
    125 
    126   // Cb
    127   tinyjpeg_process_Huffman_data_unit(priv, cCb);
    128 
    129   // Cr
    130   tinyjpeg_process_Huffman_data_unit(priv, cCr);
    131 }
    132 
    133 const decode_MCU_fct tinyjpeg_decode_mcu_1comp_table[4] = {
    134    decode_MCU_1x1_1plane,
    135    decode_MCU_1x2_1plane,
    136    decode_MCU_2x1_1plane,
    137    decode_MCU_2x2_1plane,
    138 };
    139