blob: 084f5fc2f0d6d569278ef3a92490bfd62ce9753a
1 | /* |
2 | * Copyright (C) 2013 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_NDEBUG 0 |
18 | #define LOG_TAG "EmulatedCamera_JPEGStub" |
19 | #include <errno.h> |
20 | #include <cutils/log.h> |
21 | #include <YuvToJpegEncoder.h> |
22 | |
23 | #include "JpegStub.h" |
24 | |
25 | |
26 | extern "C" void JpegStub_init(JpegStub* stub, int* strides) { |
27 | stub->mInternalEncoder = (void*) new Yuv420SpToJpegEncoder(strides); |
28 | stub->mInternalStream = (void*)new SkDynamicMemoryWStream(); |
29 | } |
30 | |
31 | extern "C" void JpegStub_cleanup(JpegStub* stub) { |
32 | delete((Yuv420SpToJpegEncoder*)stub->mInternalEncoder); |
33 | delete((SkDynamicMemoryWStream*)stub->mInternalStream); |
34 | } |
35 | |
36 | extern "C" int JpegStub_compress(JpegStub* stub, const void* image, |
37 | int width, int height, int quality) |
38 | { |
39 | void* pY = const_cast<void*>(image); |
40 | int offsets[2]; |
41 | offsets[0] = 0; |
42 | offsets[1] = width * height; |
43 | |
44 | Yuv420SpToJpegEncoder* encoder = |
45 | (Yuv420SpToJpegEncoder*)stub->mInternalEncoder; |
46 | SkDynamicMemoryWStream* stream = |
47 | (SkDynamicMemoryWStream*)stub->mInternalStream; |
48 | if (encoder->encode(stream, pY, width, height, offsets, quality)) { |
49 | ALOGV("%s: Compressed JPEG: %d[%dx%d] -> %zu bytes", |
50 | __FUNCTION__, (width * height * 12) / 8, |
51 | width, height, stream->getOffset()); |
52 | return 0; |
53 | } else { |
54 | ALOGE("%s: JPEG compression failed", __FUNCTION__); |
55 | return errno ? errno: EINVAL; |
56 | } |
57 | } |
58 | |
59 | extern "C" void JpegStub_getCompressedImage(JpegStub* stub, void* buff) { |
60 | SkDynamicMemoryWStream* stream = |
61 | (SkDynamicMemoryWStream*)stub->mInternalStream; |
62 | stream->copyTo(buff); |
63 | } |
64 | |
65 | extern "C" size_t JpegStub_getCompressedSize(JpegStub* stub) { |
66 | SkDynamicMemoryWStream* stream = |
67 | (SkDynamicMemoryWStream*)stub->mInternalStream; |
68 | return stream->getOffset(); |
69 | } |
70 |