1409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan/* 2409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Small jpeg decoder library - testing application 3409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 4409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Copyright (c) 2006, Luc Saillard <luc@saillard.org> 5409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Copyright (c) 2012 Intel Corporation. 6409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * All rights reserved. 7409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Redistribution and use in source and binary forms, with or without 8409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * modification, are permitted provided that the following conditions are met: 9409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 10409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Redistributions of source code must retain the above copyright notice, 11409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * this list of conditions and the following disclaimer. 12409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 13409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Redistributions in binary form must reproduce the above copyright notice, 14409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * this list of conditions and the following disclaimer in the documentation 15409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * and/or other materials provided with the distribution. 16409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 17409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Neither the name of the author nor the names of its contributors may be 18409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * used to endorse or promote products derived from this software without 19409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * specific prior written permission. 20409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 21409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 25409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * POSSIBILITY OF SUCH DAMAGE. 32409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 33409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan */ 34409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 35409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "tinyjpeg.h" 36409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <stdio.h> 37409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <stdlib.h> 38409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <string.h> 39409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <time.h> 40409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_display.h" 41409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 42409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic void exitmessage(const char *message) __attribute__((noreturn)); 43409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic void exitmessage(const char *message) 44409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 45409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan printf("%s\n", message); 46409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exit(0); 47409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan} 48409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 49409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic int filesize(FILE *fp) 50409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 51409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan long pos; 52409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fseek(fp, 0, SEEK_END); 53409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pos = ftell(fp); 54409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fseek(fp, 0, SEEK_SET); 55409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan return pos; 56409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan} 57409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 58409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan/** 59409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Load one jpeg image, and decompress it, and save the result. 60409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan */ 61409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanint convert_one_image(const char *infilename) 62409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 63409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan FILE *fp; 64409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int length_of_file; 65409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int width, height; 66409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *buf; 67409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct jdec_private *jdec; 68409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 69409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* Load the Jpeg into memory */ 70409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fp = fopen(infilename, "rb"); 71409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (fp == NULL) 72409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exitmessage("Cannot open filename\n"); 73409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan length_of_file = filesize(fp); 74409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan buf = (unsigned char *)malloc(length_of_file + 4); 75409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (buf == NULL) 76409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exitmessage("Not enough memory for loading file\n"); 77409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fread(buf, length_of_file, 1, fp); 78409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fclose(fp); 79409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 80409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* Decompress it */ 81409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan jdec = tinyjpeg_init(); 82409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (jdec == NULL) 83409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exitmessage("Not enough memory to alloc the structure need for decompressing\n"); 84409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 85409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (tinyjpeg_parse_header(jdec, buf, length_of_file)<0) 86409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exitmessage(tinyjpeg_get_errorstring(jdec)); 87409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 88409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* Get the size of the image */ 89409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan tinyjpeg_get_size(jdec, &width, &height); 90409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 91409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan printf("Decoding JPEG image %dx%d...\n", width, height); 92409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (tinyjpeg_decode(jdec) < 0) 93409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exitmessage(tinyjpeg_get_errorstring(jdec)); 94409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 95409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan tinyjpeg_free(jdec); 96409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 97409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan free(buf); 98409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan return 0; 99409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan} 100409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 101409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic void usage(void) 102409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 103409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fprintf(stderr, "Usage: loadjpeg <input_filename.jpeg> \n"); 104409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan exit(1); 105409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan} 106409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 107409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan/** 108409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * main 109409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 110409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan */ 111409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanint main(int argc, char *argv[]) 112409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 113409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan char *input_filename; 114409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan clock_t start_time, finish_time; 115409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int duration; 116409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int current_argument; 117409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 118409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan va_init_display_args(&argc, argv); 119409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 120409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (argc < 2) 121409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan usage(); 122409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 123409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan current_argument = 1; 124409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan input_filename = argv[current_argument]; 125409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 126409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan start_time = clock(); 127409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan convert_one_image(input_filename); 128409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan finish_time = clock(); 129409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan duration = finish_time - start_time; 130409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan printf("Decoding finished in %u ticks\n", duration); 131409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 132409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan return 0; 133409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan} 134409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 135409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 136409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 137409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 138