/*
|
* video_buffer.cpp - video buffer base
|
*
|
* Copyright (c) 2014-2015 Intel Corporation
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*
|
* Author: Wind Yuan <feng.yuan@intel.com>
|
*/
|
|
#include "video_buffer.h"
|
#include <linux/videodev2.h>
|
|
namespace XCam {
|
|
VideoBufferPlanarInfo::VideoBufferPlanarInfo ()
|
{
|
width = 0;
|
height = 0;
|
pixel_bytes = 0;
|
}
|
|
VideoBufferInfo::VideoBufferInfo ()
|
{
|
format = 0;
|
color_bits = 8;
|
width = 0;
|
height = 0;
|
aligned_width = 0;
|
aligned_height = 0;
|
size = 0;
|
components = 0;
|
xcam_mem_clear (strides);
|
xcam_mem_clear (offsets);
|
}
|
|
bool
|
VideoBufferInfo::init (
|
uint32_t format,
|
uint32_t width, uint32_t height,
|
uint32_t aligned_width, uint32_t aligned_height,
|
uint32_t size, bool compacted)
|
{
|
|
XCamVideoBufferInfo *info = this;
|
|
return (xcam_video_buffer_info_reset (
|
info, format, width, height, aligned_width, aligned_height, size, compacted) == XCAM_RETURN_NO_ERROR);
|
}
|
|
bool
|
VideoBufferInfo::fill (const XCamVideoBufferInfo &info)
|
{
|
format = info.format;
|
color_bits = info.color_bits;
|
width = info.width;
|
height = info.height;
|
aligned_width = info.aligned_width;
|
aligned_height = info.aligned_height;
|
size = info.size;
|
components = info.components;
|
for (int i = 0; i < XCAM_VIDEO_MAX_COMPONENTS; i++) {
|
strides[i] = info.strides[i];
|
offsets[i] = info.offsets[i];
|
}
|
|
return true;
|
}
|
|
bool
|
VideoBufferInfo::is_valid () const
|
{
|
return format && aligned_width && aligned_height && size;
|
}
|
|
bool
|
VideoBufferInfo::get_planar_info (
|
VideoBufferPlanarInfo &planar, const uint32_t index) const
|
{
|
const XCamVideoBufferInfo *info = this;
|
XCamVideoBufferPlanarInfo *planar_info = &planar;
|
return (xcam_video_buffer_get_planar_info (info, planar_info, index) == XCAM_RETURN_NO_ERROR);
|
}
|
|
VideoBuffer::~VideoBuffer ()
|
{
|
clear_attached_buffers ();
|
clear_all_metadata ();
|
_parent.release ();
|
}
|
|
bool
|
VideoBuffer::attach_buffer (const SmartPtr<VideoBuffer>& buf)
|
{
|
_attached_bufs.push_back (buf);
|
return true;
|
}
|
|
bool
|
VideoBuffer::detach_buffer (const SmartPtr<VideoBuffer>& buf)
|
{
|
for (VideoBufferList::iterator iter = _attached_bufs.begin ();
|
iter != _attached_bufs.end (); ++iter) {
|
SmartPtr<VideoBuffer>& current = *iter;
|
if (current.ptr () == buf.ptr ()) {
|
_attached_bufs.erase (iter);
|
return true;
|
}
|
}
|
|
//not found
|
return false;
|
}
|
|
bool
|
VideoBuffer::copy_attaches (const SmartPtr<VideoBuffer>& buf)
|
{
|
_attached_bufs.insert (
|
_attached_bufs.end (), buf->_attached_bufs.begin (), buf->_attached_bufs.end ());
|
return true;
|
}
|
|
void
|
VideoBuffer::clear_attached_buffers ()
|
{
|
_attached_bufs.clear ();
|
}
|
|
bool
|
VideoBuffer::add_metadata (const SmartPtr<MetaData>& data)
|
{
|
_metadata_list.push_back (data);
|
return true;
|
}
|
|
bool
|
VideoBuffer::remove_metadata (const SmartPtr<MetaData>& data)
|
{
|
for (MetaDataList::iterator iter = _metadata_list.begin ();
|
iter != _metadata_list.end (); ++iter) {
|
SmartPtr<MetaData>& current = *iter;
|
if (current.ptr () == data.ptr ()) {
|
_metadata_list.erase (iter);
|
return true;
|
}
|
}
|
|
//not found
|
return false;
|
}
|
|
void
|
VideoBuffer::clear_all_metadata ()
|
{
|
_metadata_list.clear ();
|
}
|
|
};
|