xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/Stream.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  Copyright (c) 2019 Rockchip Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun #ifndef _STREAM_H_
18*4882a593Smuzhiyun #define _STREAM_H_
19*4882a593Smuzhiyun #include <sys/mman.h>
20*4882a593Smuzhiyun #include <v4l2_device.h>
21*4882a593Smuzhiyun #include "poll_thread.h"
22*4882a593Smuzhiyun #include "xcam_mutex.h"
23*4882a593Smuzhiyun #include "rk_aiq_types_priv.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun using namespace XCam;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun namespace RkCam {
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun class RKStream;
30*4882a593Smuzhiyun class RkPollThread : public Thread
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun public:
33*4882a593Smuzhiyun     explicit RkPollThread (const char* thName, int type, SmartPtr<V4l2Device> dev, RKStream *stream);
34*4882a593Smuzhiyun     explicit RkPollThread (const char* thName, int type, SmartPtr<V4l2SubDevice> dev, RKStream *stream);
35*4882a593Smuzhiyun     virtual ~RkPollThread ();
36*4882a593Smuzhiyun     virtual bool setPollCallback (PollCallback *callback);
37*4882a593Smuzhiyun     virtual XCamReturn start();
38*4882a593Smuzhiyun     virtual XCamReturn stop ();
setCamPhyId(int phyId)39*4882a593Smuzhiyun     void setCamPhyId(int phyId) {
40*4882a593Smuzhiyun         mCamPhyId = phyId;
41*4882a593Smuzhiyun     }
42*4882a593Smuzhiyun protected:
43*4882a593Smuzhiyun     XCAM_DEAD_COPY (RkPollThread);
44*4882a593Smuzhiyun     XCamReturn poll_buffer_loop ();
loop()45*4882a593Smuzhiyun     virtual bool loop () {
46*4882a593Smuzhiyun         XCamReturn ret = poll_buffer_loop ();
47*4882a593Smuzhiyun         if (ret == XCAM_RETURN_NO_ERROR || ret == XCAM_RETURN_ERROR_TIMEOUT ||
48*4882a593Smuzhiyun             ret == XCAM_RETURN_BYPASS)
49*4882a593Smuzhiyun             return true;
50*4882a593Smuzhiyun         return false;
51*4882a593Smuzhiyun     }
52*4882a593Smuzhiyun     XCamReturn create_stop_fds ();
53*4882a593Smuzhiyun     void destroy_stop_fds ();
54*4882a593Smuzhiyun     int mCamPhyId;
55*4882a593Smuzhiyun protected:
56*4882a593Smuzhiyun     static const int default_poll_timeout;
57*4882a593Smuzhiyun     SmartPtr<V4l2Device> _dev;
58*4882a593Smuzhiyun     SmartPtr<V4l2SubDevice> _subdev;
59*4882a593Smuzhiyun     PollCallback *_poll_callback;
60*4882a593Smuzhiyun     RKStream *_stream;
61*4882a593Smuzhiyun     //frame syncronization
62*4882a593Smuzhiyun     uint32_t frameid;
63*4882a593Smuzhiyun     int _dev_type;
64*4882a593Smuzhiyun     int _poll_stop_fd[2];
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun class RkEventPollThread : public RkPollThread
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun public:
70*4882a593Smuzhiyun     explicit RkEventPollThread (const char* thName, int type, SmartPtr<V4l2Device> dev, RKStream *stream);
71*4882a593Smuzhiyun     explicit RkEventPollThread (const char* thName, int type, SmartPtr<V4l2SubDevice> subdev, RKStream *stream);
72*4882a593Smuzhiyun     virtual ~RkEventPollThread ();
73*4882a593Smuzhiyun protected:
74*4882a593Smuzhiyun     XCAM_DEAD_COPY (RkEventPollThread);
75*4882a593Smuzhiyun     virtual XCamReturn poll_event_loop ();
loop()76*4882a593Smuzhiyun     virtual bool loop () {
77*4882a593Smuzhiyun         XCamReturn ret = poll_event_loop();
78*4882a593Smuzhiyun         if (ret == XCAM_RETURN_NO_ERROR || ret == XCAM_RETURN_ERROR_TIMEOUT ||
79*4882a593Smuzhiyun             ret == XCAM_RETURN_BYPASS)
80*4882a593Smuzhiyun             return true;
81*4882a593Smuzhiyun         return false;
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun     //SmartPtr<V4l2SubDevice> _subdev;
84*4882a593Smuzhiyun     struct v4l2_event _event;
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun class CamHwIsp20;
88*4882a593Smuzhiyun // listen mp/sp stream on/off event
89*4882a593Smuzhiyun class RkStreamEventPollThread : public RkEventPollThread
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun public:
RkStreamEventPollThread(const char * thName,SmartPtr<V4l2Device> dev,CamHwIsp20 * isp)92*4882a593Smuzhiyun     explicit RkStreamEventPollThread(const char* thName, SmartPtr<V4l2Device> dev, CamHwIsp20* isp)
93*4882a593Smuzhiyun         : RkEventPollThread(thName, ISP_POLL_ISPSTREAMSYNC, dev, NULL)
94*4882a593Smuzhiyun         , _pIsp(isp) {};
~RkStreamEventPollThread()95*4882a593Smuzhiyun     virtual ~RkStreamEventPollThread(){};
96*4882a593Smuzhiyun     XCamReturn poll_event_loop ();
97*4882a593Smuzhiyun     virtual XCamReturn start();
98*4882a593Smuzhiyun     virtual XCamReturn stop ();
99*4882a593Smuzhiyun protected:
100*4882a593Smuzhiyun     XCAM_DEAD_COPY (RkStreamEventPollThread);
101*4882a593Smuzhiyun     CamHwIsp20* _pIsp;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun class RKStream
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun public:
107*4882a593Smuzhiyun     RKStream               (SmartPtr<V4l2Device> dev, int type);
108*4882a593Smuzhiyun     RKStream               (SmartPtr<V4l2SubDevice> dev, int type);
109*4882a593Smuzhiyun     RKStream               (const char *path, int type);
110*4882a593Smuzhiyun     virtual ~RKStream      ();
111*4882a593Smuzhiyun     virtual void start                  ();
112*4882a593Smuzhiyun     virtual void startThreadOnly        ();
113*4882a593Smuzhiyun     virtual void startDeviceOnly        ();
114*4882a593Smuzhiyun     virtual void stop                   ();
115*4882a593Smuzhiyun     virtual void stopThreadOnly         ();
116*4882a593Smuzhiyun     virtual void stopDeviceOnly         ();
117*4882a593Smuzhiyun     virtual void pause                  ();
118*4882a593Smuzhiyun     virtual void resume                 ();
119*4882a593Smuzhiyun     virtual bool setPollCallback (PollCallback *callback);
120*4882a593Smuzhiyun     virtual SmartPtr<VideoBuffer>
121*4882a593Smuzhiyun     new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
122*4882a593Smuzhiyun     virtual SmartPtr<VideoBuffer>
new_video_buffer(struct v4l2_event & event,SmartPtr<V4l2Device> dev)123*4882a593Smuzhiyun     new_video_buffer(struct v4l2_event &event, SmartPtr<V4l2Device> dev) { return NULL; }
124*4882a593Smuzhiyun     virtual SmartPtr<V4l2BufferProxy>
new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf,SmartPtr<V4l2Device> dev)125*4882a593Smuzhiyun     new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev) { return NULL; }
126*4882a593Smuzhiyun     void set_device_prepared(bool prepare);
127*4882a593Smuzhiyun     XCamReturn virtual getFormat(struct v4l2_format &format);
128*4882a593Smuzhiyun     XCamReturn virtual getFormat(struct v4l2_subdev_format &format);
setCamPhyId(int phyId)129*4882a593Smuzhiyun     void setCamPhyId(int phyId) {
130*4882a593Smuzhiyun         mCamPhyId = phyId;
131*4882a593Smuzhiyun     }
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun     static const char* poll_type_to_str[ISP_POLL_POST_MAX];
134*4882a593Smuzhiyun protected:
135*4882a593Smuzhiyun     XCAM_DEAD_COPY (RKStream);
136*4882a593Smuzhiyun protected:
137*4882a593Smuzhiyun     SmartPtr<V4l2Device>  _dev;
138*4882a593Smuzhiyun     SmartPtr<V4l2SubDevice>  _subdev;
139*4882a593Smuzhiyun     int _dev_type;
140*4882a593Smuzhiyun     SmartPtr<RkPollThread> _poll_thread;
141*4882a593Smuzhiyun     bool _dev_prepared;
142*4882a593Smuzhiyun     int mCamPhyId;
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun class BaseSensorHw;
146*4882a593Smuzhiyun class LensHw;
147*4882a593Smuzhiyun class RKStatsStream : public RKStream
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun public:
150*4882a593Smuzhiyun     RKStatsStream               (SmartPtr<V4l2Device> dev, int type);
151*4882a593Smuzhiyun //    RKStatsStream               (const char *name, int type);
152*4882a593Smuzhiyun     virtual ~RKStatsStream      ();
153*4882a593Smuzhiyun     bool set_event_handle_dev(SmartPtr<BaseSensorHw> &dev);
154*4882a593Smuzhiyun     bool set_iris_handle_dev(SmartPtr<LensHw> &dev);
155*4882a593Smuzhiyun     bool set_focus_handle_dev(SmartPtr<LensHw> &dev);
156*4882a593Smuzhiyun     bool set_rx_handle_dev(CamHwIsp20* dev);
157*4882a593Smuzhiyun     virtual SmartPtr<VideoBuffer>
158*4882a593Smuzhiyun     new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
159*4882a593Smuzhiyun protected:
160*4882a593Smuzhiyun     XCAM_DEAD_COPY (RKStatsStream);
161*4882a593Smuzhiyun private:
162*4882a593Smuzhiyun     //alliance devices
163*4882a593Smuzhiyun     SmartPtr<BaseSensorHw> _event_handle_dev;
164*4882a593Smuzhiyun     SmartPtr<LensHw> _iris_handle_dev;
165*4882a593Smuzhiyun     SmartPtr<LensHw> _focus_handle_dev;
166*4882a593Smuzhiyun     CamHwIsp20* _rx_handle_dev;
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun class RKSofEventStream : public RKStream
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun public:
172*4882a593Smuzhiyun     RKSofEventStream               (SmartPtr<V4l2SubDevice> dev, int type, bool linkedToRk1608 = false);
173*4882a593Smuzhiyun     // RKSofEventStream               (const char *name, int type, bool linkedTo1608 = false);
174*4882a593Smuzhiyun     virtual ~RKSofEventStream      ();
175*4882a593Smuzhiyun     virtual void start             ();
176*4882a593Smuzhiyun     virtual void stop              ();
177*4882a593Smuzhiyun     virtual SmartPtr<VideoBuffer>
178*4882a593Smuzhiyun     new_video_buffer               (struct v4l2_event &event, SmartPtr<V4l2Device> dev);
179*4882a593Smuzhiyun protected:
180*4882a593Smuzhiyun     bool _linked_to_1608;
181*4882a593Smuzhiyun     /* the sensors which are connected to Rk1608 only subscribe a reset event */
182*4882a593Smuzhiyun     static std::atomic<bool> _is_subscribed;
183*4882a593Smuzhiyun     XCAM_DEAD_COPY (RKSofEventStream);
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun class RKRawStream : public RKStream
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun public:
189*4882a593Smuzhiyun     RKRawStream               (SmartPtr<V4l2Device> dev, int index, int type);
190*4882a593Smuzhiyun     virtual ~RKRawStream      ();
191*4882a593Smuzhiyun     virtual SmartPtr<V4l2BufferProxy>
192*4882a593Smuzhiyun     new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
193*4882a593Smuzhiyun     virtual SmartPtr<VideoBuffer>
194*4882a593Smuzhiyun     new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
195*4882a593Smuzhiyun     void set_reserved_data(int bpp);
196*4882a593Smuzhiyun public:
197*4882a593Smuzhiyun     int _dev_index;
198*4882a593Smuzhiyun     int _bpp;
199*4882a593Smuzhiyun     int _reserved[2];
200*4882a593Smuzhiyun protected:
201*4882a593Smuzhiyun     XCAM_DEAD_COPY (RKRawStream);
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun class RKPdafStream : public RKStream
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun public:
207*4882a593Smuzhiyun     RKPdafStream               (SmartPtr<V4l2Device> dev, int type);
208*4882a593Smuzhiyun     virtual ~RKPdafStream      ();
209*4882a593Smuzhiyun     virtual SmartPtr<V4l2BufferProxy>
210*4882a593Smuzhiyun     new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun protected:
213*4882a593Smuzhiyun     XCAM_DEAD_COPY (RKPdafStream);
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun class SubVideoBuffer : public VideoBuffer
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun public:
SubVideoBuffer(int num,int index,int fd,const VideoBufferInfo & info)219*4882a593Smuzhiyun    explicit SubVideoBuffer(int num, int index, int fd, const VideoBufferInfo& info)
220*4882a593Smuzhiyun        : VideoBuffer(info) {
221*4882a593Smuzhiyun        _buff_num      = num;
222*4882a593Smuzhiyun        _buff_idx      = index;
223*4882a593Smuzhiyun        _buff_fd       = fd;
224*4882a593Smuzhiyun        _buff_size     = 0;
225*4882a593Smuzhiyun        _buff_ptr      = MAP_FAILED;
226*4882a593Smuzhiyun        _v4l2buf_proxy = nullptr;
227*4882a593Smuzhiyun    }
SubVideoBuffer(int fd)228*4882a593Smuzhiyun     explicit SubVideoBuffer(int fd)
229*4882a593Smuzhiyun              :VideoBuffer()
230*4882a593Smuzhiyun     {
231*4882a593Smuzhiyun         _buff_fd = fd;
232*4882a593Smuzhiyun         _buff_size = 0;
233*4882a593Smuzhiyun         _buff_ptr = MAP_FAILED;
234*4882a593Smuzhiyun         _v4l2buf_proxy = nullptr;
235*4882a593Smuzhiyun     }
SubVideoBuffer(SmartPtr<V4l2BufferProxy> & buf)236*4882a593Smuzhiyun     explicit SubVideoBuffer(SmartPtr<V4l2BufferProxy> &buf)
237*4882a593Smuzhiyun             :VideoBuffer()
238*4882a593Smuzhiyun     {
239*4882a593Smuzhiyun         _buff_fd = -1;
240*4882a593Smuzhiyun         _buff_size = 0;
241*4882a593Smuzhiyun         _buff_ptr = MAP_FAILED;
242*4882a593Smuzhiyun         _v4l2buf_proxy = buf;
243*4882a593Smuzhiyun     }
SubVideoBuffer()244*4882a593Smuzhiyun     explicit SubVideoBuffer()
245*4882a593Smuzhiyun              :VideoBuffer()
246*4882a593Smuzhiyun     {
247*4882a593Smuzhiyun         _buff_fd = -1;
248*4882a593Smuzhiyun         _buff_size = 0;
249*4882a593Smuzhiyun         _buff_ptr = MAP_FAILED;
250*4882a593Smuzhiyun         _v4l2buf_proxy = nullptr;
251*4882a593Smuzhiyun     }
~SubVideoBuffer()252*4882a593Smuzhiyun     virtual ~SubVideoBuffer() {}
map()253*4882a593Smuzhiyun     virtual uint8_t *map ()
254*4882a593Smuzhiyun     {
255*4882a593Smuzhiyun         if (_v4l2buf_proxy.ptr()) {
256*4882a593Smuzhiyun             return (uint8_t *)_v4l2buf_proxy->get_v4l2_userptr();
257*4882a593Smuzhiyun         }
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun         if (_buff_ptr == MAP_FAILED) {
260*4882a593Smuzhiyun             _buff_ptr = mmap (NULL, _buff_size ? _buff_size: get_size (), PROT_READ | PROT_WRITE, MAP_SHARED, _buff_fd, 0);
261*4882a593Smuzhiyun             if (_buff_ptr == MAP_FAILED) {
262*4882a593Smuzhiyun                 LOGE("mmap failed, size=%d,fd=%d",_buff_size,_buff_fd);
263*4882a593Smuzhiyun                 return nullptr;
264*4882a593Smuzhiyun             }
265*4882a593Smuzhiyun         }
266*4882a593Smuzhiyun         return (uint8_t *)_buff_ptr;
267*4882a593Smuzhiyun     }
unmap()268*4882a593Smuzhiyun     virtual bool unmap ()
269*4882a593Smuzhiyun     {
270*4882a593Smuzhiyun         if (_v4l2buf_proxy.ptr()) {
271*4882a593Smuzhiyun             return true;
272*4882a593Smuzhiyun         }
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun         if (_buff_ptr != MAP_FAILED) {
275*4882a593Smuzhiyun             munmap(_buff_ptr, _buff_size ? _buff_size: get_size ());
276*4882a593Smuzhiyun             _buff_ptr = MAP_FAILED;
277*4882a593Smuzhiyun         }
278*4882a593Smuzhiyun         return true;
279*4882a593Smuzhiyun     }
get_fd()280*4882a593Smuzhiyun     virtual int get_fd ()
281*4882a593Smuzhiyun     {
282*4882a593Smuzhiyun         if (_v4l2buf_proxy.ptr()) {
283*4882a593Smuzhiyun             return _v4l2buf_proxy->get_expbuf_fd();
284*4882a593Smuzhiyun         }
285*4882a593Smuzhiyun         return _buff_fd;
286*4882a593Smuzhiyun     }
set_buff_info(int fd,int size)287*4882a593Smuzhiyun     int set_buff_info(int fd, int size)
288*4882a593Smuzhiyun     {
289*4882a593Smuzhiyun         _buff_fd = fd;
290*4882a593Smuzhiyun         _buff_size = size;
291*4882a593Smuzhiyun         return 0;
292*4882a593Smuzhiyun     }
293*4882a593Smuzhiyun 
get_buf_num()294*4882a593Smuzhiyun     int get_buf_num() { return _buff_num; }
295*4882a593Smuzhiyun 
get_index()296*4882a593Smuzhiyun     int get_index() { return _buff_idx; }
297*4882a593Smuzhiyun 
get_size()298*4882a593Smuzhiyun     int get_size() { return _buff_size; }
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun  protected:
301*4882a593Smuzhiyun     XCAM_DEAD_COPY (SubVideoBuffer);
302*4882a593Smuzhiyun private:
303*4882a593Smuzhiyun     int _buff_fd;
304*4882a593Smuzhiyun     int _buff_size;
305*4882a593Smuzhiyun     int _buff_idx;
306*4882a593Smuzhiyun     int _buff_num;
307*4882a593Smuzhiyun     void *_buff_ptr;
308*4882a593Smuzhiyun     SmartPtr<V4l2BufferProxy> _v4l2buf_proxy;
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun class SubV4l2BufferProxy : public V4l2BufferProxy
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun public:
SubV4l2BufferProxy(SmartPtr<V4l2Buffer> & buf,SmartPtr<V4l2Device> & device)314*4882a593Smuzhiyun     explicit SubV4l2BufferProxy(SmartPtr<V4l2Buffer> &buf, SmartPtr<V4l2Device> &device)
315*4882a593Smuzhiyun              :V4l2BufferProxy(buf, device)
316*4882a593Smuzhiyun     {
317*4882a593Smuzhiyun         _buff_ptr = MAP_FAILED;
318*4882a593Smuzhiyun         _buff_fd = -1;
319*4882a593Smuzhiyun         _buff_size = 0;
320*4882a593Smuzhiyun     }
~SubV4l2BufferProxy()321*4882a593Smuzhiyun     virtual ~SubV4l2BufferProxy() {}
map()322*4882a593Smuzhiyun     virtual uint8_t *map ()
323*4882a593Smuzhiyun     {
324*4882a593Smuzhiyun         if (_buff_ptr == MAP_FAILED) {
325*4882a593Smuzhiyun             _buff_ptr = mmap (NULL, _buff_size ? _buff_size: get_size (), PROT_READ | PROT_WRITE, MAP_SHARED, _buff_fd, 0);
326*4882a593Smuzhiyun             if (_buff_ptr == MAP_FAILED) {
327*4882a593Smuzhiyun                 LOGE("mmap failed, size=%d,fd=%d",_buff_size,_buff_fd);
328*4882a593Smuzhiyun                 return nullptr;
329*4882a593Smuzhiyun             }
330*4882a593Smuzhiyun         }
331*4882a593Smuzhiyun         return (uint8_t *)_buff_ptr;
332*4882a593Smuzhiyun     }
unmap()333*4882a593Smuzhiyun     virtual bool unmap ()
334*4882a593Smuzhiyun     {
335*4882a593Smuzhiyun         if (_buff_ptr != MAP_FAILED) {
336*4882a593Smuzhiyun             munmap(_buff_ptr, _buff_size ? _buff_size: get_size ());
337*4882a593Smuzhiyun             _buff_ptr = MAP_FAILED;
338*4882a593Smuzhiyun         }
339*4882a593Smuzhiyun         return true;
340*4882a593Smuzhiyun     }
get_fd()341*4882a593Smuzhiyun     virtual int get_fd ()
342*4882a593Smuzhiyun     {
343*4882a593Smuzhiyun         return _buff_fd;
344*4882a593Smuzhiyun     }
set_buff_info(int fd,int size)345*4882a593Smuzhiyun     int set_buff_info(int fd, int size)
346*4882a593Smuzhiyun     {
347*4882a593Smuzhiyun         _buff_fd = fd;
348*4882a593Smuzhiyun         _buff_size = size;
349*4882a593Smuzhiyun         return 0;
350*4882a593Smuzhiyun     }
351*4882a593Smuzhiyun protected:
352*4882a593Smuzhiyun     XCAM_DEAD_COPY (SubV4l2BufferProxy);
353*4882a593Smuzhiyun     int _buff_fd;
354*4882a593Smuzhiyun     int _buff_size;
355*4882a593Smuzhiyun     void *_buff_ptr;
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun #endif
359