blob: 73abe739c90a13bcff6abe194f021c859d6417dc [file] [log] [blame]
Wind Yuan0bb87ca2016-08-24 03:07:36 -04001/*
2 * dma_video_buffer.cpp - dma buffer
3 *
4 * Copyright (c) 2016 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
Wind Yuan0bb87ca2016-08-24 03:07:36 -040021#include "dma_video_buffer.h"
22
23namespace XCam {
24
Wind Yuan226b6af2017-03-07 05:16:31 -050025class DmaVideoBufferPriv
26 : public DmaVideoBuffer
27{
28 friend SmartPtr<DmaVideoBuffer> external_buf_to_dma_buf (XCamVideoBuffer *buf);
29protected:
30 DmaVideoBufferPriv (const VideoBufferInfo &info, XCamVideoBuffer *buf);
31 ~DmaVideoBufferPriv ();
32
33private:
34 XCamVideoBuffer *_external_buf;
35};
36
Wind Yuan0bb87ca2016-08-24 03:07:36 -040037DmaVideoBuffer::DmaVideoBuffer (const VideoBufferInfo &info, int dma_fd, bool need_close_fd)
38 : VideoBuffer (info)
39 , _dma_fd (dma_fd)
40 , _need_close_fd (need_close_fd)
41{
42 XCAM_ASSERT (dma_fd >= 0);
43}
44
45DmaVideoBuffer::~DmaVideoBuffer ()
46{
47 if (_need_close_fd && _dma_fd > 0)
48 close (_dma_fd);
49}
50
51uint8_t *
52DmaVideoBuffer::map ()
53{
54 XCAM_ASSERT (false && "DmaVideoBuffer::map not supported");
55 return NULL;
56}
57bool
58DmaVideoBuffer::unmap ()
59{
60 XCAM_ASSERT (false && "DmaVideoBuffer::map not supported");
61 return false;
62}
63
64int
65DmaVideoBuffer::get_fd ()
66{
67 return _dma_fd;
68}
69
Wind Yuan226b6af2017-03-07 05:16:31 -050070DmaVideoBufferPriv::DmaVideoBufferPriv (const VideoBufferInfo &info, XCamVideoBuffer *buf)
71 : DmaVideoBuffer (info, xcam_video_buffer_get_fd (buf), false)
72 , _external_buf (buf)
73{
74 if (buf->ref)
75 xcam_video_buffer_ref (buf);
76}
77
78DmaVideoBufferPriv::~DmaVideoBufferPriv ()
79{
80 if (_external_buf && _external_buf->unref && _external_buf->ref)
81 xcam_video_buffer_unref (_external_buf);
82}
83
84SmartPtr<DmaVideoBuffer>
85external_buf_to_dma_buf (XCamVideoBuffer *buf)
86{
87 VideoBufferInfo buf_info;
88 SmartPtr<DmaVideoBuffer> video_buffer;
89
90 XCAM_FAIL_RETURN (
91 ERROR, buf, NULL,
92 "external_buf_to_dma_buf failed since buf is NULL");
93
94 int buffer_fd = 0;
95 if (buf->get_fd)
96 buffer_fd = xcam_video_buffer_get_fd(buf);
97
98 XCAM_FAIL_RETURN (
99 ERROR, buffer_fd > 0, NULL,
100 "external_buf_to_dma_buf failed, can't get buf file-handle");
101
102 buf_info.init (buf->info.format, buf->info.width, buf->info.height,
103 buf->info.aligned_width, buf->info.aligned_height, buf->info.size);
104 video_buffer = new DmaVideoBufferPriv (buf_info, buf);
105 XCAM_ASSERT (video_buffer.ptr ());
106 return video_buffer;
107}
108
Wind Yuan0bb87ca2016-08-24 03:07:36 -0400109}