Home | History | Annotate | Download | only in xcore
      1 /*
      2  * v4l2_buffer_proxy.cpp - 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 #include "v4l2_buffer_proxy.h"
     22 #include "v4l2_device.h"
     23 
     24 namespace XCam {
     25 V4l2Buffer::V4l2Buffer (const struct v4l2_buffer &buf, const struct v4l2_format &format)
     26 {
     27     _buf = buf;
     28     _format = format;
     29 }
     30 
     31 V4l2Buffer::~V4l2Buffer ()
     32 {
     33 }
     34 
     35 uint8_t *
     36 V4l2Buffer::map ()
     37 {
     38     if (_buf.memory == V4L2_MEMORY_DMABUF)
     39         return NULL;
     40     return (uint8_t *)(_buf.m.userptr);
     41 }
     42 
     43 bool
     44 V4l2Buffer::unmap ()
     45 {
     46     return true;
     47 }
     48 
     49 int
     50 V4l2Buffer::get_fd ()
     51 {
     52     if (_buf.memory == V4L2_MEMORY_MMAP)
     53         return -1;
     54     return _buf.m.fd;
     55 }
     56 
     57 V4l2BufferProxy::V4l2BufferProxy (SmartPtr<V4l2Buffer> &buf, SmartPtr<V4l2Device> &device)
     58     : BufferProxy (buf)
     59     , _device (device)
     60 {
     61     VideoBufferInfo info;
     62     struct timeval ts = buf->get_buf().timestamp;
     63 
     64     v4l2_format_to_video_info (buf->get_format(), info);
     65     set_video_info (info);
     66     set_timestamp (XCAM_TIMEVAL_2_USEC (ts));
     67 }
     68 
     69 V4l2BufferProxy::~V4l2BufferProxy ()
     70 {
     71     SmartPtr<BufferData> data = get_buffer_data ();
     72     SmartPtr<V4l2Buffer> v4l2_data = data.dynamic_cast_ptr<V4l2Buffer> ();
     73     if (_device.ptr () && v4l2_data.ptr ())
     74         _device->queue_buffer (v4l2_data);
     75     XCAM_LOG_DEBUG ("v4l2 buffer released");
     76 }
     77 
     78 void
     79 V4l2BufferProxy::v4l2_format_to_video_info (
     80     const struct v4l2_format &format, VideoBufferInfo &info)
     81 {
     82     info.format = format.fmt.pix.pixelformat;
     83     info.color_bits = 8;
     84     info.width = format.fmt.pix.width;
     85     info.height = format.fmt.pix.height;
     86     info.aligned_width = 0;
     87     info.aligned_height = 0;
     88     info.size = format.fmt.pix.sizeimage;
     89     switch (format.fmt.pix.pixelformat) {
     90     case V4L2_PIX_FMT_NV12:  // 420
     91     case V4L2_PIX_FMT_NV21:
     92         info.components = 2;
     93         info.strides [0] = format.fmt.pix.bytesperline * 2 / 3;
     94         info.strides [1] = info.strides [0];
     95         info.offsets[0] = 0;
     96         info.offsets[1] = info.strides [0] * format.fmt.pix.height;
     97         break;
     98     case V4L2_PIX_FMT_YUV422P: // 422 Planar
     99         info.components = 3;
    100         info.strides [0] = format.fmt.pix.bytesperline / 2;
    101         info.strides [1] = info.strides [0] / 2 ;
    102         info.strides [2] = info.strides [0] / 2 ;
    103         info.offsets[0] = 0;
    104         info.offsets[1] = info.strides [0] * format.fmt.pix.height;
    105         info.offsets[2] = info.offsets[1] + info.strides [1] * format.fmt.pix.height;
    106         break;
    107     case V4L2_PIX_FMT_YUYV: // 422
    108         info.components = 1;
    109         info.strides [0] = format.fmt.pix.bytesperline;
    110         info.offsets[0] = 0;
    111         info.aligned_width = info.strides [0] / 2;
    112         break;
    113     case V4L2_PIX_FMT_SBGGR10:
    114     case V4L2_PIX_FMT_SGBRG10:
    115     case V4L2_PIX_FMT_SGRBG10:
    116     case V4L2_PIX_FMT_SRGGB10:
    117         info.color_bits = 10;
    118         info.components = 1;
    119         info.strides [0] = format.fmt.pix.bytesperline;
    120         info.offsets[0] = 0;
    121         break;
    122     case V4L2_PIX_FMT_SBGGR12:
    123     case V4L2_PIX_FMT_SGBRG12:
    124     case V4L2_PIX_FMT_SGRBG12:
    125     case V4L2_PIX_FMT_SRGGB12:
    126         info.color_bits = 12;
    127         info.components = 1;
    128         info.strides [0] = format.fmt.pix.bytesperline;
    129         info.offsets[0] = 0;
    130         break;
    131     default:
    132         XCAM_LOG_WARNING (
    133             "unknown v4l2 format(%s) to video info",
    134             xcam_fourcc_to_string (format.fmt.pix.pixelformat));
    135         break;
    136     }
    137 
    138     if (!info.aligned_width)
    139         info.aligned_width = info.strides [0];
    140 
    141     if (!info.aligned_height)
    142         info.aligned_height = info.height;
    143 
    144 }
    145 
    146 const struct v4l2_buffer &
    147 V4l2BufferProxy::get_v4l2_buf ()
    148 {
    149     SmartPtr<BufferData> &data = get_buffer_data ();
    150     SmartPtr<V4l2Buffer> v4l2_data = data.dynamic_cast_ptr<V4l2Buffer> ();
    151     XCAM_ASSERT (v4l2_data.ptr ());
    152     return v4l2_data->get_buf ();
    153 }
    154 
    155 };
    156