• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) Texas Instruments - http://www.ti.com/
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 
18 
19 #include "CameraHal.h"
20 #include <ui/GraphicBufferMapper.h>
21 #include <hal_public.h>
22 
23 //temporarily define format here
24 #define HAL_PIXEL_FORMAT_TI_NV12 0x100
25 
26 namespace android {
27 
28 /**
29  * Display handler class - This class basically handles the buffer posting to display
30  */
31 
32 class ANativeWindowDisplayAdapter : public DisplayAdapter
33 {
34 public:
35 
36     typedef struct
37         {
38         void *mBuffer;
39         void *mUser;
40         int mOffset;
41         int mWidth;
42         int mHeight;
43         int mWidthStride;
44         int mHeightStride;
45         int mLength;
46         CameraFrame::FrameType mType;
47         } DisplayFrame;
48 
49     enum DisplayStates
50         {
51         DISPLAY_INIT = 0,
52         DISPLAY_STARTED,
53         DISPLAY_STOPPED,
54         DISPLAY_EXITED
55         };
56 
57 public:
58 
59     ANativeWindowDisplayAdapter();
60     virtual ~ANativeWindowDisplayAdapter();
61 
62     ///Initializes the display adapter creates any resources required
63     virtual status_t initialize();
64 
65     virtual int setPreviewWindow(struct preview_stream_ops *window);
66     virtual int setFrameProvider(FrameNotifier *frameProvider);
67     virtual int setErrorHandler(ErrorNotifier *errorNotifier);
68     virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL, S3DParameters *s3dParams = NULL);
69     virtual int disableDisplay(bool cancel_buffer = true);
70     virtual status_t pauseDisplay(bool pause);
71 
72 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
73 
74     //Used for shot to snapshot measurement
75     virtual status_t setSnapshotTimeRef(struct timeval *refTime = NULL);
76 
77 #endif
78 
79     virtual int useBuffers(void* bufArr, int num);
80     virtual bool supportsExternalBuffering();
81 
82     //Implementation of inherited interfaces
83     virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs);
84     virtual uint32_t * getOffsets() ;
85     virtual int getFd() ;
86     virtual int freeBuffer(void* buf);
87 
88     virtual int maxQueueableBuffers(unsigned int& queueable);
89 
90     ///Class specific functions
91     static void frameCallbackRelay(CameraFrame* caFrame);
92     void frameCallback(CameraFrame* caFrame);
93 
94     void displayThread();
95 
96     private:
97     void destroy();
98     bool processHalMsg();
99     status_t PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame);
100     bool handleFrameReturn();
101     status_t returnBuffersToWindow();
102 
103 public:
104 
105     static const int DISPLAY_TIMEOUT;
106     static const int FAILED_DQS_TO_SUSPEND;
107 
108     class DisplayThread : public Thread
109         {
110         ANativeWindowDisplayAdapter* mDisplayAdapter;
111         TIUTILS::MessageQueue mDisplayThreadQ;
112 
113         public:
DisplayThread(ANativeWindowDisplayAdapter * da)114             DisplayThread(ANativeWindowDisplayAdapter* da)
115             : Thread(false), mDisplayAdapter(da) { }
116 
117         ///Returns a reference to the display message Q for display adapter to post messages
msgQ()118             TIUTILS::MessageQueue& msgQ()
119                 {
120                 return mDisplayThreadQ;
121                 }
122 
threadLoop()123             virtual bool threadLoop()
124                 {
125                 mDisplayAdapter->displayThread();
126                 return false;
127                 }
128 
129             enum DisplayThreadCommands
130                 {
131                 DISPLAY_START,
132                 DISPLAY_STOP,
133                 DISPLAY_FRAME,
134                 DISPLAY_EXIT
135                 };
136         };
137 
138     //friend declarations
139 friend class DisplayThread;
140 
141 private:
142     int postBuffer(void* displayBuf);
143 
144 private:
145     bool mFirstInit;
146     bool mSuspend;
147     int mFailedDQs;
148     bool mPaused; //Pause state
149     preview_stream_ops_t*  mANativeWindow;
150     sp<DisplayThread> mDisplayThread;
151     FrameProvider *mFrameProvider; ///Pointer to the frame provider interface
152     TIUTILS::MessageQueue mDisplayQ;
153     unsigned int mDisplayState;
154     ///@todo Have a common class for these members
155     mutable Mutex mLock;
156     bool mDisplayEnabled;
157     int mBufferCount;
158     buffer_handle_t** mBufferHandleMap;
159     IMG_native_handle_t** mGrallocHandleMap;
160     uint32_t* mOffsetsMap;
161     int mFD;
162     KeyedVector<int, int> mFramesWithCameraAdapterMap;
163     sp<ErrorNotifier> mErrorNotifier;
164 
165     uint32_t mFrameWidth;
166     uint32_t mFrameHeight;
167     uint32_t mPreviewWidth;
168     uint32_t mPreviewHeight;
169 
170     uint32_t mXOff;
171     uint32_t mYOff;
172 
173     const char *mPixelFormat;
174 
175 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
176     //Used for calculating standby to first shot
177     struct timeval mStandbyToShot;
178     bool mMeasureStandby;
179     //Used for shot to snapshot/shot calculation
180     struct timeval mStartCapture;
181     bool mShotToShot;
182 
183 #endif
184 
185 };
186 
187 };
188 
189