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