1a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin/* 2a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * Copyright (C) 2008 The Android Open Source Project 3a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * 4a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 5a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * you may not use this file except in compliance with the License. 6a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * You may obtain a copy of the License at 7a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * 8a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * http://www.apache.org/licenses/LICENSE-2.0 9a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * 10a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * Unless required by applicable law or agreed to in writing, software 11a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * distributed under the License is distributed on an "AS IS" BASIS, 12a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * See the License for the specific language governing permissions and 14a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * limitations under the License. 15a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin */ 16a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 17b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura//#define LOG_NDEBUG 0 18a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#define LOG_TAG "TIOverlay" 19a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 20a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <hardware/hardware.h> 21a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <hardware/overlay.h> 22a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 23a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinextern "C" { 24a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include "v4l2_utils.h" 25a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 26a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 272916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin#include <pthread.h> 28a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <fcntl.h> 29a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <errno.h> 30a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <sys/types.h> 31a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <sys/stat.h> 32a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <sys/mman.h> 33a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <unistd.h> 34ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong#include <linux/videodev.h> 35a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 36a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <cutils/log.h> 37a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <cutils/ashmem.h> 38a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#include <cutils/atomic.h> 39a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 40a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin/*****************************************************************************/ 41a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 422916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin#define LOG_FUNCTION_NAME LOGV(" %s %s", __FILE__, __FUNCTION__) 43a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 44801678aa351dacc7208a805d860099c16144ff7bDan Vacura#define NUM_OVERLAY_BUFFERS_REQUESTED (8) 45a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin#define SHARED_DATA_MARKER (0x68759746) // OVRLYSHM on phone keypad 46a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 47c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin/* These values should come from Surface Flinger */ 48c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin#define LCD_WIDTH 480 49c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin#define LCD_HEIGHT 854 50c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 51c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin#define CACHEABLE_BUFFERS 0x1 52c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 53b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura#define ALL_BUFFERS_FLUSHED -66 //shared with Camera/Video Playback HAL 54b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 55a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavintypedef struct 56a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 57a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t posX; 58a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t posY; 59a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t posW; 60a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t posH; 61a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t rotation; 62a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} overlay_ctrl_t; 63a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 64a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavintypedef struct 65a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 66a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t cropX; 67a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t cropY; 68a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t cropW; 69a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t cropH; 70a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} overlay_data_t; 71a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 72a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavintypedef struct 73a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 74a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t marker; 75a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t size; 76a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 775b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins volatile int32_t refCnt; 785b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins 79a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t controlReady; // Only updated by the control side 80a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t dataReady; // Only updated by the data side 81a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 822916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_t lock; 83bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong pthread_mutexattr_t attr; 84a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 85a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t streamEn; 86b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura uint32_t streamingReset; 87a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 88a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t dispW; 89a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin uint32_t dispH; 90a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 91a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} overlay_shared_t; 92a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 93a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// Only one instance is created per platform 94a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstruct overlay_control_context_t { 95a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_control_device_t device; 96a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* our private state goes below here */ 97a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_t* overlay_video1; 98a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_t* overlay_video2; 99a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 100a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 101a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// A separate instance is created per overlay data side user 102a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstruct overlay_data_context_t { 103a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_device_t device; 104a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* our private state goes below here */ 105a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int ctl_fd; 106a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_fd; 107a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_size; 108a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int width; 109a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int height; 110c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin int format; 111a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int num_buffers; 112a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin size_t *buffers_len; 113a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin void **buffers; 114a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 115a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_data_t data; 116ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong overlay_shared_t *shared; 117ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong mapping_data_t *mapping_data; 118a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Need to count Qd buffers to be sure we don't block DQ'ing when exiting 119a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int qd_buf_count; 120c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin int cacheable_buffers; 121a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 122a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1232916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int create_shared_data(overlay_shared_t **shared); 1248f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacurastatic void destroy_shared_data(int shared_fd, overlay_shared_t *shared, bool closefd); 1252916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int open_shared_data(overlay_data_context_t *ctx); 1262916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic void close_shared_data(overlay_data_context_t *ctx); 127a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinenum { LOCK_REQUIRED = 1, NO_LOCK_NEEDED = 0 }; 128a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int enable_streaming( overlay_shared_t *shared, int ovly_fd, int lock_required ); 129a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 130a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int overlay_device_open(const struct hw_module_t* module, 131a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin const char* name, struct hw_device_t** device); 132a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 133a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic struct hw_module_methods_t overlay_module_methods = { 134a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin open: overlay_device_open 135a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 136a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 137a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstruct overlay_module_t HAL_MODULE_INFO_SYM = { 138a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin common: { 139a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin tag: HARDWARE_MODULE_TAG, 140a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin version_major: 1, 141a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin version_minor: 0, 142a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin id: OVERLAY_HARDWARE_MODULE_ID, 143a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin name: "Sample Overlay module", 144a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin author: "The Android Open Source Project", 145a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin methods: &overlay_module_methods, 146a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 147a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 148a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 149a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin/*****************************************************************************/ 150a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 151a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin/* 152a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * This is the overlay_t object, it is returned to the user and represents 153a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * an overlay. here we use a subclass, where we can store our own state. 154a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * This handles will be passed across processes and possibly given to other 155a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * HAL modules (for instance video decode modules). 156a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin */ 157a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstruct handle_t : public native_handle { 158a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* add the data fields we need here, for instance: */ 159a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int ctl_fd; 160a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_fd; 161a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int width; 162a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int height; 163c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin int format; 164a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int num_buffers; 165a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_size; 166a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 167a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 168c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavinstatic int handle_format(const overlay_handle_t overlay) { 169c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->format; 170c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin} 171c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 172a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_ctl_fd(const overlay_handle_t overlay) { 173a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->ctl_fd; 174a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 175a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 176a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_shared_fd(const overlay_handle_t overlay) { 177a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->shared_fd; 178a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 179a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 180a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_num_buffers(const overlay_handle_t overlay) { 181a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->num_buffers; 182a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 183a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 184a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_width(const overlay_handle_t overlay) { 185a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->width; 186a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 187a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 188a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_height(const overlay_handle_t overlay) { 189a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->height; 190a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 191a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 192a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int handle_shared_size(const overlay_handle_t overlay) { 193a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return static_cast<const struct handle_t *>(overlay)->shared_size; 194a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 195a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 196a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// A separate instance of this class is created per overlay 197a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinclass overlay_object : public overlay_t 198a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 199a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin handle_t mHandle; 200a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 201a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t mCtl; 202a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t mCtlStage; 203a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t *mShared; 204a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 205a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin static overlay_handle_t getHandleRef(struct overlay_t* overlay) { 206a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* returns a reference to the handle, caller doesn't take ownership */ 207a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return &(static_cast<overlay_object *>(overlay)->mHandle); 208a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 209a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 210a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinpublic: 2112916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_object(int ctl_fd, int shared_fd, int shared_size, int w, int h, 2122916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int format, int num_buffers) { 213a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin this->overlay_t::getHandleRef = getHandleRef; 214a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.version = sizeof(native_handle); 215a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.numFds = 2; 216c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin mHandle.numInts = 5; // extra ints we have in our handle 217a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.ctl_fd = ctl_fd; 218a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.shared_fd = shared_fd; 219a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.width = w; 220a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.height = h; 221c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin mHandle.format = format; 222a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.num_buffers = num_buffers; 223a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin mHandle.shared_size = shared_size; 224a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin this->w = w; 225a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin this->h = h; 226a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin this->format = format; 2272916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 228a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin memset( &mCtl, 0, sizeof( mCtl ) ); 229a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin memset( &mCtlStage, 0, sizeof( mCtlStage ) ); 230a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 231a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 232a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int ctl_fd() { return mHandle.ctl_fd; } 233a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_fd() { return mHandle.shared_fd; } 234a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t* data() { return &mCtl; } 235a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t* staging() { return &mCtlStage; } 236a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t* getShared() { return mShared; } 237a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin void setShared( overlay_shared_t *p ) { mShared = p; } 238a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin}; 239a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 240a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 241a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// Local Functions 242a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 243a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 2442916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int create_shared_data(overlay_shared_t **shared) 245a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 246a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd; 2472916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // assuming sizeof(overlay_shared_t) < a single page 2482916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int size = getpagesize(); 2492916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_shared_t *p; 2502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 2512916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if ((fd = ashmem_create_region("overlay_data", size)) < 0) { 252a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed to Create Overlay Shared Data!\n"); 2532916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return fd; 254a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 2552916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 2562916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin p = (overlay_shared_t*)mmap(NULL, size, PROT_READ | PROT_WRITE, 2572916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin MAP_SHARED, fd, 0); 2582916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (p == MAP_FAILED) { 259a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed to Map Overlay Shared Data!\n"); 2602916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin close(fd); 2612916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return -1; 262a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 263a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 2642916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin memset(p, 0, size); 2652916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin p->marker = SHARED_DATA_MARKER; 2662916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin p->size = size; 2675b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins p->refCnt = 1; 268bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong int ret = 0; 269bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong if ((ret = pthread_mutexattr_init(&p->attr)) != 0) { 270bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong LOGE("Failed to initialize overlay mutex attr"); 271bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong } 272bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong if (ret == 0 && (ret = pthread_mutexattr_setpshared(&p->attr, PTHREAD_PROCESS_SHARED)) != 0) { 273bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong LOGE("Failed to set the overlay mutex attr to be shared across-processes"); 274bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong } 275bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong if (ret == 0 && (ret = pthread_mutex_init(&p->lock, &p->attr)) != 0) { 276bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong LOGE("Failed to initialize overlay mutex\n"); 277bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong } 278bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong if (ret != 0) { 2792916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin munmap(p, size); 2802916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin close(fd); 2812916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return -1; 282a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 2832916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin *shared = p; 2842916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return fd; 2852916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 286a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 2878f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacurastatic void destroy_shared_data( int shared_fd, overlay_shared_t *shared, bool closefd ) 288a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 2892916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (shared == NULL) 2902916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return; 2912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 2925b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins // Last side deallocated releases the mutex, otherwise the remaining 2935b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins // side will deadlock trying to use an already released mutex 2945b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins if (android_atomic_dec(&shared->refCnt) == 1) { 2955b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins if (pthread_mutex_destroy(&shared->lock)) { 296bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong LOGE("Failed to uninitialize overlay mutex!\n"); 2975b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins } 298a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 299bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong if (pthread_mutexattr_destroy(&shared->attr)) { 300bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong LOGE("Failed to uninitialize the overlay mutex attr!\n"); 301bf099c10aa876bb8bac4ffa8884b06e4d8e5e72dJames Dong } 3025b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins shared->marker = 0; 3035b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins } 3042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 3052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (munmap(shared, shared->size)) { 3062916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Failed to Unmap Overlay Shared Data!\n"); 307a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 308a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3098f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacura if (closefd && close(shared_fd)) { 3102916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Failed to Close Overlay Shared Data!\n"); 3112916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } 3122916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 313a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 314a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int open_shared_data( overlay_data_context_t *ctx ) 315a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 316a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc = -1; 317a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int mode = PROT_READ | PROT_WRITE; 318a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd = ctx->shared_fd; 319a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int size = ctx->shared_size; 320a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3212916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->shared != NULL) { 322a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Already open, return success 323a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Overlay Shared Data Already Open\n"); 3242916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return 0; 325a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 3262916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->shared = (overlay_shared_t*)mmap(0, size, mode, MAP_SHARED, fd, 0); 3272916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 3282916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->shared == MAP_FAILED) { 329a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed to Map Overlay Shared Data!\n"); 3302916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else if ( ctx->shared->marker != SHARED_DATA_MARKER ) { 331a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Invalid Overlay Shared Marker!\n"); 3322916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin munmap( ctx->shared, size); 3332916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else if ( (int)ctx->shared->size != size ) { 334a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Invalid Overlay Shared Size!\n"); 3352916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin munmap(ctx->shared, size); 3362916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else { 3375b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins android_atomic_inc(&ctx->shared->refCnt); 338a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin rc = 0; 339a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 340a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3412916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 3422916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 343a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3442916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic void close_shared_data(overlay_data_context_t *ctx) 345a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 3468f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacura destroy_shared_data(ctx->shared_fd, ctx->shared, false); 3475b326ff52eea6007cc9be59daa17b2733504fce4Andrew Collins ctx->shared = NULL; 348a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 349a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int enable_streaming_locked(overlay_shared_t *shared, int ovly_fd) 351a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 3522916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int rc = 0; 3532916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 3542916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (!shared->controlReady || !shared->dataReady) { 3552916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGI("Postponing Stream Enable/%d/%d\n", shared->controlReady, 3562916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin shared->dataReady); 3572916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else { 358a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin shared->streamEn = 1; 3592916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin rc = v4l2_overlay_stream_on(ovly_fd); 3602916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc) { 361a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Stream Enable Failed!/%d\n", rc); 362a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin shared->streamEn = 0; 363a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 364a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 365a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3662916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 367a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 368a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 3692916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int enable_streaming(overlay_shared_t *shared, int ovly_fd) 3702916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin{ 3712916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int ret; 3722916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 3732916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_lock(&shared->lock); 3742916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ret = enable_streaming_locked(shared, ovly_fd); 3752916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_unlock(&shared->lock); 3762916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return ret; 3772916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 3782916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 379b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacurastatic int disable_streaming_locked(overlay_shared_t *shared, int ovly_fd) 380b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura{ 381b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura int ret = 0; 382b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 383b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura if (shared->streamEn) { 384b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura ret = v4l2_overlay_stream_off( ovly_fd ); 385081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura if (ret) { 386b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura LOGE("Stream Off Failed!/%d\n", ret); 387081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura } else { 388081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura shared->streamingReset = 1; 389081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura shared->streamEn = 0; 390b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura } 391b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura } 392b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 393b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura return ret; 394b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura} 3952916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 396a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 397a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// Control module 398a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 399a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 400a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int overlay_get(struct overlay_control_device_t *dev, int name) 401a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 402a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int result = -1; 403a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 4042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin switch (name) { 4052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_MINIFICATION_LIMIT: result = 0; break; // 0 = no limit 4062916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_MAGNIFICATION_LIMIT: result = 0; break; // 0 = no limit 4072916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_SCALING_FRAC_BITS: result = 0; break; // 0 = infinite 4082916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_ROTATION_STEP_DEG: result = 90; break; // 90 rotation steps (for instance) 4092916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_HORIZONTAL_ALIGNMENT: result = 1; break; // 1-pixel alignment 4102916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_VERTICAL_ALIGNMENT: result = 1; break; // 1-pixel alignment 4112916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_WIDTH_ALIGNMENT: result = 1; break; // 1-pixel alignment 4122916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin case OVERLAY_HEIGHT_ALIGNMENT: break; 413a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4142916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 415a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return result; 416a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 417a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 4182916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic overlay_t* overlay_createOverlay(struct overlay_control_device_t *dev, 4192916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin uint32_t w, uint32_t h, int32_t format) 420a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 421472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGD("overlay_createOverlay:IN w=%d h=%d format=%d\n", w, h, format); 4222916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 4232916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4242916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_object *overlay; 425a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_control_context_t *ctx = (overlay_control_context_t *)dev; 426a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t *shared; 427a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 428a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int ret; 429c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin uint32_t num = NUM_OVERLAY_BUFFERS_REQUESTED; 430a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd; 431a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int shared_fd; 432a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 43308bd1e9191dea292b14fd4a1d9426988c6ec08eeSnigdha Sinha if (format == OVERLAY_FORMAT_DEFAULT) 43408bd1e9191dea292b14fd4a1d9426988c6ec08eeSnigdha Sinha { 435472781c4161e5924b4e848dec1a458d314a221d3James Dong format = OVERLAY_FORMAT_YCbYCr_422_I; 43608bd1e9191dea292b14fd4a1d9426988c6ec08eeSnigdha Sinha } 43708bd1e9191dea292b14fd4a1d9426988c6ec08eeSnigdha Sinha 4382916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->overlay_video1) { 439472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGE("Error - overlays already in use\n"); 4402916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return NULL; 441a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4422916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4432916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin shared_fd = create_shared_data(&shared); 4442916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (shared_fd < 0) { 445472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGE("Failed to create shared data"); 4462916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return NULL; 447a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4482916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4492916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin fd = v4l2_overlay_open(V4L2_OVERLAY_PLANE_VIDEO1); 4502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (fd < 0) { 451a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed to open overlay device\n"); 4522916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error; 453a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4542916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4552916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (v4l2_overlay_init(fd, w, h, format)) { 456a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed initializing overlays\n"); 4572916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error1; 458a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4592916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4602916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (v4l2_overlay_set_crop(fd, 0, 0, w, h)) { 461a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed defaulting crop window\n"); 4622916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error1; 463a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4642916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4652916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (v4l2_overlay_set_rotation(fd, 0, 0)) { 466a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed defaulting rotation\n"); 4672916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error1; 468a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4692916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 470c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (v4l2_overlay_req_buf(fd, &num, 0)) { 471a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed requesting buffers\n"); 4722916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error1; 473a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 4742916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4752916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay = new overlay_object(fd, shared_fd, shared->size, w, h, format, num); 4762916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (overlay == NULL) { 477a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed to create overlay object\n"); 4782916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto error1; 4792916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } 4802916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->overlay_video1 = overlay; 481a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 4822916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay->setShared(shared); 4832916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 4842916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin shared->controlReady = 0; 4852916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin shared->streamEn = 0; 486b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura shared->streamingReset = 0; 487c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin shared->dispW = LCD_WIDTH; // Need to determine this properly 488c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin shared->dispH = LCD_HEIGHT; // Need to determine this properly 4892916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 490472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGI("Opened video1/fd=%d/obj=%08lx/shm=%d/size=%d", fd, 4912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin (unsigned long)overlay, shared_fd, shared->size); 4922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 493472781c4161e5924b4e848dec1a458d314a221d3James Dong 494472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGD("overlay_createOverlay: OUT"); 4952916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return overlay; 496a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 4972916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinerror1: 4982916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin close(fd); 4992916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinerror: 5008f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacura destroy_shared_data(shared_fd, shared, true); 5012916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return NULL; 5022916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 503a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic void overlay_destroyOverlay(struct overlay_control_device_t *dev, 5052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay) 506a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 507472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGD("overlay_destroyOverlay:IN dev (%p) and overlay (%p)", dev, overlay); 5082916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 5092916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 510a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_control_context_t *ctx = (overlay_control_context_t *)dev; 511a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_object *obj = static_cast<overlay_object *>(overlay); 5122916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 513a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc; 514a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd = obj->ctl_fd(); 515a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t *shared = obj->getShared(); 5162916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 5172916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (shared == NULL) { 518472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGE("Overlay was already destroyed - nothing needs to be done\n"); 5192916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return; 520a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 5212916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 5222916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_lock(&shared->lock); 5232916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 524081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura disable_streaming_locked(shared, fd); 525a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5262916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_unlock(&shared->lock); 527a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5288f65e499f5217aba6aa7b80e3eba264dcbe5f3a2Dan Vacura destroy_shared_data(obj->shared_fd(), shared, true); 5292916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin obj->setShared(NULL); 530a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5312916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGI("Destroying overlay/fd=%d/obj=%08lx", fd, (unsigned long)overlay); 532a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5332916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (close(fd)) { 5342916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE( "Error closing overly fd/%d\n", errno); 5352916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } 5362916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 5372916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (overlay) { 5382916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->overlay_video1 == overlay) 5392916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->overlay_video1 = NULL; 5402916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin delete overlay; 541472781c4161e5924b4e848dec1a458d314a221d3James Dong overlay = NULL; 542a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 543472781c4161e5924b4e848dec1a458d314a221d3James Dong LOGD("overlay_destroyOverlay:OUT"); 544a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 545a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5462916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_setPosition(struct overlay_control_device_t *dev, 5472916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay, int x, int y, uint32_t w, 5482916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin uint32_t h) 549a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 5502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 551a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 552a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_object *obj = static_cast<overlay_object *>(overlay); 553a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 554a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t *stage = obj->staging(); 555a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t *shared = obj->getShared(); 556a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 557a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc = 0; 558a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5592916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // FIXME: This is a hack to deal with seemingly unintentional negative 5602916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // offset that pop up now and again. I believe the negative offsets are 5612916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // due to a surface flinger bug that has not yet been found or fixed. 5622916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // 5632916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // This logic here is to return an error if the rectangle is not fully 5642916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // within the display, unless we have not received a valid position yet, 5652916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // in which case we will do our best to adjust the rectangle to be within 5662916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin // the display. 5672916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 568a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Require a minimum size 5692916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (w < 16 || h < 16) { 570a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Return an error 5712916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin rc = -1; 5722916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else if (!shared->controlReady) { 573a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( x < 0 ) x = 0; 574a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( y < 0 ) y = 0; 575a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( w > shared->dispW ) w = shared->dispW; 576a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( h > shared->dispH ) h = shared->dispH; 577a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( (x + w) > shared->dispW ) w = shared->dispW - x; 578a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if ( (y + h) > shared->dispH ) h = shared->dispH - y; 5792916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else if (x < 0 || y < 0 || (x + w) > shared->dispW || 5802916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin (y + h) > shared->dispH) { 581a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Return an error 582a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin rc = -1; 583a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 5842916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 5852916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc == 0) { 586a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->posX = x; 587a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->posY = y; 588a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->posW = w; 589a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->posH = h; 590a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 5912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 5922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 593a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 594a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 5952916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_getPosition(struct overlay_control_device_t *dev, 5962916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay, int* x, int* y, uint32_t* w, 5972916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin uint32_t* h) 598a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 5992916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 600a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 601a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd = static_cast<overlay_object *>(overlay)->ctl_fd(); 602a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6032916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (v4l2_overlay_get_position(fd, x, y, (int32_t*)w, (int32_t*)h)) { 6042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return -EINVAL; 605a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 6062916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return 0; 607a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 608a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6092916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_setParameter(struct overlay_control_device_t *dev, 6102916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay, int param, int value) 611a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 6122916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 613a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 614a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t *stage = static_cast<overlay_object *>(overlay)->staging(); 615a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc = 0; 6162916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 6172916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin switch (param) { 618a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case OVERLAY_DITHER: 619a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 620a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 621a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case OVERLAY_TRANSFORM: 622a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin switch ( value ) 623a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin { 624a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case 0: 625a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->rotation = 0; 626a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 627a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case OVERLAY_TRANSFORM_ROT_90: 628a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->rotation = 90; 629a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 630a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case OVERLAY_TRANSFORM_ROT_180: 631a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->rotation = 180; 632a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 633a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin case OVERLAY_TRANSFORM_ROT_270: 634a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin stage->rotation = 270; 635a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 636a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin default: 637a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin rc = -EINVAL; 638a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 639a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 640a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin break; 641a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 642a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6432916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 644a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 645a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6462916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_stage(struct overlay_control_device_t *dev, 6472916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay) { 6482916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return 0; 6492916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 650a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6512916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_commit(struct overlay_control_device_t *dev, 6522916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_t* overlay) { 6532916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 654a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 655a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_object *obj = static_cast<overlay_object *>(overlay); 656a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 657a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t *data = obj->data(); 658a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_ctrl_t *stage = obj->staging(); 659a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_shared_t *shared = obj->getShared(); 660a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 661a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int ret = 0; 662a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int fd = obj->ctl_fd(); 663a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6642916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (shared == NULL) { 665a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Shared Data Not Init'd!\n"); 666a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return -1; 667a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 6682916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 6692916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_lock(&shared->lock); 6702916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 6712916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (!shared->controlReady) { 672a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin shared->controlReady = 1; 673a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 6742916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 6752916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (data->posX == stage->posX && data->posY == stage->posY && 6762916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posW == stage->posW && data->posH == stage->posH && 677cea71ebbc915d8bf0a27cf1757b2b7733158a6dcRebecca Schultz Zavin data->rotation == stage->rotation) { 678a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Nothing to do!\n"); 6792916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto end; 680a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 681a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 6822916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGI("Position/X%d/Y%d/W%d/H%d\n", data->posX, data->posY, data->posW, 6832916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posH); 6842916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGI("Adjusted Position/X%d/Y%d/W%d/H%d\n", stage->posX, stage->posY, 6852916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin stage->posW, data->posH); 6862916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGI("Rotation/%d\n", stage->rotation ); 6872916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 688081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura if ((ret = disable_streaming_locked(shared, fd))) 689b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura goto end; 6902916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 6912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (stage->rotation != data->rotation) { 6922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ret = v4l2_overlay_set_rotation(fd, stage->rotation, 0); 6932916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ret) { 6942916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Set Rotation Failed!/%d\n", ret); 6952916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto end; 696a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 6972916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->rotation = stage->rotation; 6982916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } 699a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7002916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (!(stage->posX == data->posX && stage->posY == data->posY && 7012916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin stage->posW == data->posW && stage->posH == data->posH)) { 7022916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ret = v4l2_overlay_set_position(fd, stage->posX, stage->posY, 7032916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin stage->posW, stage->posH); 7042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ret) { 7052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Set Position Failed!/%d\n", ret); 7062916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto end; 707a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 7082916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posX = stage->posX; 7092916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posY = stage->posY; 7102916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posW = stage->posW; 7112916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin data->posH = stage->posH; 712a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 713a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7142916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ret = enable_streaming_locked(shared, fd); 715a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7162916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinend: 7172916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_unlock(&shared->lock); 718a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7192916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return ret; 7202916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 721a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 722a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int overlay_control_close(struct hw_device_t *dev) 723a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 7242916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 7252916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 726a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_control_context_t* ctx = (struct overlay_control_context_t*)dev; 727a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_object *overlay_v1; 728a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin //overlay_object *overlay_v2; 729a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7302916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx) { 731a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_v1 = static_cast<overlay_object *>(ctx->overlay_video1); 732a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin //overlay_v2 = static_cast<overlay_object *>(ctx->overlay_video2); 733a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 734a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_destroyOverlay((struct overlay_control_device_t *)ctx, 735a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_v1); 736a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin //overlay_destroyOverlay((struct overlay_control_device_t *)ctx, overlay_v2); 737a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 738a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin free(ctx); 739a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 7402916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return 0; 741a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 742a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 743a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 744a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// Data module 745a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin// **************************************************************************** 746a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7472916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinint overlay_initialize(struct overlay_data_device_t *dev, 7482916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_handle_t handle) 749a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 7502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 751a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 752a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 753a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct stat stat; 7542916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 755a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int i; 756a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc = -1; 757a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 758a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->num_buffers = handle_num_buffers(handle); 759a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->width = handle_width(handle); 760a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->height = handle_height(handle); 761c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin ctx->format = handle_format(handle); 762a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->ctl_fd = handle_ctl_fd(handle); 763a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->shared_fd = handle_shared_fd(handle); 764a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->shared_size = handle_shared_size(handle); 765a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->shared = NULL; 766a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->qd_buf_count = 0; 767c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin ctx->cacheable_buffers = 0; 7682916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 7692916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (fstat(ctx->ctl_fd, &stat)) { 770a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Error = %s from %s\n", strerror(errno), "overlay initialize"); 7712916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return -1; 772a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 7732916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 7742916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (open_shared_data(ctx)) { 7752916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return -1; 776a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 777a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 7782916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->shared->dataReady = 0; 7792916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 780ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data = new mapping_data_t; 7812916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->buffers = new void* [ctx->num_buffers]; 7822916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->buffers_len = new size_t[ctx->num_buffers]; 783ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong if (!ctx->buffers || !ctx->buffers_len || !ctx->mapping_data) { 784a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Failed alloc'ing buffer arrays\n"); 7852916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin close_shared_data(ctx); 7862916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else { 7872916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin for (i = 0; i < ctx->num_buffers; i++) { 7882916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin rc = v4l2_overlay_map_buf(ctx->ctl_fd, i, &ctx->buffers[i], 7892916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin &ctx->buffers_len[i]); 7902916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc) { 7912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Failed mapping buffers\n"); 7922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin close_shared_data( ctx ); 7932916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin break; 794a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 795a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 796a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 7972916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 798a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return ( rc ); 799a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 800a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 801c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavinstatic int overlay_resizeInput(struct overlay_data_device_t *dev, uint32_t w, 802c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin uint32_t h) 803c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin{ 804081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura int rc = -1; 805c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 806c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 807c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 808c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if ((ctx->width == (int)w) && (ctx->width == (int)h)) { 809c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGV("same as current width and height. so do nothing"); 810c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return 0; 811c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 812c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 813c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (!ctx->shared) { 814c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGI("Shared Data Not Init'd!\n"); 815c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return -1; 816c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 817c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 818c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (ctx->shared->dataReady) { 819c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGV("Either setCrop() or queueBuffer() was called prior to this!" 820c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin "Therefore failing this call.\n"); 821c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return -1; 822c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 823c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 824c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin pthread_mutex_lock(&ctx->shared->lock); 825c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 826081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura if ((rc = disable_streaming_locked(ctx->shared, ctx->ctl_fd))) 827b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura goto end; 828c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 829c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin for (int i = 0; i < ctx->num_buffers; i++) { 830c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin v4l2_overlay_unmap_buf(ctx->buffers[i], ctx->buffers_len[i]); 831c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 832c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 833c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin rc = v4l2_overlay_init(ctx->ctl_fd, w, h, ctx->format); 834c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (rc) { 835c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGE("Error initializing overlay"); 836c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin goto end; 837c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 838c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin rc = v4l2_overlay_set_crop(ctx->ctl_fd, 0, 0, w, h); 839c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (rc) { 840c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGE("Error setting crop window\n"); 841c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin goto end; 842c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 843c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin rc = v4l2_overlay_req_buf(ctx->ctl_fd, (uint32_t *)(&ctx->num_buffers), 844c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin ctx->cacheable_buffers); 845c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (rc) { 846c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGE("Error creating buffers"); 847c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin goto end; 848c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 849ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong 850c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin for (int i = 0; i < ctx->num_buffers; i++) 851c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin v4l2_overlay_map_buf(ctx->ctl_fd, i, &ctx->buffers[i], 852c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin &ctx->buffers_len[i]); 853c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 854c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin rc = enable_streaming_locked(ctx->shared, ctx->ctl_fd); 855c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 856c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavinend: 857c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin pthread_mutex_unlock(&ctx->shared->lock); 858c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 859c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return rc; 860c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin} 861c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 862c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 863c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavinstatic int overlay_data_setParameter(struct overlay_data_device_t *dev, 864c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin int param, int value) 865c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin{ 866c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin int ret = 0; 867c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 868c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 869c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (ctx->shared == NULL) 870c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin { 871c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGI("Shared Data Not Init'd!\n"); 872c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return -1; 873c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 874c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 875c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (ctx->shared->dataReady) { 876c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGI("Too late. Cant set it now!\n"); 877c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return -1; 878c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin } 879c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 880c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin if (param == CACHEABLE_BUFFERS) 881c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin ctx->cacheable_buffers = value; 882c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 883c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin //ret = v4l2_overlay_set_attributes(ctx->ctl_fd, param, value); 884c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin return ( ret ); 885c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin} 886c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 887c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin 8882916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_setCrop(struct overlay_data_device_t *dev, uint32_t x, 8892916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin uint32_t y, uint32_t w, uint32_t h) { 8902916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 891a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 8922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int rc = 0; 893a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 894a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 8952916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->shared == NULL) { 896a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Shared Data Not Init'd!\n"); 897a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return -1; 898a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 8992916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 9002916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_lock(&ctx->shared->lock); 9012916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 9022916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->shared->dataReady = 1; 9032916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 9042916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx->data.cropX == x && ctx->data.cropY == y && ctx->data.cropW == w 9052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin && ctx->data.cropH == h) { 906a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Nothing to do!\n"); 9072916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin goto end; 908a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 9092916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 910a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->data.cropX = x; 911a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->data.cropY = y; 912a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->data.cropW = w; 913a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->data.cropH = h; 914a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 915a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGI("Crop Win/X%d/Y%d/W%d/H%d\n", x, y, w, h ); 916a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 917081752356b5cf67b5c64d9234f111dfd680c208cDan Vacura if ((rc = disable_streaming_locked(ctx->shared, ctx->ctl_fd))) 918b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura goto end; 919b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 9202916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin rc = v4l2_overlay_set_crop(ctx->ctl_fd, x, y, w, h); 9212916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc) { 9222916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOGE("Set Crop Window Failed!/%d\n", rc); 923a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 924a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9252916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin rc = enable_streaming_locked(ctx->shared, ctx->ctl_fd); 926a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9272916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinend: 9282916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_unlock(&ctx->shared->lock); 9292916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 930a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 931a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9322916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_getCrop(struct overlay_data_device_t *dev , uint32_t* x, 9332916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin uint32_t* y, uint32_t* w, uint32_t* h) { 934a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 935a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9362916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return v4l2_overlay_get_crop(ctx->ctl_fd, x, y, w, h); 9372916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 938a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9392916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinint overlay_dequeueBuffer(struct overlay_data_device_t *dev, 9402916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_buffer_t *buffer) { 941a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* blocks until a buffer is available and return an opaque structure 942a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * representing this buffer. 943a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin */ 9442916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 945a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 946a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 947a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc; 948a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int i = -1; 949a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 950b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_lock(&ctx->shared->lock); 951b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura if ( ctx->shared->streamingReset ) 952b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura { 953b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura ctx->shared->streamingReset = 0; 954b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_unlock(&ctx->shared->lock); 955b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura return ALL_BUFFERS_FLUSHED; 956b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura } 957b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_unlock(&ctx->shared->lock); 958b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 959229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura // If we are not streaming dequeue will fail, skip to prevent error printouts 960229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura if (ctx->shared->streamEn) { 961229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura if ((rc = v4l2_overlay_dq_buf( ctx->ctl_fd, &i )) != 0) { 962229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura LOGE("Failed to DQ/%d\n", rc); 963229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura } 964229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura else if (i < 0 || i > ctx->num_buffers) { 965229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura rc = -EINVAL; 966229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura } else { 967229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura *((int *)buffer) = i; 968229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura ctx->qd_buf_count --; 969229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura } 9702916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin } else { 971229fc4a4f41743bb367ecb791e9eeee6932671cdDan Vacura rc = -1; 972a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 973a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9742916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 975a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 976a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 9772916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinint overlay_queueBuffer(struct overlay_data_device_t *dev, 9782916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin overlay_buffer_t buffer) { 979a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 980a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 981a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 982b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_lock(&ctx->shared->lock); 983b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura if ( ctx->shared->streamingReset ) 984b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura { 985b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura ctx->shared->streamingReset = 0; 986b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_unlock(&ctx->shared->lock); 987b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura return ALL_BUFFERS_FLUSHED; 988b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura } 989b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura pthread_mutex_unlock(&ctx->shared->lock); 990b0936053d35bdb675340e63f2f6ee333e764f607Dan Vacura 991a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin // Catch the case where the data side had no need to set the crop window 9922916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (!ctx->shared->dataReady) { 993a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->shared->dataReady = 1; 9942916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin enable_streaming(ctx->shared, ctx->ctl_fd); 995a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 9962916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 9972916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin int rc = v4l2_overlay_q_buf( ctx->ctl_fd, (int)buffer ); 9982916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc == 0 && ctx->qd_buf_count < ctx->num_buffers) { 999a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->qd_buf_count ++; 1000a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 10012916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 10022916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return rc; 1003a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 1004a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10052916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinvoid *overlay_getBufferAddress(struct overlay_data_device_t *dev, 1006ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong overlay_buffer_t buffer) 1007ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong{ 10082916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 1009a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1010a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* this may fail (NULL) if this feature is not supported. In that case, 1011a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * presumably, there is some other HAL module that can fill the buffer, 1012a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin * using a DSP for instance 1013a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin */ 1014ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong int ret; 1015ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong struct v4l2_buffer buf; 1016a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 1017a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1018ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ret = v4l2_overlay_query_buffer(ctx->ctl_fd, (int)buffer, &buf); 1019ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong 1020ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong if (ret) 1021ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong return NULL; 1022ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong 1023ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong // Initialize ctx->mapping_data 1024ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong memset(ctx->mapping_data, 0, sizeof(mapping_data_t)); 1025ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong 1026ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data->fd = ctx->ctl_fd; 1027ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data->length = buf.length; 1028ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data->offset = buf.m.offset; 1029ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data->ptr = NULL; 1030a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10312916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if ((int)buffer >= 0 && (int)buffer < ctx->num_buffers) { 1032ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong ctx->mapping_data->ptr = ctx->buffers[(int)buffer]; 1033ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong LOGI("Buffer/%d/addr=%08lx/len=%d", (int)buffer, (unsigned long)ctx->mapping_data->ptr, 10342916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin ctx->buffers_len[(int)buffer]); 1035a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 1036a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1037ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong return (void *)ctx->mapping_data; 10382916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin} 1039a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1040a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinint overlay_getBufferCount(struct overlay_data_device_t *dev) 1041a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 10422916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 10432916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1044a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 10452916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 10462916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return (ctx->num_buffers); 1047a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 1048a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10492916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavinstatic int overlay_data_close(struct hw_device_t *dev) { 10502916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 10512916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 1052a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1053a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t* ctx = (struct overlay_data_context_t*)dev; 1054a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int rc; 10552916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 10562916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (ctx) { 1057a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin overlay_data_device_t *overlay_dev = &ctx->device; 1058a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int buf; 1059a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int i; 1060a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10612916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_lock(&ctx->shared->lock); 1062a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10632916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin for (i = 0; i < ctx->num_buffers; i++) { 1064c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin LOGV("Unmap Buffer/%d/%08lx/%d", i, (unsigned long)ctx->buffers[i], ctx->buffers_len[i] ); 1065a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin rc = v4l2_overlay_unmap_buf(ctx->buffers[i], ctx->buffers_len[i]); 10662916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin if (rc != 0) { 1067a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin LOGE("Error unmapping the buffer/%d/%d", i, rc); 1068a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 1069a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 10702916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1071ff2393e6840fa2da01480c0ecb5bb887f758fdebBenny Wong delete(ctx->mapping_data); 1072a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin delete(ctx->buffers); 1073a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin delete(ctx->buffers_len); 1074a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10752916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin pthread_mutex_unlock(&ctx->shared->lock); 1076a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1077a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin ctx->shared->dataReady = 0; 1078a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin close_shared_data( ctx ); 1079a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 10802916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin free(ctx); 1081a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 10822916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 10832916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin return 0; 1084a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 1085a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1086a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin/*****************************************************************************/ 1087a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1088a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavinstatic int overlay_device_open(const struct hw_module_t* module, 1089a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin const char* name, struct hw_device_t** device) 1090a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin{ 10912916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin LOG_FUNCTION_NAME; 1092a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin int status = -EINVAL; 10932916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1094a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin if (!strcmp(name, OVERLAY_HARDWARE_CONTROL)) { 1095a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_control_context_t *dev; 1096a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev = (overlay_control_context_t*)malloc(sizeof(*dev)); 1097a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1098a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* initialize our state here */ 1099a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 1100a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1101a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* initialize the procs */ 1102a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 1103a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.version = 0; 1104a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 1105a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.close = overlay_control_close; 11062916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1107a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.get = overlay_get; 1108a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.createOverlay = overlay_createOverlay; 1109a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.destroyOverlay = overlay_destroyOverlay; 1110a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.setPosition = overlay_setPosition; 1111a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.getPosition = overlay_getPosition; 1112a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.setParameter = overlay_setParameter; 1113a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.stage = overlay_stage; 1114a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.commit = overlay_commit; 1115a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1116a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin *device = &dev->device.common; 1117a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin status = 0; 1118a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } else if (!strcmp(name, OVERLAY_HARDWARE_DATA)) { 1119a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin struct overlay_data_context_t *dev; 1120a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev = (overlay_data_context_t*)malloc(sizeof(*dev)); 1121a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1122a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* initialize our state here */ 1123a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 1124a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin 1125a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin /* initialize the procs */ 1126a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 1127a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.version = 0; 1128a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 1129a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.common.close = overlay_data_close; 11302916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1131a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.initialize = overlay_initialize; 1132c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin dev->device.resizeInput = overlay_resizeInput; 1133a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.setCrop = overlay_setCrop; 11342916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin dev->device.getCrop = overlay_getCrop; 1135c349f36da560d0edb6aaacc4797f907e979b76c8Rebecca Schultz Zavin dev->device.setParameter = overlay_data_setParameter; 1136a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.dequeueBuffer = overlay_dequeueBuffer; 1137a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.queueBuffer = overlay_queueBuffer; 1138a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.getBufferAddress = overlay_getBufferAddress; 1139a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin dev->device.getBufferCount = overlay_getBufferCount; 11402916aa2eb80bb39b1ed83b009ebab13c9a89d458Rebecca Schultz Zavin 1141a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin *device = &dev->device.common; 1142a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin status = 0; 1143a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin } 1144a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin return status; 1145a63a015606a9558890c01a4f974d1718be92c8e5Rebecca Schultz Zavin} 1146