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