Home | History | Annotate | Download | only in xcore
      1 /*
      2  * video_buffer.cpp - video buffer base
      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 "video_buffer.h"
     22 #include <linux/videodev2.h>
     23 
     24 namespace XCam {
     25 
     26 VideoBufferPlanarInfo::VideoBufferPlanarInfo ()
     27 {
     28     width = 0;
     29     height = 0;
     30     pixel_bytes = 0;
     31 }
     32 
     33 VideoBufferInfo::VideoBufferInfo ()
     34 {
     35     format = 0;
     36     color_bits = 8;
     37     width = 0;
     38     height = 0;
     39     aligned_width = 0;
     40     aligned_height = 0;
     41     size = 0;
     42     components  = 0;
     43     xcam_mem_clear (strides);
     44     xcam_mem_clear (offsets);
     45 }
     46 
     47 bool
     48 VideoBufferInfo::init (
     49     uint32_t format,
     50     uint32_t width, uint32_t height,
     51     uint32_t aligned_width, uint32_t aligned_height,
     52     uint32_t size)
     53 {
     54 
     55     XCamVideoBufferInfo *info = this;
     56 
     57     return (xcam_video_buffer_info_reset (
     58                 info, format, width, height, aligned_width, aligned_height, size) == XCAM_RETURN_NO_ERROR);
     59 }
     60 
     61 bool
     62 VideoBufferInfo::is_valid () const
     63 {
     64     return format && aligned_width && aligned_height && size;
     65 }
     66 
     67 bool
     68 VideoBufferInfo::get_planar_info (
     69     VideoBufferPlanarInfo &planar, const uint32_t index) const
     70 {
     71     const XCamVideoBufferInfo *info = this;
     72     XCamVideoBufferPlanarInfo *planar_info = &planar;
     73     return (xcam_video_buffer_get_planar_info (info, planar_info, index) == XCAM_RETURN_NO_ERROR);
     74 }
     75 
     76 VideoBuffer::~VideoBuffer ()
     77 {
     78     clear_attached_buffers ();
     79     clear_all_metadata ();
     80     _parent.release ();
     81 }
     82 
     83 bool
     84 VideoBuffer::attach_buffer (const SmartPtr<VideoBuffer>& buf)
     85 {
     86     _attached_bufs.push_back (buf);
     87     return true;
     88 }
     89 
     90 bool
     91 VideoBuffer::detach_buffer (const SmartPtr<VideoBuffer>& buf)
     92 {
     93     for (VideoBufferList::iterator iter = _attached_bufs.begin ();
     94             iter != _attached_bufs.end (); ++iter) {
     95         SmartPtr<VideoBuffer>& current = *iter;
     96         if (current.ptr () == buf.ptr ()) {
     97             _attached_bufs.erase (iter);
     98             return true;
     99         }
    100     }
    101 
    102     //not found
    103     return false;
    104 }
    105 
    106 bool
    107 VideoBuffer::copy_attaches (const SmartPtr<VideoBuffer>& buf)
    108 {
    109     _attached_bufs.insert (
    110         _attached_bufs.end (), buf->_attached_bufs.begin (), buf->_attached_bufs.end ());
    111     return true;
    112 }
    113 
    114 void
    115 VideoBuffer::clear_attached_buffers ()
    116 {
    117     _attached_bufs.clear ();
    118 }
    119 
    120 bool
    121 VideoBuffer::add_metadata (const SmartPtr<MetaData>& data)
    122 {
    123     _metadata_list.push_back (data);
    124     return true;
    125 }
    126 
    127 bool
    128 VideoBuffer::remove_metadata (const SmartPtr<MetaData>& data)
    129 {
    130     for (MetaDataList::iterator iter = _metadata_list.begin ();
    131             iter != _metadata_list.end (); ++iter) {
    132         SmartPtr<MetaData>& current = *iter;
    133         if (current.ptr () == data.ptr ()) {
    134             _metadata_list.erase (iter);
    135             return true;
    136         }
    137     }
    138 
    139     //not found
    140     return false;
    141 }
    142 
    143 void
    144 VideoBuffer::clear_all_metadata ()
    145 {
    146     _metadata_list.clear ();
    147 }
    148 
    149 };
    150