• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H
18 #define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H
19 
20 #include <utils/Thread.h>
21 #include <utils/String16.h>
22 #include <utils/Vector.h>
23 #include <utils/Mutex.h>
24 #include <utils/Condition.h>
25 #include <gui/BufferItemConsumer.h>
26 #include "Parameters.h"
27 #include "FrameProcessor.h"
28 #include "camera/CameraMetadata.h"
29 #include "Camera2Heap.h"
30 #include "../CameraDeviceBase.h"
31 #include "ZslProcessorInterface.h"
32 
33 namespace android {
34 
35 class Camera2Client;
36 
37 namespace camera2 {
38 
39 class CaptureSequencer;
40 
41 /***
42  * ZSL queue processing
43  */
44 class ZslProcessor:
45             virtual public Thread,
46             virtual public BufferItemConsumer::FrameAvailableListener,
47             virtual public FrameProcessor::FilteredListener,
48             virtual public CameraDeviceBase::BufferReleasedListener,
49                     public ZslProcessorInterface {
50   public:
51     ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
52     ~ZslProcessor();
53 
54     // From mZslConsumer
55     virtual void onFrameAvailable();
56     // From FrameProcessor
57     virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
58 
59     virtual void onBufferReleased(buffer_handle_t *handle);
60 
61     /**
62      ****************************************
63      * ZslProcessorInterface implementation *
64      ****************************************
65      */
66 
67     status_t updateStream(const Parameters &params);
68     status_t deleteStream();
69     int getStreamId() const;
70 
71     status_t pushToReprocess(int32_t requestId);
72     status_t clearZslQueue();
73 
74     void dump(int fd, const Vector<String16>& args) const;
75   private:
76     static const nsecs_t kWaitDuration = 10000000; // 10 ms
77 
78     enum {
79         RUNNING,
80         LOCKED
81     } mState;
82 
83     wp<Camera2Client> mClient;
84     wp<CameraDeviceBase> mDevice;
85     wp<CaptureSequencer> mSequencer;
86     int mId;
87 
88     mutable Mutex mInputMutex;
89     bool mZslBufferAvailable;
90     Condition mZslBufferAvailableSignal;
91 
92     enum {
93         NO_STREAM = -1
94     };
95 
96     int mZslStreamId;
97     int mZslReprocessStreamId;
98     sp<BufferItemConsumer> mZslConsumer;
99     sp<ANativeWindow>      mZslWindow;
100 
101     struct ZslPair {
102         BufferItemConsumer::BufferItem buffer;
103         CameraMetadata frame;
104     };
105 
106     static const size_t kZslBufferDepth = 4;
107     static const size_t kFrameListDepth = kZslBufferDepth * 2;
108     Vector<CameraMetadata> mFrameList;
109     size_t mFrameListHead;
110 
111     ZslPair mNextPair;
112 
113     Vector<ZslPair> mZslQueue;
114     size_t mZslQueueHead;
115     size_t mZslQueueTail;
116 
117     CameraMetadata mLatestCapturedRequest;
118 
119     virtual bool threadLoop();
120 
121     status_t processNewZslBuffer();
122 
123     // Match up entries from frame list to buffers in ZSL queue
124     void findMatchesLocked();
125 
126     status_t clearZslQueueLocked();
127 
128     void dumpZslQueue(int id) const;
129 };
130 
131 
132 }; //namespace camera2
133 }; //namespace android
134 
135 #endif
136