| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #define LOG_NDEBUG 0 |
| #define LOG_TAG "EmulatedCamera_JPEGStub" |
| #include <errno.h> |
| #include <cutils/log.h> |
| #include <YuvToJpegEncoder.h> |
| |
| #include "JpegStub.h" |
| |
| |
| extern "C" void JpegStub_init(JpegStub* stub, int* strides) { |
| stub->mInternalEncoder = (void*) new Yuv420SpToJpegEncoder(strides); |
| stub->mInternalStream = (void*)new SkDynamicMemoryWStream(); |
| } |
| |
| extern "C" void JpegStub_cleanup(JpegStub* stub) { |
| delete((Yuv420SpToJpegEncoder*)stub->mInternalEncoder); |
| delete((SkDynamicMemoryWStream*)stub->mInternalStream); |
| } |
| |
| extern "C" int JpegStub_compress(JpegStub* stub, const void* image, |
| int width, int height, int quality) |
| { |
| void* pY = const_cast<void*>(image); |
| int offsets[2]; |
| offsets[0] = 0; |
| offsets[1] = width * height; |
| |
| Yuv420SpToJpegEncoder* encoder = |
| (Yuv420SpToJpegEncoder*)stub->mInternalEncoder; |
| SkDynamicMemoryWStream* stream = |
| (SkDynamicMemoryWStream*)stub->mInternalStream; |
| if (encoder->encode(stream, pY, width, height, offsets, quality)) { |
| ALOGV("%s: Compressed JPEG: %d[%dx%d] -> %d bytes", |
| __FUNCTION__, (width * height * 12) / 8, |
| width, height, stream->getOffset()); |
| return 0; |
| } else { |
| ALOGE("%s: JPEG compression failed", __FUNCTION__); |
| return errno ? errno: EINVAL; |
| } |
| } |
| |
| extern "C" void JpegStub_getCompressedImage(JpegStub* stub, void* buff) { |
| SkDynamicMemoryWStream* stream = |
| (SkDynamicMemoryWStream*)stub->mInternalStream; |
| stream->copyTo(buff); |
| } |
| |
| extern "C" size_t JpegStub_getCompressedSize(JpegStub* stub) { |
| SkDynamicMemoryWStream* stream = |
| (SkDynamicMemoryWStream*)stub->mInternalStream; |
| return stream->getOffset(); |
| } |