1 /* 2 * Copyright (C) 2011 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 /* 18 * Contains implementation of a class NV21JpegCompressor that encapsulates a 19 * converter between NV21, and JPEG formats. 20 */ 21 22 #define LOG_NDEBUG 0 23 #define LOG_TAG "EmulatedCamera_JPEG" 24 #include "JpegCompressor.h" 25 #include <assert.h> 26 #include <cutils/log.h> 27 #include <dlfcn.h> 28 29 namespace android { 30 31 void* NV21JpegCompressor::mDl = NULL; 32 33 static void* getSymbol(void* dl, const char* signature) { 34 void* res = dlsym(dl, signature); 35 assert(res != NULL); 36 37 return res; 38 } 39 40 typedef void (*InitFunc)(JpegStub* stub); 41 typedef void (*CleanupFunc)(JpegStub* stub); 42 typedef int (*CompressFunc)(JpegStub* stub, const void* image, int width, 43 int height, int quality, ExifData* exifData); 44 typedef void (*GetCompressedImageFunc)(JpegStub* stub, void* buff); 45 typedef size_t (*GetCompressedSizeFunc)(JpegStub* stub); 46 47 NV21JpegCompressor::NV21JpegCompressor() { 48 if (mDl == NULL) { 49 mDl = dlopen("/vendor/lib/hw/camera.vsoc.jpeg.so", RTLD_NOW); 50 } 51 if (mDl == NULL) { 52 mDl = dlopen("/system/lib/hw/camera.vsoc.jpeg.so", RTLD_NOW); 53 } 54 assert(mDl != NULL); 55 56 InitFunc f = (InitFunc)getSymbol(mDl, "JpegStub_init"); 57 (*f)(&mStub); 58 } 59 60 NV21JpegCompressor::~NV21JpegCompressor() { 61 CleanupFunc f = (CleanupFunc)getSymbol(mDl, "JpegStub_cleanup"); 62 (*f)(&mStub); 63 } 64 65 /**************************************************************************** 66 * Public API 67 ***************************************************************************/ 68 69 status_t NV21JpegCompressor::compressRawImage(const void* image, 70 ExifData* exifData, 71 int quality, 72 int width, 73 int height) { 74 mStrides[0] = width; 75 mStrides[1] = width; 76 CompressFunc f = (CompressFunc)getSymbol(mDl, "JpegStub_compress"); 77 return (status_t)(*f)(&mStub, image, width, height, quality, exifData); 78 } 79 80 size_t NV21JpegCompressor::getCompressedSize() { 81 GetCompressedSizeFunc f = 82 (GetCompressedSizeFunc)getSymbol(mDl, "JpegStub_getCompressedSize"); 83 return (*f)(&mStub); 84 } 85 86 void NV21JpegCompressor::getCompressedImage(void* buff) { 87 GetCompressedImageFunc f = 88 (GetCompressedImageFunc)getSymbol(mDl, "JpegStub_getCompressedImage"); 89 (*f)(&mStub, buff); 90 } 91 92 }; /* namespace android */ 93