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 all the 3 components for 1x1 44 */ 45 static void decode_MCU_1x1_3planes(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 * Decode a 2x1 62 * .-------. 63 * | 1 | 2 | 64 * `-------' 65 */ 66 static void decode_MCU_2x1_3planes(struct jdec_private *priv) 67 { 68 // Y 69 tinyjpeg_process_Huffman_data_unit(priv, cY); 70 IDCT(&priv->component_infos[cY], priv->Y, 16); 71 tinyjpeg_process_Huffman_data_unit(priv, cY); 72 IDCT(&priv->component_infos[cY], priv->Y+8, 16); 73 74 // Cb 75 tinyjpeg_process_Huffman_data_unit(priv, cCb); 76 IDCT(&priv->component_infos[cCb], priv->Cb, 8); 77 78 // Cr 79 tinyjpeg_process_Huffman_data_unit(priv, cCr); 80 IDCT(&priv->component_infos[cCr], priv->Cr, 8); 81 } 82 83 /* 84 * Decode a 2x2 85 * .-------. 86 * | 1 | 2 | 87 * |---+---| 88 * | 3 | 4 | 89 * `-------' 90 */ 91 static void decode_MCU_2x2_3planes(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 IDCT(&priv->component_infos[cCb], priv->Cb, 8); 106 107 // Cr 108 tinyjpeg_process_Huffman_data_unit(priv, cCr); 109 IDCT(&priv->component_infos[cCr], priv->Cr, 8); 110 } 111 112 /* 113 * Decode a 1x2 mcu 114 * .---. 115 * | 1 | 116 * |---| 117 * | 2 | 118 * `---' 119 */ 120 static void decode_MCU_1x2_3planes(struct jdec_private *priv) 121 { 122 // Y 123 tinyjpeg_process_Huffman_data_unit(priv, cY); 124 IDCT(&priv->component_infos[cY], priv->Y, 8); 125 tinyjpeg_process_Huffman_data_unit(priv, cY); 126 IDCT(&priv->component_infos[cY], priv->Y+64, 8); 127 128 // Cb 129 tinyjpeg_process_Huffman_data_unit(priv, cCb); 130 IDCT(&priv->component_infos[cCb], priv->Cb, 8); 131 132 // Cr 133 tinyjpeg_process_Huffman_data_unit(priv, cCr); 134 IDCT(&priv->component_infos[cCr], priv->Cr, 8); 135 } 136 137 const decode_MCU_fct tinyjpeg_decode_mcu_3comp_table[4] = { 138 decode_MCU_1x1_3planes, 139 decode_MCU_1x2_3planes, 140 decode_MCU_2x1_3planes, 141 decode_MCU_2x2_3planes, 142 }; 143