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@intel.com>
19 */
20
21#include "video_buffer.h"
22#include <linux/videodev2.h>
23
24namespace XCam {
25
26VideoBufferPlanarInfo::VideoBufferPlanarInfo ()
27{
28    width = 0;
29    height = 0;
30    pixel_bytes = 0;
31}
32
33VideoBufferInfo::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
47bool
48VideoBufferInfo::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
61bool
62VideoBufferInfo::is_valid () const
63{
64    return format && aligned_width && aligned_height && size;
65}
66
67bool
68VideoBufferInfo::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
76VideoBuffer::~VideoBuffer ()
77{
78    clear_attached_buffers ();
79    clear_all_metadata ();
80    _parent.release ();
81}
82
83bool
84VideoBuffer::attach_buffer (const SmartPtr<VideoBuffer>& buf)
85{
86    _attached_bufs.push_back (buf);
87    return true;
88}
89
90bool
91VideoBuffer::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
106bool
107VideoBuffer::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
114void
115VideoBuffer::clear_attached_buffers ()
116{
117    _attached_bufs.clear ();
118}
119
120bool
121VideoBuffer::add_metadata (const SmartPtr<MetaData>& data)
122{
123    _metadata_list.push_back (data);
124    return true;
125}
126
127bool
128VideoBuffer::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
143void
144VideoBuffer::clear_all_metadata ()
145{
146    _metadata_list.clear ();
147}
148
149};
150