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