blob: 9f7b0037cb1355f0e7df06a9b293a3950cfc518f [file] [log] [blame]
fei.dengf7a0cd32023-08-29 09:36:37 +00001/*
2 * Copyright (C) 2021 Amlogic Corporation.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
fei.dengdd910ef2024-06-07 10:25:30 +080016#include <fcntl.h>
17#include <string.h>
fei.dengf7a0cd32023-08-29 09:36:37 +000018#include "drm_plugin.h"
19#include "Logger.h"
20#include "drm_display.h"
fei.dengb9a1a572023-09-13 01:33:57 +000021#include "ErrorCode.h"
fei.dengf7a0cd32023-08-29 09:36:37 +000022
23#define TAG "rlib:drm_plugin"
24
fei.dengb9a1a572023-09-13 01:33:57 +000025DrmPlugin::DrmPlugin(int logCategory)
26 : mLogCategory(logCategory)
fei.dengf7a0cd32023-08-29 09:36:37 +000027{
28 mVideoFormat = VIDEO_FORMAT_UNKNOWN;
29 mIsPip = false;
fei.dengb9a1a572023-09-13 01:33:57 +000030 mDrmDisplay = new DrmDisplay(this,logCategory);
fei.dengf7a0cd32023-08-29 09:36:37 +000031}
32
33DrmPlugin::~DrmPlugin()
34{
35 if (mDrmDisplay) {
36 delete mDrmDisplay;
37 mDrmDisplay = NULL;
38 }
39}
40
41void DrmPlugin::init()
42{
fei.dengb9a1a572023-09-13 01:33:57 +000043 INFO(mLogCategory,"\n--------------------------------\n"
fei.dengf7a0cd32023-08-29 09:36:37 +000044 "plugin : drmmeson\n"
45 "ARCH : %s\n"
46 "branch name : %s\n"
47 "git version : %s\n"
48 "change id : %s \n"
49 "ID : %s \n"
50 "last changed: %s\n"
51 "build-time : %s\n"
52 "build-name : %s\n"
53 "--------------------------------\n",
54#if defined(__aarch64__)
55 "arm64",
56#else
57 "arm",
58#endif
59 BRANCH_NAME,
60 GIT_VERSION,
61 COMMIT_CHANGEID,
62 COMMIT_PD,
63 LAST_CHANGED,
64 BUILD_TIME,
65 BUILD_NAME
66 );
67}
68
69void DrmPlugin::release()
70{
71}
72
73void DrmPlugin::setCallback(void *userData, PluginCallback *callback)
74{
75 mUserData = userData;
76 mCallback = callback;
77}
78
79int DrmPlugin::openDisplay()
80{
81 int ret;
82
fei.dengb9a1a572023-09-13 01:33:57 +000083 DEBUG(mLogCategory,"openDisplay");
fei.dengf7a0cd32023-08-29 09:36:37 +000084
fei.dengb9a1a572023-09-13 01:33:57 +000085 DEBUG(mLogCategory,"openDisplay end");
fei.dengf7a0cd32023-08-29 09:36:37 +000086 return ret;
87}
88
89int DrmPlugin::openWindow()
90{
fei.dengb9a1a572023-09-13 01:33:57 +000091 int ret = NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +000092
fei.dengb9a1a572023-09-13 01:33:57 +000093 DEBUG(mLogCategory,"openWindow");
fei.dengf7a0cd32023-08-29 09:36:37 +000094
95 bool rc = mDrmDisplay->start(mIsPip);
96 if (!rc) {
fei.dengb9a1a572023-09-13 01:33:57 +000097 ret = ERROR_OPEN_FAIL;
98 ERROR(mLogCategory,"drm window open failed");
99 return ret;
fei.dengf7a0cd32023-08-29 09:36:37 +0000100 }
101
fei.dengb9a1a572023-09-13 01:33:57 +0000102 DEBUG(mLogCategory,"openWindow,end");
fei.dengf7a0cd32023-08-29 09:36:37 +0000103 return ret;
104}
105
106int DrmPlugin::prepareFrame(RenderBuffer *buffer)
107{
fei.dengb9a1a572023-09-13 01:33:57 +0000108 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000109}
110
111int DrmPlugin::displayFrame(RenderBuffer *buffer, int64_t displayTime)
112{
113 mDrmDisplay->displayFrame(buffer, displayTime);
fei.dengb9a1a572023-09-13 01:33:57 +0000114 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000115}
116
117int DrmPlugin::flush()
118{
119 mDrmDisplay->flush();
fei.dengb9a1a572023-09-13 01:33:57 +0000120 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000121}
122
123int DrmPlugin::pause()
124{
125 mDrmDisplay->pause();
fei.dengb9a1a572023-09-13 01:33:57 +0000126 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000127}
128int DrmPlugin::resume()
129{
130 mDrmDisplay->resume();
fei.dengb9a1a572023-09-13 01:33:57 +0000131 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000132}
133
134int DrmPlugin::closeDisplay()
135{
fei.dengb9a1a572023-09-13 01:33:57 +0000136 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000137}
138
139int DrmPlugin::closeWindow()
140{
141 int ret;
142 mDrmDisplay->stop();
fei.dengb9a1a572023-09-13 01:33:57 +0000143 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000144}
145
146
147int DrmPlugin::getValue(PluginKey key, void *value)
148{
149 switch (key) {
150 case PLUGIN_KEY_VIDEO_FORMAT: {
151 *(int *)value = mVideoFormat;
fei.dengb9a1a572023-09-13 01:33:57 +0000152 TRACE(mLogCategory,"get video format:%d",*(int *)value);
fei.dengf7a0cd32023-08-29 09:36:37 +0000153 } break;
154 case PLUGIN_KEY_VIDEO_PIP: {
155 *(int *)value = (mIsPip == true) ? 1 : 0;
fei.deng42851f02024-07-31 13:48:11 +0800156 } break;
fei.dengf7a0cd32023-08-29 09:36:37 +0000157 case PLUGIN_KEY_HIDE_VIDEO: {
158 bool isHide = false;
159 if (mDrmDisplay) {
160 isHide = mDrmDisplay->isHideVideo();
161 }
162 *(int *)value = isHide == true? 1: 0;
fei.dengb9a1a572023-09-13 01:33:57 +0000163 TRACE(mLogCategory,"get hide video:%d",*(int *)value);
fei.dengf7a0cd32023-08-29 09:36:37 +0000164 } break;
165 }
166
fei.dengb9a1a572023-09-13 01:33:57 +0000167 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000168}
169
170int DrmPlugin::setValue(PluginKey key, void *value)
171{
172 switch (key) {
173 case PLUGIN_KEY_WINDOW_SIZE: {
174 RenderRect* rect = static_cast<RenderRect*>(value);
175 if (mDrmDisplay) {
176 mDrmDisplay->setWindowSize(rect->x, rect->y, rect->w, rect->h);
177 }
178 } break;
179 case PLUGIN_KEY_FRAME_SIZE: {
180 RenderFrameSize * frameSize = static_cast<RenderFrameSize * >(value);
181 if (mDrmDisplay) {
182 mDrmDisplay->setFrameSize(frameSize->width, frameSize->height);
183 }
184 } break;
185 case PLUGIN_KEY_VIDEO_FORMAT: {
186 int format = *(int *)(value);
187 mVideoFormat = (RenderVideoFormat) format;
fei.dengb9a1a572023-09-13 01:33:57 +0000188 DEBUG(mLogCategory,"Set video format :%d",mVideoFormat);
fei.dengf7a0cd32023-08-29 09:36:37 +0000189 if (mDrmDisplay) {
190 mDrmDisplay->setVideoFormat(mVideoFormat);
191 }
192 } break;
193 case PLUGIN_KEY_VIDEO_PIP: {
194 int pip = *(int *) (value);
195 mIsPip = pip > 0? true:false;
fei.deng42851f02024-07-31 13:48:11 +0800196 } break;
fei.dengf7a0cd32023-08-29 09:36:37 +0000197 case PLUGIN_KEY_IMMEDIATELY_OUTPUT: {
198 bool immediately = (*(int *)(value)) > 0? true: false;
fei.dengb9a1a572023-09-13 01:33:57 +0000199 DEBUG(mLogCategory, "Set immediately output:%d",immediately);
fei.dengf7a0cd32023-08-29 09:36:37 +0000200 if (mDrmDisplay) {
201 mDrmDisplay->setImmediatelyOutout(immediately);
202 }
203 } break;
204 case PLUGIN_KEY_HIDE_VIDEO: {
205 int hide = *(int *)(value);
206 if (mDrmDisplay) {
207 mDrmDisplay->setHideVideo(hide > 0? true:false);
208 }
209 } break;
210 case PLUGIN_KEY_KEEP_LAST_FRAME: {
211 int keep = *(int *) (value);
212 bool keepLastFrame = keep > 0? true:false;
fei.dengb9a1a572023-09-13 01:33:57 +0000213 DEBUG(mLogCategory, "Set keep last frame :%d",keepLastFrame);
fei.dengf7a0cd32023-08-29 09:36:37 +0000214 if (mDrmDisplay) {
215 mDrmDisplay->setKeepLastFrame(keepLastFrame);
216 }
217 } break;
218 }
fei.dengb9a1a572023-09-13 01:33:57 +0000219 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000220}
221
222void DrmPlugin::handleBufferRelease(RenderBuffer *buffer)
223{
224 if (mCallback) {
225 mCallback->doBufferReleaseCallback(mUserData, (void *)buffer);
226 }
227}
228
229void DrmPlugin::handleFrameDisplayed(RenderBuffer *buffer)
230{
231 if (mCallback) {
232 mCallback->doBufferDisplayedCallback(mUserData, (void *)buffer);
233 }
234}
235
236void DrmPlugin::handleFrameDropped(RenderBuffer *buffer)
237{
238 if (mCallback) {
239 mCallback->doBufferDropedCallback(mUserData, (void *)buffer);
240 }
241}
242
243void DrmPlugin::handleMsgNotify(int type, void *detail)
244{
245 if (mCallback) {
246 mCallback->doMsgCallback(mUserData, type, detail);
247 }
248}
249
250void *makePluginInstance(int id)
251{
fei.dengdd910ef2024-06-07 10:25:30 +0800252 int fd= -1;
253 const char *levelPath = "/run/rlib_plugin_level";
254
fei.dengb9a1a572023-09-13 01:33:57 +0000255 int category =Logger_init(id);
fei.dengc4677852023-10-09 07:21:04 +0000256 char *env = getenv("VIDEO_RENDER_PLUGIN_LOG_LEVEL");
fei.dengf7a0cd32023-08-29 09:36:37 +0000257 if (env) {
258 int level = atoi(env);
259 Logger_set_level(level);
fei.dengdd910ef2024-06-07 10:25:30 +0800260 INFO(category,"env set VIDEO_RENDER_PLUGIN_LOG_LEVEL=%d",level);
261 }
262
263 //get log level from /run/rlib_plugin_level
264 fd= open(levelPath, O_RDONLY|O_CLOEXEC);
265 if ( fd >= 0 )
266 {
267 char valstr[64];
268 uint32_t val= 0;
269 int nRead;
270
271 memset(valstr, 0, sizeof(valstr));
272 nRead = read(fd, valstr, sizeof(valstr) - 1);
273 valstr[strlen(valstr)] = '\0';
274 if (sscanf(valstr, "%u", &val) > 0)
275 {
276 Logger_set_level(val);
277 INFO(category,"set VIDEO_RENDER_LOG_LEVEL=%d",val);
278 }
279 close(fd);
280 fd = -1;
fei.dengf7a0cd32023-08-29 09:36:37 +0000281 }
fei.dengb9a1a572023-09-13 01:33:57 +0000282 DrmPlugin *drmPlugin = new DrmPlugin(category);
fei.dengf7a0cd32023-08-29 09:36:37 +0000283 return static_cast<void *>(drmPlugin);
284}
285
286void destroyPluginInstance(void * plugin)
287{
fei.dengb9a1a572023-09-13 01:33:57 +0000288 int category;
289
fei.dengf7a0cd32023-08-29 09:36:37 +0000290 DrmPlugin *pluginInstance = static_cast<DrmPlugin *>(plugin);
fei.dengb9a1a572023-09-13 01:33:57 +0000291 category = pluginInstance->getLogCategory();
fei.dengf7a0cd32023-08-29 09:36:37 +0000292 delete pluginInstance;
fei.dengb9a1a572023-09-13 01:33:57 +0000293 Logger_exit(category);
fei.dengf7a0cd32023-08-29 09:36:37 +0000294}