jpeg_decoder_bench.cpp revision 987dbde838014e5f0c55a63acdd2a9a002b140cc
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "OmxJpegDecoder" 18#include <sys/time.h> 19#include <utils/Log.h> 20 21#include <binder/ProcessState.h> 22 23#include "SkBitmap.h" 24#include "SkImageDecoder.h" 25#include "SkStream.h" 26#include "omx_jpeg_decoder.h" 27 28class SkJPEGImageDecoder : public SkImageDecoder { 29public: 30 virtual Format getFormat() const { 31 return kJPEG_Format; 32 } 33 34protected: 35 virtual bool onDecode(SkStream* stream, SkBitmap* bm, 36 SkBitmap::Config pref, Mode); 37}; 38 39int nullObjectReturn(const char msg[]) { 40 if (msg) { 41 SkDebugf("--- %s\n", msg); 42 } 43 return -1; 44} 45 46static int64_t getNowUs() { 47 struct timeval tv; 48 gettimeofday(&tv, NULL); 49 50 return tv.tv_usec + (int64_t) tv.tv_sec * 1000000; 51} 52 53int testDecodeBounds(SkImageDecoder* decoder, SkStream* stream, 54 SkBitmap* bitmap) { 55 int64_t startTime = getNowUs(); 56 SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config; 57 SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodeBounds_Mode; 58 59 // Decode the input stream and then use the bitmap. 60 if (!decoder->decode(stream, bitmap, prefConfig, decodeMode)) { 61 return nullObjectReturn("decoder->decode returned false"); 62 } else { 63 int64_t delay = getNowUs() - startTime; 64 printf("WidthxHeight: %dx%d\n", bitmap->width(), bitmap->height()); 65 printf("Decoding Time in BoundsMode %.1f msec.\n", delay / 1000.0f); 66 return 0; 67 } 68} 69 70int testDecodePixels(SkImageDecoder* decoder, SkStream* stream, 71 SkBitmap* bitmap) { 72 int64_t startTime = getNowUs(); 73 SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config; 74 SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodePixels_Mode; 75 76 // Decode the input stream and then use the bitmap. 77 if (!decoder->decode(stream, bitmap, prefConfig, decodeMode)) { 78 return nullObjectReturn("decoder->decode returned false"); 79 } else { 80 int64_t delay = getNowUs() - startTime; 81 printf("Decoding Time in PixelsMode %.1f msec.\n", delay / 1000.0f); 82 const char* filename = "/sdcard/omxJpegDecodedBitmap.rgba"; 83 return storeBitmapToFile(bitmap, filename); 84 } 85} 86 87int testDecoder(SkImageDecoder* decoder, char* filename) { 88 // test DecodeMode == Pixels 89 SkStream* stream = new SkFILEStream(filename); 90 SkBitmap* bitmap = new SkBitmap; 91 testDecodePixels(decoder, stream, bitmap); 92 delete bitmap; 93 94 // test DecodeMode == Bounds 95 stream = new SkFILEStream(filename); 96 bitmap = new SkBitmap; 97 testDecodeBounds(decoder, stream, bitmap); 98 delete bitmap; 99 100 delete decoder; 101 return 0; 102} 103 104int main(int argc, char** argv) { 105 android::ProcessState::self()->startThreadPool(); 106 107 printf("Decoding jpeg with libjpeg...\n"); 108 SkJPEGImageDecoder* libjpeg = new SkJPEGImageDecoder; 109 testDecoder(libjpeg, argv[1]); 110 111 printf("\nDecoding jpeg with OMX...\n"); 112 OmxJpegImageDecoder* omx = new OmxJpegImageDecoder; 113 testDecoder(omx, argv[1]); 114 return 0; 115} 116