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