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