1c3dbf1a40df85b75e5805382838a90416f69730fJames Painter/* 2c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * Copyright (C) 2012 The Android Open Source Project 3c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * 4c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * Licensed under the Apache License, Version 2.0 (the "License"); 5c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * you may not use this file except in compliance with the License. 6c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * You may obtain a copy of the License at 7c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * 8c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * http://www.apache.org/licenses/LICENSE-2.0 9c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * 10c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * Unless required by applicable law or agreed to in writing, software 11c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * distributed under the License is distributed on an "AS IS" BASIS, 12c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * See the License for the specific language governing permissions and 14c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * limitations under the License. 15c3dbf1a40df85b75e5805382838a90416f69730fJames Painter */ 16c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 17c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 18c3dbf1a40df85b75e5805382838a90416f69730fJames Painter/** 19c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * This class simulates a hardware JPEG compressor. It receives image buffers 20c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * in RGBA_8888 format, processes them in a worker thread, and then pushes them 21c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * out to their destination stream. 22c3dbf1a40df85b75e5805382838a90416f69730fJames Painter */ 23c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 24c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#ifndef ANDROID_SERVERS_CAMERA_JPEGCOMPRESSOR_H 25c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#define ANDROID_SERVERS_CAMERA_JPEGCOMPRESSOR_H 26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 27c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "utils/Thread.h" 28c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "utils/Mutex.h" 29c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "utils/Timers.h" 30c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "utils/Vector.h" 31c3dbf1a40df85b75e5805382838a90416f69730fJames Painter//#include "Base.h" 32c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include <stdio.h> 33c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include <gui/CpuConsumer.h> 34c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 35c3dbf1a40df85b75e5805382838a90416f69730fJames Painterextern "C" { 36c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include <jpeglib.h> 37c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 38c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 39c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 40c3dbf1a40df85b75e5805382838a90416f69730fJames Painternamespace android { 41c3dbf1a40df85b75e5805382838a90416f69730fJames Painternamespace camera2 { 42c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 43c3dbf1a40df85b75e5805382838a90416f69730fJames Painterclass JpegCompressor: private Thread, public virtual RefBase { 44c3dbf1a40df85b75e5805382838a90416f69730fJames Painter public: 45c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 46c3dbf1a40df85b75e5805382838a90416f69730fJames Painter JpegCompressor(); 47c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ~JpegCompressor(); 48c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 49c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // Start compressing COMPRESSED format buffers; JpegCompressor takes 50c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // ownership of the Buffers vector. 51c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t start(Vector<CpuConsumer::LockedBuffer*> buffers, 52c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nsecs_t captureTime); 53c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 54c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t cancel(); 55c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 56c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool isBusy(); 57c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool isStreamInUse(uint32_t id); 58c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 59c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool waitForDone(nsecs_t timeout); 60c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 61c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // TODO: Measure this 62c3dbf1a40df85b75e5805382838a90416f69730fJames Painter static const size_t kMaxJpegSize = 300000; 63c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 64c3dbf1a40df85b75e5805382838a90416f69730fJames Painter private: 65c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Mutex mBusyMutex; 66c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Mutex mMutex; 67c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool mIsBusy; 68c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Condition mDone; 69c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nsecs_t mCaptureTime; 70c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 71c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Vector<CpuConsumer::LockedBuffer*> mBuffers; 72c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CpuConsumer::LockedBuffer *mJpegBuffer; 73c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CpuConsumer::LockedBuffer *mAuxBuffer; 74c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool mFoundJpeg, mFoundAux; 75c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 76c3dbf1a40df85b75e5805382838a90416f69730fJames Painter jpeg_compress_struct mCInfo; 77c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 78c3dbf1a40df85b75e5805382838a90416f69730fJames Painter struct JpegError : public jpeg_error_mgr { 79c3dbf1a40df85b75e5805382838a90416f69730fJames Painter JpegCompressor *parent; 80c3dbf1a40df85b75e5805382838a90416f69730fJames Painter }; 81c3dbf1a40df85b75e5805382838a90416f69730fJames Painter j_common_ptr mJpegErrorInfo; 82c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 83c3dbf1a40df85b75e5805382838a90416f69730fJames Painter struct JpegDestination : public jpeg_destination_mgr { 84c3dbf1a40df85b75e5805382838a90416f69730fJames Painter JpegCompressor *parent; 85c3dbf1a40df85b75e5805382838a90416f69730fJames Painter }; 86c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 87c3dbf1a40df85b75e5805382838a90416f69730fJames Painter static void jpegErrorHandler(j_common_ptr cinfo); 88c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 89c3dbf1a40df85b75e5805382838a90416f69730fJames Painter static void jpegInitDestination(j_compress_ptr cinfo); 90c3dbf1a40df85b75e5805382838a90416f69730fJames Painter static boolean jpegEmptyOutputBuffer(j_compress_ptr cinfo); 91c3dbf1a40df85b75e5805382838a90416f69730fJames Painter static void jpegTermDestination(j_compress_ptr cinfo); 92c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 93c3dbf1a40df85b75e5805382838a90416f69730fJames Painter bool checkError(const char *msg); 94c3dbf1a40df85b75e5805382838a90416f69730fJames Painter void cleanUp(); 95c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 96c3dbf1a40df85b75e5805382838a90416f69730fJames Painter /** 97c3dbf1a40df85b75e5805382838a90416f69730fJames Painter * Inherited Thread virtual overrides 98c3dbf1a40df85b75e5805382838a90416f69730fJames Painter */ 99c3dbf1a40df85b75e5805382838a90416f69730fJames Painter private: 100c3dbf1a40df85b75e5805382838a90416f69730fJames Painter virtual status_t readyToRun(); 101c3dbf1a40df85b75e5805382838a90416f69730fJames Painter virtual bool threadLoop(); 102c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}; 103c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 104c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}; // namespace camera2 105c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}; // namespace android 106c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 107c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#endif 108