1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * All rights reserved. 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * modification, are permitted provided that the following conditions 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * are met: 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * * Redistributions of source code must retain the above copyright 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * the documentation and/or other materials provided with the 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distribution. 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * SUCH DAMAGE. 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* this small program is used to measure the performance of libjpeg decompression 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * algorithm... 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h> 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h> 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <errno.h> 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/time.h> 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "jpeglib.h" 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <setjmp.h> 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef HAVE_ANDROID_OS 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <hardware_legacy/qemu_tracing.h> 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define USE_STDIO 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define CHUNK 32768 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct { 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct jpeg_source_mgr jpeg_mgr; 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* base; 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* cursor; 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* end; 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} SourceMgrRec, *SourceMgr; 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_init_source(j_decompress_ptr cinfo) 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project SourceMgr src = (SourceMgr) cinfo->src; 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.next_input_byte = (unsigned char*)src->base, 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.bytes_in_buffer = src->end - src->base; 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_fill_input_buffer(j_decompress_ptr cinfo) 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project SourceMgr src = (SourceMgr) cinfo->src; 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo->err->error_exit((j_common_ptr)cinfo); 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return FALSE; 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_skip_input_data(j_decompress_ptr cinfo, long num_bytes) 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project SourceMgr src = (SourceMgr) cinfo->src; 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (src->jpeg_mgr.next_input_byte + num_bytes > (unsigned char*)src->end ) { 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo->err->error_exit((j_common_ptr)cinfo); 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.next_input_byte += num_bytes; 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.bytes_in_buffer -= num_bytes; 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_resync_to_restart( j_decompress_ptr cinfo, int desired) 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project SourceMgr src = (SourceMgr) cinfo->src; 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.next_input_byte = (unsigned char*)src->base; 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.bytes_in_buffer = src->end - src->base; 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return TRUE; 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_term_source(j_decompress_ptr cinfo) 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // nothing to do 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project_source_init( SourceMgr src, char* base, long size ) 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->base = base; 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->cursor = base; 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->end = base + size; 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.init_source = _source_init_source; 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.fill_input_buffer = _source_fill_input_buffer; 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.skip_input_data = _source_skip_input_data; 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.resync_to_restart = _source_resync_to_restart; 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src->jpeg_mgr.term_source = _source_term_source; 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct { 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct jpeg_error_mgr jpeg_mgr; 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jmp_buf jumper; 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int volatile error; 122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} ErrorMgrRec, *ErrorMgr; 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void _error_exit(j_common_ptr cinfo) 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ErrorMgr error = (ErrorMgr) cinfo->err; 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (*error->jpeg_mgr.output_message) (cinfo); 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* Let the memory manager delete any temp files before we die */ 132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project longjmp(error->jumper, -1); 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef USE_STDIO 136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint decompress(FILE* input_file, int dct_method, int disable_rgb) 137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint decompress(char* data, long fsize) 139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ErrorMgrRec errmgr; 142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project SourceMgrRec sourcemgr; 143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct jpeg_decompress_struct cinfo; 144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int volatile error = 0; 145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jmp_buf jumper; 146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int isRGB; 147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* pixels; 148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project JSAMPLE* temprow; 149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset( &cinfo, 0, sizeof(cinfo) ); 151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset( &errmgr, 0, sizeof(errmgr) ); 152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_create_decompress(&cinfo); 153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo.err = jpeg_std_error(&errmgr.jpeg_mgr); 154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project errmgr.jpeg_mgr.error_exit = _error_exit; 156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project errmgr.error = 0; 157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (setjmp(errmgr.jumper) != 0) { 160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "returning error from jpeglib ---\n" ); 161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project goto Exit; 162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef USE_STDIO 165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* Specify data source for decompression */ 166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_stdio_src(&cinfo, input_file); 167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project _source_init( &sourcemgr, data, fsize ); 169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo.src = &sourcemgr.jpeg_mgr; 170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_read_header(&cinfo, 1); 173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (3 == cinfo.num_components && JCS_RGB == cinfo.out_color_space) 175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project isRGB = 1; 176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (1 == cinfo.num_components && JCS_GRAYSCALE == cinfo.out_color_space) 177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project isRGB = 0; // could use Index8 config if we want... 178e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else { 179e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf( stderr, "unsupported jpeg colorspace %d with %d components\n", 180e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo.jpeg_color_space, cinfo.num_components ); 181e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project goto Exit; 182e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo.dct_method = dct_method; 185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (disable_rgb) 186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project cinfo.out_color_space = JCS_YCbCr; 187e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_start_decompress(&cinfo); 189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project temprow = calloc( cinfo.num_components * cinfo.output_width, sizeof(JSAMPLE) ); 191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 192e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned y; 194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (y = 0; y < cinfo.output_height; y++) { 195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project JSAMPLE* rowptr = temprow; 196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)jpeg_read_scanlines(&cinfo, &rowptr, 1); 197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_finish_decompress(&cinfo); 200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free( temprow ); 202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source ProjectExit: 203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project jpeg_destroy_decompress(&cinfo); 204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return error; 205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define DEFAULT_REPEAT 10 209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void usage(void) 211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "usage: test_jpeg [options] filename.jpg [filename2.jpg ...]\n" ); 213e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "options: -r NN repeat count (default %d)\n", DEFAULT_REPEAT ); 214e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, " -d N idct method (0=default, 1=fastest, 2=slow, 3=float)\n" ); 215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, " -C no RGB color conversion (YCbCr instead)\n" ); 216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(1); 217e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 218e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 219e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic double 220e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectget_time_usec( void ) 221e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 222e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef HAVE_ANDROID_OS 223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timespec ts; 224e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 225e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ( clock_gettime( CLOCK_MONOTONIC, &ts ) < 0 ) 226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "clock_gettime: %s\n", strerror(errno) ); 227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ts.tv_sec*1e6 + ts.tv_nsec*1e-3; 229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 230e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timeval tv; 231e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (gettimeofday( &tv, NULL ) < 0) 232e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "gettimeofday: %s\n", strerror(errno) ); 233e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 234e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return tv.tv_sec*1000000. + tv.tv_usec*1.0; 235e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 236e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 237e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 238e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 239e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main( int argc, char** argv ) 240e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 241e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project FILE* f; 242e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int repeat_count = DEFAULT_REPEAT; 243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int dct_method = JDCT_DEFAULT; 244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int disable_rgb = 0; 245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project double usec0, usec1; 246e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 247e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc < 2) 248e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 249e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 250e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( ; argc > 1 && argv[1][0] == '-'; argc--, argv++) { 251e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* arg = &argv[1][1]; 252e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project switch (arg[0]) { 253e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'r': 254e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (arg[1] == 0) { 255e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc < 3) 256e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 257e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg = argv[2]; 258e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argc--; 259e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argv++; 260e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else 261e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg += 1; 262e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 263e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project repeat_count = strtol(arg, NULL, 10); 264e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 265e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (repeat_count <= 0) 266e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project repeat_count = 1; 267e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 268e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 269e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'C': 270e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project disable_rgb = 1; 271e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 272e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 273e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'd': 274e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (arg[1] == 0) { 275e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc < 3) 276e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 277e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg = argv[2]; 278e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argc--; 279e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argv++; 280e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else 281e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg += 1; 282e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 283e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dct_method = strtol(arg, NULL, 10); 284e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project switch (dct_method) { 285e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 0: 286e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dct_method = JDCT_DEFAULT; 287e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 288e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 1: 289e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dct_method = JDCT_IFAST; 290e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 291e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 2: 292e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dct_method = JDCT_ISLOW; 293e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 294e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 3: 295e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dct_method = JDCT_FLOAT; 296e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 297e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project default: 298e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 299e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 300e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 301e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 302e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project default: 303e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 304e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 305e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 306e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 307e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( ; argc > 1; argc--, argv++ ) 308e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 309e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project long fsize; 310e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* data; 311e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project FILE* f = fopen( argv[1], "rb" ); 312e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int rr; 313e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 314e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (f == NULL) { 315e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "could not open '%s': %s\n", argv[1], strerror(errno) ); 316e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project continue; 317e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 318e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 319e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_END ); 320e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fsize = ftell(f); 321e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_SET ); 322e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 323e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec0 = get_time_usec(); 324e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef HAVE_ANDROID_OS 325e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project qemu_start_tracing(); 326e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 327e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef USE_STDIO 328e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( rr = repeat_count; rr > 0; rr-- ) { 329e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_SET ); 330e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project decompress(f, dct_method, disable_rgb); 331e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 332e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose( f ); 333e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 334e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 335e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project data = malloc( fsize ); 336e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (data == NULL) { 337e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (fsize > 0) 338e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "could not allocate %ld bytes to load '%s'\n", fsize, argv[1] ); 339e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose(f); 340e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project continue; 341e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 342e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fread( data, 1, fsize, f ); 343e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose(f); 344e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 345e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec1 = get_time_usec() - usec0; 346e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "compressed load: %10.2f ms (%ld bytes)\n", usec1*1e-3, fsize ); 347e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 348e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec0 = get_time_usec(); 349e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( rr = repeat_count; rr > 0; rr -- ) 350e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 351e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project decompress( data, fsize ); 352e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 353e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free( data ); 354e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 355e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef HAVE_ANDROID_OS 356e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project qemu_stop_tracing(); 357e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 358e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec1 = get_time_usec() - usec0; 359e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "decompression took: %10.3f ms (%.2f KB/s, %d passes)\n", usec1/1e3, fsize*(1e6/1024)*repeat_count/usec1, repeat_count ); 360e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 361e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 362e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 363