1 /**************************************************************************
5 Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
7 Contact: Eunchul Kim <chulspro.kim@samsung.com>,
8 JinYoung Jeon <jy0.jeon@samsung.com>,
9 Taeheon Kim <th908.kim@samsung.com>,
10 YoungJun Cho <yj44.cho@samsung.com>,
11 SooChan Lim <sc1.lim@samsung.com>,
12 Boram Park <sc1.lim@samsung.com>
14 Permission is hereby granted, free of charge, to any person obtaining a
15 copy of this software and associated documentation files (the
16 "Software"), to deal in the Software without restriction, including
17 without limitation the rights to use, copy, modify, merge, publish,
18 distribute, sub license, and/or sell copies of the Software, and to
19 permit persons to whom the Software is furnished to do so, subject to
20 the following conditions:
22 The above copyright notice and this permission notice (including the
23 next paragraph) shall be included in all copies or substantial portions
26 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
29 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
30 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 **************************************************************************/
41 #include "tdm_backend.h"
42 #include "tdm_private.h"
44 #define CAPTURE_FUNC_ENTRY() \
45 tdm_func_capture *func_capture; \
46 tdm_private_display *private_display; \
47 tdm_private_capture *private_capture; \
48 tdm_error ret = TDM_ERROR_NONE; \
49 TDM_RETURN_VAL_IF_FAIL(capture != NULL, TDM_ERROR_INVALID_PARAMETER); \
50 private_capture = (tdm_private_capture*)capture; \
51 private_display = private_capture->private_display; \
52 func_capture = private_capture->func_capture
55 _tdm_caputre_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, void *user_data)
57 tdm_private_capture *private_capture = user_data;
58 tdm_private_display *private_display = private_capture->private_display;
59 int lock_after_cb_done = 0;
61 if (pthread_mutex_trylock(&private_display->lock))
63 pthread_mutex_unlock(&private_display->lock);
64 lock_after_cb_done = 1;
67 tdm_buffer_unref_backend(tdm_buffer_get(buffer));
69 if (lock_after_cb_done)
70 pthread_mutex_lock(&private_display->lock);
73 INTERN tdm_private_capture*
74 tdm_capture_create_output_internal(tdm_private_output *private_output, tdm_error *error)
76 tdm_private_display *private_display;
77 tdm_func_display *func_display;
78 tdm_func_capture *func_capture;
79 tdm_private_capture *private_capture = NULL;
80 tdm_capture *capture_backend = NULL;
81 tdm_error ret = TDM_ERROR_NONE;
83 private_display = private_output->private_display;
84 func_display = &private_display->func_display;
85 func_capture = &private_display->func_capture;
87 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE))
89 TDM_ERR("no capture capability");
91 *error = TDM_ERROR_BAD_REQUEST;
95 capture_backend = func_display->output_create_capture(private_output->output_backend, &ret);
96 if (ret != TDM_ERROR_NONE)
103 private_capture = calloc(1, sizeof(tdm_private_capture));
104 if (!private_capture)
106 TDM_ERR("failed: alloc memory");
107 func_capture->capture_destroy(capture_backend);
109 *error = TDM_ERROR_OUT_OF_MEMORY;
113 ret = func_capture->capture_set_done_handler(capture_backend, _tdm_caputre_cb_done, private_capture);
114 if (ret != TDM_ERROR_NONE)
116 TDM_ERR("set capture_done_handler failed");
117 func_capture->capture_destroy(capture_backend);
123 LIST_ADD(&private_capture->link, &private_output->capture_list);
124 private_capture->func_capture = func_capture;
125 private_capture->target = TDM_CAPTURE_TARGET_OUTPUT;
126 private_capture->private_display = private_display;
127 private_capture->private_output = private_output;
128 private_capture->private_layer = NULL;
129 private_capture->capture_backend = capture_backend;
132 *error = TDM_ERROR_NONE;
134 return private_capture;
137 INTERN tdm_private_capture*
138 tdm_capture_create_layer_internal(tdm_private_layer *private_layer, tdm_error *error)
140 tdm_private_display *private_display;
141 tdm_private_output *private_output;
142 tdm_func_display *func_display;
143 tdm_func_capture *func_capture;
144 tdm_private_capture *private_capture = NULL;
145 tdm_capture *capture_backend = NULL;
146 tdm_error ret = TDM_ERROR_NONE;
148 private_output = private_layer->private_output;
149 private_display = private_output->private_display;
150 func_display = &private_display->func_display;
151 func_capture = &private_display->func_capture;
153 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE))
155 TDM_ERR("no capture capability");
157 *error = TDM_ERROR_BAD_REQUEST;
161 capture_backend = func_display->layer_create_capture(private_layer->layer_backend, &ret);
162 if (ret != TDM_ERROR_NONE)
165 private_capture = calloc(1, sizeof(tdm_private_capture));
166 if (!private_capture)
168 TDM_ERR("failed: alloc memory");
169 func_capture->capture_destroy(capture_backend);
171 *error = TDM_ERROR_OUT_OF_MEMORY;
175 LIST_ADD(&private_capture->link, &private_output->capture_list);
176 private_capture->target = TDM_CAPTURE_TARGET_LAYER;
177 private_capture->func_capture = func_capture;
178 private_capture->private_display = private_display;
179 private_capture->private_output = private_output;
180 private_capture->private_layer = private_layer;
181 private_capture->capture_backend = capture_backend;
184 *error = TDM_ERROR_NONE;
186 return private_capture;
190 tdm_capture_destroy_internal(tdm_private_capture *private_capture)
192 tdm_func_capture *func_capture;
194 if (!private_capture)
197 LIST_DEL(&private_capture->link);
199 func_capture = private_capture->func_capture;
200 func_capture->capture_destroy(private_capture->capture_backend);
202 free(private_capture);
206 tdm_capture_destroy(tdm_capture *capture)
208 tdm_private_capture *private_capture = capture;
209 tdm_private_display *private_display;
211 if (!private_capture)
214 private_display = private_capture->private_display;
216 pthread_mutex_lock(&private_display->lock);
217 tdm_capture_destroy_internal(private_capture);
218 pthread_mutex_unlock(&private_display->lock);
222 tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info)
224 CAPTURE_FUNC_ENTRY();
226 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
228 pthread_mutex_lock(&private_display->lock);
230 if (!func_capture->capture_set_info)
232 pthread_mutex_unlock(&private_display->lock);
233 return TDM_ERROR_NONE;
236 ret = func_capture->capture_set_info(private_capture->capture_backend, info);
238 pthread_mutex_unlock(&private_display->lock);
244 tdm_capture_attach(tdm_capture *capture, tdm_buffer *buffer)
246 CAPTURE_FUNC_ENTRY();
248 TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
250 pthread_mutex_lock(&private_display->lock);
252 if (!func_capture->capture_attach)
254 pthread_mutex_unlock(&private_display->lock);
255 return TDM_ERROR_NONE;
258 tdm_buffer_ref_backend(buffer);
259 ret = func_capture->capture_attach(private_capture->capture_backend,
260 tdm_buffer_get_surface(buffer));
262 pthread_mutex_unlock(&private_display->lock);
268 tdm_capture_commit(tdm_capture *capture)
270 CAPTURE_FUNC_ENTRY();
272 pthread_mutex_lock(&private_display->lock);
274 if (!func_capture->capture_commit)
276 pthread_mutex_unlock(&private_display->lock);
277 return TDM_ERROR_NONE;
280 ret = func_capture->capture_commit(private_capture->capture_backend);
282 pthread_mutex_unlock(&private_display->lock);