swapped_buffer.cpp revision 9fbfce6bd98f1d790f75215932de854892a58154
1/*
2 * swapped_buffer.cpp - swapped buffer
3 *
4 *  Copyright (c) 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 <xcam_std.h>
22#include "swapped_buffer.h"
23
24namespace XCam {
25
26SwappedBuffer::SwappedBuffer (
27    const VideoBufferInfo &info, const SmartPtr<BufferData> &data)
28    : BufferProxy (info, data)
29    , _swap_flags (SwappedBuffer::SwapNone)
30{
31    xcam_mem_clear (_swap_offsets);
32}
33
34SwappedBuffer::~SwappedBuffer ()
35{
36}
37
38void
39SwappedBuffer::set_swap_info (uint32_t flags, uint32_t* offsets)
40{
41    _swap_flags = flags;
42    XCAM_ASSERT (offsets);
43    memcpy(_swap_offsets, offsets, sizeof (_swap_offsets));
44}
45
46bool SwappedBuffer::swap_new_buffer_info(
47    const VideoBufferInfo &in, uint32_t flags, VideoBufferInfo &out)
48{
49    out = in;
50    if (flags & (uint32_t)(SwapY)) {
51        if (in.offsets[0] == _swap_offsets[SwapYOffset0]) {
52            out.offsets[0] = _swap_offsets[SwapYOffset1];
53        } else {
54            XCAM_ASSERT (in.offsets[0] == _swap_offsets[SwapYOffset1]);
55            out.offsets[0] = _swap_offsets[SwapYOffset0];
56        }
57    }
58    if (flags & (uint32_t)(SwapUV)) {
59        if (in.offsets[1] == _swap_offsets[SwapUVOffset0]) {
60            out.offsets[1] = _swap_offsets[SwapUVOffset1];
61        } else {
62            XCAM_ASSERT (in.offsets[1] == _swap_offsets[SwapUVOffset1]);
63            out.offsets[1] = _swap_offsets[SwapUVOffset0];
64        }
65    }
66    return true;
67}
68
69SmartPtr<SwappedBuffer>
70SwappedBuffer::create_new_swap_buffer (
71    const VideoBufferInfo &info, SmartPtr<BufferData> &data)
72{
73    XCAM_ASSERT (false);
74    SmartPtr<SwappedBuffer> out = new SwappedBuffer (info, data);
75    return out;
76}
77
78SmartPtr<SwappedBuffer>
79SwappedBuffer::swap_clone (SmartPtr<SwappedBuffer> self, uint32_t flags)
80{
81    XCAM_ASSERT (self.ptr () && self.ptr () == (SwappedBuffer*)(this));
82    XCAM_FAIL_RETURN(
83        WARNING,
84        flags && (flags & _swap_flags) == flags,
85        NULL,
86        "SwappedBuffer swap_clone failed since flags doesn't match");
87
88    const VideoBufferInfo &cur_info = this->get_video_info ();
89    VideoBufferInfo out_info;
90    XCAM_FAIL_RETURN(
91        WARNING,
92        swap_new_buffer_info (cur_info, flags, out_info),
93        NULL,
94        "SwappedBuffer swap_clone failed on out buffer info");
95
96    SmartPtr<BufferData> data = get_buffer_data ();
97    XCAM_FAIL_RETURN(
98        WARNING,
99        data.ptr (),
100        NULL,
101        "SwappedBuffer swap_clone failed to get buffer data");
102
103    SmartPtr<SwappedBuffer> out = create_new_swap_buffer (out_info, data);
104    XCAM_FAIL_RETURN(
105        WARNING,
106        out.ptr (),
107        NULL,
108        "SwappedBuffer swap_clone failed to create new swap buffer");
109    out->_swap_flags = _swap_flags;
110    memcpy (out->_swap_offsets, _swap_offsets, sizeof (_swap_offsets));
111    out->set_parent (self);
112    return out;
113}
114
115};
116