blob: 8014ccf0d90ca077f805221792e97f269e63bd91
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 <cutils/log.h> |
25 | #include <assert.h> |
26 | #include <dlfcn.h> |
27 | #include "JpegCompressor.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, int* strides); |
41 | typedef void (*CleanupFunc)(JpegStub* stub); |
42 | typedef int (*CompressFunc)(JpegStub* stub, const void* image, |
43 | int width, int height, int quality); |
44 | typedef void (*GetCompressedImageFunc)(JpegStub* stub, void* buff); |
45 | typedef size_t (*GetCompressedSizeFunc)(JpegStub* stub); |
46 | |
47 | NV21JpegCompressor::NV21JpegCompressor() |
48 | { |
49 | const char dlName[] = "/system/lib/hw/camera.goldfish.jpeg.so"; |
50 | if (mDl == NULL) { |
51 | mDl = dlopen(dlName, RTLD_NOW); |
52 | } |
53 | assert(mDl != NULL); |
54 | |
55 | InitFunc f = (InitFunc)getSymbol(mDl, "JpegStub_init"); |
56 | (*f)(&mStub, mStrides); |
57 | } |
58 | |
59 | NV21JpegCompressor::~NV21JpegCompressor() |
60 | { |
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 | int width, |
71 | int height, |
72 | int quality) |
73 | { |
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); |
78 | } |
79 | |
80 | |
81 | size_t NV21JpegCompressor::getCompressedSize() |
82 | { |
83 | GetCompressedSizeFunc f = (GetCompressedSizeFunc)getSymbol(mDl, |
84 | "JpegStub_getCompressedSize"); |
85 | return (*f)(&mStub); |
86 | } |
87 | |
88 | void NV21JpegCompressor::getCompressedImage(void* buff) |
89 | { |
90 | GetCompressedImageFunc f = (GetCompressedImageFunc)getSymbol(mDl, |
91 | "JpegStub_getCompressedImage"); |
92 | (*f)(&mStub, buff); |
93 | } |
94 | |
95 | }; /* namespace android */ |
96 |