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 
JpegStub_init(JpegStub * stub,int * strides)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 
JpegStub_cleanup(JpegStub * stub)31 extern "C" void JpegStub_cleanup(JpegStub* stub) {
32     delete((Yuv420SpToJpegEncoder*)stub->mInternalEncoder);
33     delete((SkDynamicMemoryWStream*)stub->mInternalStream);
34 }
35 
JpegStub_compress(JpegStub * stub,const void * image,int width,int height,int quality)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 
JpegStub_getCompressedImage(JpegStub * stub,void * buff)59 extern "C" void JpegStub_getCompressedImage(JpegStub* stub, void* buff) {
60     SkDynamicMemoryWStream* stream =
61         (SkDynamicMemoryWStream*)stub->mInternalStream;
62     stream->copyTo(buff);
63 }
64 
JpegStub_getCompressedSize(JpegStub * stub)65 extern "C" size_t JpegStub_getCompressedSize(JpegStub* stub) {
66     SkDynamicMemoryWStream* stream =
67         (SkDynamicMemoryWStream*)stub->mInternalStream;
68     return stream->getOffset();
69 }
70