Home | History | Annotate | Download | only in xcore
      1 /*
      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 (at) intel.com>
     19  */
     20 
     21 #include "dma_video_buffer.h"
     22 
     23 namespace XCam {
     24 
     25 class DmaVideoBufferPriv
     26     : public DmaVideoBuffer
     27 {
     28     friend SmartPtr<DmaVideoBuffer> external_buf_to_dma_buf (XCamVideoBuffer *buf);
     29 protected:
     30     DmaVideoBufferPriv (const VideoBufferInfo &info, XCamVideoBuffer *buf);
     31     ~DmaVideoBufferPriv ();
     32 
     33 private:
     34     XCamVideoBuffer *_external_buf;
     35 };
     36 
     37 DmaVideoBuffer::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 
     45 DmaVideoBuffer::~DmaVideoBuffer ()
     46 {
     47     if (_need_close_fd && _dma_fd > 0)
     48         close (_dma_fd);
     49 }
     50 
     51 uint8_t *
     52 DmaVideoBuffer::map ()
     53 {
     54     XCAM_ASSERT (false && "DmaVideoBuffer::map not supported");
     55     return NULL;
     56 }
     57 bool
     58 DmaVideoBuffer::unmap ()
     59 {
     60     XCAM_ASSERT (false && "DmaVideoBuffer::map not supported");
     61     return false;
     62 }
     63 
     64 int
     65 DmaVideoBuffer::get_fd ()
     66 {
     67     return _dma_fd;
     68 }
     69 
     70 DmaVideoBufferPriv::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 
     78 DmaVideoBufferPriv::~DmaVideoBufferPriv ()
     79 {
     80     if (_external_buf && _external_buf->unref && _external_buf->ref)
     81         xcam_video_buffer_unref (_external_buf);
     82 }
     83 
     84 SmartPtr<DmaVideoBuffer>
     85 external_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 
    109 }
    110