1 /* 2 * fake_poll_thread.cpp - poll thread for raw image 3 * 4 * Copyright (c) 2014-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: Jia Meng <jia.meng (at) intel.com> 19 */ 20 21 #include "fake_poll_thread.h" 22 #if HAVE_LIBDRM 23 #include "drm_bo_buffer.h" 24 #endif 25 26 #define DEFAULT_FPT_BUF_COUNT 4 27 28 namespace XCam { 29 30 FakePollThread::FakePollThread (const char *raw_path) 31 : _raw_path (NULL) 32 , _raw (NULL) 33 { 34 XCAM_ASSERT (raw_path); 35 36 if (raw_path) 37 _raw_path = strndup (raw_path, XCAM_MAX_STR_SIZE); 38 } 39 40 FakePollThread::~FakePollThread () 41 { 42 if (_raw_path) 43 xcam_free (_raw_path); 44 45 if (_raw) 46 fclose (_raw); 47 } 48 49 XCamReturn 50 FakePollThread::start() 51 { 52 XCAM_FAIL_RETURN( 53 ERROR, 54 _raw_path, 55 XCAM_RETURN_ERROR_FILE, 56 "FakePollThread failed due to raw path NULL"); 57 58 _raw = fopen (_raw_path, "rb"); 59 XCAM_FAIL_RETURN( 60 ERROR, 61 _raw, 62 XCAM_RETURN_ERROR_FILE, 63 "FakePollThread failed to open file:%s", XCAM_STR (_raw_path)); 64 65 return PollThread::start (); 66 } 67 68 XCamReturn 69 FakePollThread::stop () 70 { 71 if (_buf_pool.ptr ()) 72 _buf_pool->stop (); 73 74 return PollThread::stop ();; 75 } 76 77 XCamReturn 78 FakePollThread::read_buf (SmartPtr<VideoBuffer> &buf) 79 { 80 uint8_t *dst = buf->map (); 81 const VideoBufferInfo info = buf->get_video_info (); 82 VideoBufferPlanarInfo planar; 83 XCamReturn ret = XCAM_RETURN_NO_ERROR; 84 85 for (uint32_t index = 0; index < info.components; index++) { 86 info.get_planar_info(planar, index); 87 uint32_t line_bytes = planar.width * planar.pixel_bytes; 88 89 for (uint32_t i = 0; i < planar.height; i++) { 90 if (fread (dst + info.offsets [index] + i * info.strides [index], 1, line_bytes, _raw) < line_bytes) { 91 if (feof (_raw)) { 92 fseek (_raw, 0, SEEK_SET); 93 ret = XCAM_RETURN_BYPASS; 94 } else { 95 XCAM_LOG_ERROR ("poll_buffer_loop failed to read file"); 96 ret = XCAM_RETURN_ERROR_FILE; 97 } 98 goto done; 99 } 100 } 101 } 102 103 done: 104 buf->unmap (); 105 return ret; 106 } 107 108 XCamReturn 109 FakePollThread::poll_buffer_loop () 110 { 111 XCamReturn ret = XCAM_RETURN_NO_ERROR; 112 113 if (!_buf_pool.ptr () && init_buffer_pool () != XCAM_RETURN_NO_ERROR) 114 return XCAM_RETURN_ERROR_MEM; 115 116 SmartPtr<VideoBuffer> buf = _buf_pool->get_buffer (_buf_pool); 117 if (!buf.ptr ()) { 118 XCAM_LOG_WARNING ("FakePollThread get buffer failed"); 119 return XCAM_RETURN_ERROR_MEM; 120 } 121 122 ret = read_buf (buf); 123 if (ret == XCAM_RETURN_BYPASS) { 124 ret = read_buf (buf); 125 } 126 127 SmartPtr<VideoBuffer> video_buf = buf; 128 if (ret == XCAM_RETURN_NO_ERROR && _poll_callback) 129 return _poll_callback->poll_buffer_ready (video_buf); 130 131 return ret; 132 } 133 134 XCamReturn 135 FakePollThread::init_buffer_pool () 136 { 137 struct v4l2_format format; 138 if (!_capture_dev.ptr () || 139 _capture_dev->get_format (format) != XCAM_RETURN_NO_ERROR) { 140 XCAM_LOG_ERROR ("Can't init buffer pool without format"); 141 return XCAM_RETURN_ERROR_PARAM; 142 } 143 VideoBufferInfo info; 144 info.init(format.fmt.pix.pixelformat, 145 format.fmt.pix.width, 146 format.fmt.pix.height, 0, 0, 0); 147 #if HAVE_LIBDRM 148 SmartPtr<DrmDisplay> drm_disp = DrmDisplay::instance (); 149 _buf_pool = new DrmBoBufferPool (drm_disp); 150 XCAM_ASSERT (_buf_pool.ptr ()); 151 152 if (_buf_pool->set_video_info (info) && _buf_pool->reserve (DEFAULT_FPT_BUF_COUNT)) 153 return XCAM_RETURN_NO_ERROR; 154 #endif 155 156 return XCAM_RETURN_ERROR_MEM; 157 } 158 159 }; 160