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