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