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