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