18a94683196406b83b14218d1beef66067f126a16keunyoung/* 28a94683196406b83b14218d1beef66067f126a16keunyoung * Copyright (C) 2011 The Android Open Source Project 38a94683196406b83b14218d1beef66067f126a16keunyoung * 48a94683196406b83b14218d1beef66067f126a16keunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 58a94683196406b83b14218d1beef66067f126a16keunyoung * you may not use this file except in compliance with the License. 68a94683196406b83b14218d1beef66067f126a16keunyoung * You may obtain a copy of the License at 78a94683196406b83b14218d1beef66067f126a16keunyoung * 88a94683196406b83b14218d1beef66067f126a16keunyoung * http://www.apache.org/licenses/LICENSE-2.0 98a94683196406b83b14218d1beef66067f126a16keunyoung * 108a94683196406b83b14218d1beef66067f126a16keunyoung * Unless required by applicable law or agreed to in writing, software 118a94683196406b83b14218d1beef66067f126a16keunyoung * distributed under the License is distributed on an "AS IS" BASIS, 128a94683196406b83b14218d1beef66067f126a16keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a94683196406b83b14218d1beef66067f126a16keunyoung * See the License for the specific language governing permissions and 148a94683196406b83b14218d1beef66067f126a16keunyoung * limitations under the License. 158a94683196406b83b14218d1beef66067f126a16keunyoung */ 168a94683196406b83b14218d1beef66067f126a16keunyoung 178a94683196406b83b14218d1beef66067f126a16keunyoung/* 188a94683196406b83b14218d1beef66067f126a16keunyoung * Contains implementation of a class NV21JpegCompressor that encapsulates a 198a94683196406b83b14218d1beef66067f126a16keunyoung * converter between NV21, and JPEG formats. 208a94683196406b83b14218d1beef66067f126a16keunyoung */ 218a94683196406b83b14218d1beef66067f126a16keunyoung 228a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_NDEBUG 0 238a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_TAG "EmulatedCamera_JPEG" 248a94683196406b83b14218d1beef66067f126a16keunyoung#include <cutils/log.h> 25c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung#include <assert.h> 26c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung#include <dlfcn.h> 278a94683196406b83b14218d1beef66067f126a16keunyoung#include "JpegCompressor.h" 288a94683196406b83b14218d1beef66067f126a16keunyoung 298a94683196406b83b14218d1beef66067f126a16keunyoungnamespace android { 308a94683196406b83b14218d1beef66067f126a16keunyoung 31c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungvoid* NV21JpegCompressor::mDl = NULL; 32c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 33c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungstatic void* getSymbol(void* dl, const char* signature) { 34c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung void* res = dlsym(dl, signature); 35c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung assert (res != NULL); 36c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 37c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung return res; 38c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung} 39c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 40c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungtypedef void (*InitFunc)(JpegStub* stub, int* strides); 41c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungtypedef void (*CleanupFunc)(JpegStub* stub); 42c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungtypedef int (*CompressFunc)(JpegStub* stub, const void* image, 43c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung int width, int height, int quality); 44c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungtypedef void (*GetCompressedImageFunc)(JpegStub* stub, void* buff); 45c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungtypedef size_t (*GetCompressedSizeFunc)(JpegStub* stub); 46c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 478a94683196406b83b14218d1beef66067f126a16keunyoungNV21JpegCompressor::NV21JpegCompressor() 488a94683196406b83b14218d1beef66067f126a16keunyoung{ 49c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung const char dlName[] = "/system/lib/hw/camera.goldfish.jpeg.so"; 50c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung if (mDl == NULL) { 51c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung mDl = dlopen(dlName, RTLD_NOW); 52c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung } 53c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung assert(mDl != NULL); 54c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 55c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung InitFunc f = (InitFunc)getSymbol(mDl, "JpegStub_init"); 56c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung (*f)(&mStub, mStrides); 578a94683196406b83b14218d1beef66067f126a16keunyoung} 588a94683196406b83b14218d1beef66067f126a16keunyoung 598a94683196406b83b14218d1beef66067f126a16keunyoungNV21JpegCompressor::~NV21JpegCompressor() 608a94683196406b83b14218d1beef66067f126a16keunyoung{ 61c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung CleanupFunc f = (CleanupFunc)getSymbol(mDl, "JpegStub_cleanup"); 62c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung (*f)(&mStub); 638a94683196406b83b14218d1beef66067f126a16keunyoung} 648a94683196406b83b14218d1beef66067f126a16keunyoung 658a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 668a94683196406b83b14218d1beef66067f126a16keunyoung * Public API 678a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 688a94683196406b83b14218d1beef66067f126a16keunyoung 698a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t NV21JpegCompressor::compressRawImage(const void* image, 708a94683196406b83b14218d1beef66067f126a16keunyoung int width, 718a94683196406b83b14218d1beef66067f126a16keunyoung int height, 728a94683196406b83b14218d1beef66067f126a16keunyoung int quality) 738a94683196406b83b14218d1beef66067f126a16keunyoung{ 748a94683196406b83b14218d1beef66067f126a16keunyoung mStrides[0] = width; 758a94683196406b83b14218d1beef66067f126a16keunyoung mStrides[1] = width; 76c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung CompressFunc f = (CompressFunc)getSymbol(mDl, "JpegStub_compress"); 77c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung return (status_t)(*f)(&mStub, image, width, height, quality); 78c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung} 79c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 80c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 81c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungsize_t NV21JpegCompressor::getCompressedSize() 82c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung{ 83c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung GetCompressedSizeFunc f = (GetCompressedSizeFunc)getSymbol(mDl, 84c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung "JpegStub_getCompressedSize"); 85c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung return (*f)(&mStub); 86c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung} 87c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung 88c86ea2b2ad98c56480c682145704c5b3683d4993keunyoungvoid NV21JpegCompressor::getCompressedImage(void* buff) 89c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung{ 90c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung GetCompressedImageFunc f = (GetCompressedImageFunc)getSymbol(mDl, 91c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung "JpegStub_getCompressedImage"); 92c86ea2b2ad98c56480c682145704c5b3683d4993keunyoung (*f)(&mStub, buff); 938a94683196406b83b14218d1beef66067f126a16keunyoung} 948a94683196406b83b14218d1beef66067f126a16keunyoung 958a94683196406b83b14218d1beef66067f126a16keunyoung}; /* namespace android */ 96