Home | History | Annotate | Download | only in xcore
      1 /*
      2  * v4l2_buffer_proxy.h - v4l2 buffer proxy
      3  *
      4  *  Copyright (c) 2014-2015 Intel Corporation
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  *
     18  * Author: Wind Yuan <feng.yuan (at) intel.com>
     19  */
     20 
     21 #ifndef XCAM_V4L2_BUFFER_PROXY_H
     22 #define XCAM_V4L2_BUFFER_PROXY_H
     23 
     24 #include <xcam_std.h>
     25 #include <buffer_pool.h>
     26 #include <linux/videodev2.h>
     27 
     28 namespace XCam {
     29 
     30 class V4l2Device;
     31 
     32 class V4l2Buffer
     33     : public BufferData
     34 {
     35 public:
     36     explicit V4l2Buffer (const struct v4l2_buffer &buf, const struct v4l2_format &format);
     37     virtual ~V4l2Buffer ();
     38 
     39     const struct v4l2_buffer & get_buf () const {
     40         return _buf;
     41     }
     42 
     43     void set_timestamp (const struct timeval &time) {
     44         _buf.timestamp = time;
     45     }
     46 
     47     void set_timecode (const struct v4l2_timecode &code) {
     48         _buf.timecode = code;
     49     }
     50 
     51     void set_sequence (const uint32_t sequence) {
     52         _buf.sequence = sequence;
     53     }
     54 
     55     void set_length (const uint32_t value) {
     56         _buf.length = value;
     57     }
     58 
     59     void reset () {
     60         xcam_mem_clear (_buf.timestamp);
     61         xcam_mem_clear (_buf.timecode);
     62         _buf.sequence = 0;
     63         //_buf.length = 0;
     64     }
     65 
     66     const struct v4l2_format & get_format () const {
     67         return _format;
     68     }
     69 
     70     // derived from BufferData
     71     virtual uint8_t *map ();
     72     virtual bool unmap ();
     73     virtual int get_fd ();
     74 
     75 private:
     76     XCAM_DEAD_COPY (V4l2Buffer);
     77 
     78 private:
     79     struct v4l2_buffer  _buf;
     80     struct v4l2_format  _format;
     81 };
     82 
     83 class V4l2BufferProxy
     84     : public BufferProxy
     85 {
     86 public:
     87     explicit V4l2BufferProxy (SmartPtr<V4l2Buffer> &buf, SmartPtr<V4l2Device> &device);
     88 
     89     ~V4l2BufferProxy ();
     90 
     91     int get_v4l2_buf_index () {
     92         return get_v4l2_buf().index;
     93     }
     94 
     95     enum v4l2_memory get_v4l2_mem_type () {
     96         return (enum v4l2_memory)(get_v4l2_buf().memory);
     97     }
     98 
     99     int get_v4l2_buf_length () {
    100         return get_v4l2_buf().length;
    101     }
    102 
    103     int get_v4l2_dma_fd () {
    104         return get_v4l2_buf().m.fd;
    105     }
    106 
    107     uintptr_t get_v4l2_userptr () {
    108         return get_v4l2_buf().m.userptr;
    109     }
    110 
    111 private:
    112     const struct v4l2_buffer & get_v4l2_buf ();
    113 
    114     void v4l2_format_to_video_info (
    115         const struct v4l2_format &format, VideoBufferInfo &info);
    116 
    117     XCAM_DEAD_COPY (V4l2BufferProxy);
    118 
    119 private:
    120     SmartPtr<V4l2Device>  _device;
    121 };
    122 };
    123 
    124 #endif //XCAM_V4L2_BUFFER_PROXY_H
    125