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