liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
 
#ifndef __HAL_CAMERA_MANAGER_H__
#define __HAL_CAMERA_MANAGER_H__
 
#include "CameraDebug.h"
#include <fcntl.h>
#include <cutils/list.h>
#include <utils/Mutex.h>
#include <type_camera.h>
#include "CameraHardware2.h"
 
#ifdef CAMERA_MANAGER_ENABLE
 
#define NB_COMPOSE_BUFFER 5//10
 
namespace android {
 
typedef struct BufManager_t
{
    int         write_id;
    int         read_id;
    int         buf_used;
    pthread_mutex_t                 mutex;
    pthread_cond_t                  condition;
    V4L2BUF_t   buf[NB_COMPOSE_BUFFER];
}BufManager;
 
enum CaptureState {
        CAPTURE_STATE_PAUSE,
        CAPTURE_STATE_READY,
        CAPTURE_STATE_STARTED,
        CAPTURE_STATE_EXIT,
        CAPTURE_STATE_IDLE,
};
 
class CameraManager {
public:
    CameraManager();
    ~CameraManager();
    bool composeThread();
    bool commandThread();
    bool previewThread();
    status_t setCameraHardware(int index,CameraHardware *hardware);
    int setFrameSize(int index,int width,int height);
    int setCaptureState(int index,int state);
    int queueCameraBuf(int index,V4L2BUF_t *buffer);
    void startPreview();
    void stopPreview();
    void releaseCamera();
    int composeBufInit();
    int composeBufDeinit();
    inline void setOviewEnable(bool enable)
    {
        mIsOview= enable;
    }
 
    inline bool isOviewEnable(void)
    {
        return mIsOview;
    }
 
protected:
    typedef enum CMD_CM_QUEUE_t{
        CMD_CM_START_PREVIEW    = 0,
        CMD_CM_STOP_PREVIEW,
        CMD_CM_RELEASE_CAMERA,
        CMD_CM_QUEUE_MAX
    }CMD_CM_QUEUE;
 
    OSAL_QUEUE                      mQueueCMCommand;
 
    typedef struct Queue_CM_Element_t {
        CMD_CM_QUEUE cmd;
        int data;
    }Queue_CM_Element;
 
    Queue_CM_Element                   mQueueCMElement[CMD_CM_QUEUE_MAX];
 
    class DoCommandThread : public Thread {
        CameraManager* mCameraManager;
        bool                mRequestExit;
    public:
       DoCommandThread(CameraManager* dev) :
                Thread(false),
                mCameraManager(dev),
                mRequestExit(false) {
            }
            void startThread() {
                run("CMDoCommandThread", PRIORITY_URGENT_DISPLAY);
            }
            void stopThread() {
                mRequestExit = true;
            }
            virtual bool threadLoop() {
                if (mRequestExit) {
                    return false;
                }
                return mCameraManager->commandThread();
            }
    };
    sp<DoCommandThread>             mCommandThread;
 
    pthread_mutex_t                 mCommandMutex;
    pthread_cond_t                  mCommandCond;
 
        class ComposeThread : public Thread {
            CameraManager*  mCameraManager;
            bool                mRequestExit;
        public:
            ComposeThread(CameraManager* dev) :
                Thread(false),
                mCameraManager(dev),
                mRequestExit(false) {
            }
            void startThread() {
                run("ComposeThread", PRIORITY_URGENT_DISPLAY);
            }
            void stopThread() {
                mRequestExit = true;
            }
            virtual bool threadLoop() {
                if (mRequestExit) {
                    return false;
                }
                return mCameraManager->composeThread();
            }
        };
 
        class PreviewThread : public Thread {
            CameraManager*  mCameraManager;
            bool                mRequestExit;
        public:
            PreviewThread(CameraManager* dev) :
                Thread(false),
                mCameraManager(dev),
                mRequestExit(false) {
            }
            void startThread() {
                run("PreviewThread", PRIORITY_URGENT_DISPLAY);
            }
            void stopThread() {
                mRequestExit = true;
            }
            virtual bool threadLoop() {
                if (mRequestExit) {
                    return false;
                }
                return mCameraManager->previewThread();
            }
        };
    int g2d_scale(unsigned long src, int src_width, int src_height, unsigned long dst,int dst_x,int dst_y, int dst_width, int dst_height);
    int g2d_clip(void* psrc, int src_w, int src_h, int src_x, int src_y, int width, int height, void* pdst, int dst_w, int dst_h, int dst_x, int dst_y);
    int g2d_compose(void* psrc1, void* psrc2, void* psrc3, void* psrc4, int src_w, int src_h, void* pdst);
   int g2d_compose_two(void* psrc1, void* psrc2, int src_w, int src_h, void* pdst);
#ifdef ENABLE_SCALE
   int g2d_scale_compose(unsigned long psrc1, unsigned long psrc2, unsigned long psrc3,
   unsigned long psrc4, int src_w, int src_h, unsigned long pdst);
#endif
 
public:
    int mStartCameraID;
    int mCameraTotalNum;
    int mFrameWidth;
    int mFrameHeight;
    int mComposeFrameWidth;
    int mComposeFrameHeight;
    bool mTakePicState;
    Mutex mLock;
    void releaseByIndex(int index);
 
private:
    CaptureState    mCaptureState;
 
    bool mIsOview;
    bool mCameraState[MAX_NUM_OF_CAMERAS];
    int mReleaseIndex[NB_BUFFER][MAX_NUM_OF_CAMERAS];
    BufManager mComposeBuf;
    BufManager mCameraBuf[MAX_NUM_OF_CAMERAS];
    int mAbandonFrameCnt;
    CameraHardware *                mCameraHardware[MAX_NUM_OF_CAMERAS];
    pthread_mutex_t                 mPreviewMutex;
    pthread_cond_t                  mPreviewCond;
    pthread_mutex_t                 mComposeMutex;
    pthread_cond_t                  mComposeCond;
    sp<ComposeThread>             mComposeThread;
    sp<PreviewThread>             mPreviewThread;
    int mG2DHandle;
 
    int ionOpen();
    int ionClose();
    V4L2BUF_t * getAvailableWriteBuf();
    bool canCompose();
    void composeBuffer2in1(unsigned char *outBuffer,unsigned char *inBuffer0,unsigned char *inBuffer1);
    void composeBuffer4in1(unsigned char *outBuffer,unsigned char *inBuffer0,unsigned char *inBuffer1,
    unsigned char *inBuffer2,unsigned char *inBuffer3);
    int queueComposeBuf();
    bool isSameSize();
    void releaseAllCameraBuff();
    struct ScCamMemOpsS* mMemOpsSCM;
};
 
}; /* namespace android */
 
#endif //CAMERA_MANAGER_ENABLE
 
#endif  /* __HAL_CAMERA_MANAGER_H__ */