blob: 2f15d66afac3bd8780946ac1ff73dc763eeb179b [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 */
16#include "drm_plugin.h"
17#include "Logger.h"
18#include "drm_display.h"
fei.dengb9a1a572023-09-13 01:33:57 +000019#include "ErrorCode.h"
fei.dengf7a0cd32023-08-29 09:36:37 +000020
21#define TAG "rlib:drm_plugin"
22
fei.dengb9a1a572023-09-13 01:33:57 +000023DrmPlugin::DrmPlugin(int logCategory)
24 : mLogCategory(logCategory)
fei.dengf7a0cd32023-08-29 09:36:37 +000025{
26 mVideoFormat = VIDEO_FORMAT_UNKNOWN;
27 mIsPip = false;
fei.dengb9a1a572023-09-13 01:33:57 +000028 mDrmDisplay = new DrmDisplay(this,logCategory);
fei.dengf7a0cd32023-08-29 09:36:37 +000029}
30
31DrmPlugin::~DrmPlugin()
32{
33 if (mDrmDisplay) {
34 delete mDrmDisplay;
35 mDrmDisplay = NULL;
36 }
37}
38
39void DrmPlugin::init()
40{
fei.dengb9a1a572023-09-13 01:33:57 +000041 INFO(mLogCategory,"\n--------------------------------\n"
fei.dengf7a0cd32023-08-29 09:36:37 +000042 "plugin : drmmeson\n"
43 "ARCH : %s\n"
44 "branch name : %s\n"
45 "git version : %s\n"
46 "change id : %s \n"
47 "ID : %s \n"
48 "last changed: %s\n"
49 "build-time : %s\n"
50 "build-name : %s\n"
51 "--------------------------------\n",
52#if defined(__aarch64__)
53 "arm64",
54#else
55 "arm",
56#endif
57 BRANCH_NAME,
58 GIT_VERSION,
59 COMMIT_CHANGEID,
60 COMMIT_PD,
61 LAST_CHANGED,
62 BUILD_TIME,
63 BUILD_NAME
64 );
65}
66
67void DrmPlugin::release()
68{
69}
70
71void DrmPlugin::setCallback(void *userData, PluginCallback *callback)
72{
73 mUserData = userData;
74 mCallback = callback;
75}
76
77int DrmPlugin::openDisplay()
78{
79 int ret;
80
fei.dengb9a1a572023-09-13 01:33:57 +000081 DEBUG(mLogCategory,"openDisplay");
fei.dengf7a0cd32023-08-29 09:36:37 +000082
fei.dengb9a1a572023-09-13 01:33:57 +000083 DEBUG(mLogCategory,"openDisplay end");
fei.dengf7a0cd32023-08-29 09:36:37 +000084 return ret;
85}
86
87int DrmPlugin::openWindow()
88{
fei.dengb9a1a572023-09-13 01:33:57 +000089 int ret = NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +000090
fei.dengb9a1a572023-09-13 01:33:57 +000091 DEBUG(mLogCategory,"openWindow");
fei.dengf7a0cd32023-08-29 09:36:37 +000092
93 bool rc = mDrmDisplay->start(mIsPip);
94 if (!rc) {
fei.dengb9a1a572023-09-13 01:33:57 +000095 ret = ERROR_OPEN_FAIL;
96 ERROR(mLogCategory,"drm window open failed");
97 return ret;
fei.dengf7a0cd32023-08-29 09:36:37 +000098 }
99
fei.dengb9a1a572023-09-13 01:33:57 +0000100 DEBUG(mLogCategory,"openWindow,end");
fei.dengf7a0cd32023-08-29 09:36:37 +0000101 return ret;
102}
103
104int DrmPlugin::prepareFrame(RenderBuffer *buffer)
105{
fei.dengb9a1a572023-09-13 01:33:57 +0000106 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000107}
108
109int DrmPlugin::displayFrame(RenderBuffer *buffer, int64_t displayTime)
110{
111 mDrmDisplay->displayFrame(buffer, displayTime);
fei.dengb9a1a572023-09-13 01:33:57 +0000112 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000113}
114
115int DrmPlugin::flush()
116{
117 mDrmDisplay->flush();
fei.dengb9a1a572023-09-13 01:33:57 +0000118 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000119}
120
121int DrmPlugin::pause()
122{
123 mDrmDisplay->pause();
fei.dengb9a1a572023-09-13 01:33:57 +0000124 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000125}
126int DrmPlugin::resume()
127{
128 mDrmDisplay->resume();
fei.dengb9a1a572023-09-13 01:33:57 +0000129 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000130}
131
132int DrmPlugin::closeDisplay()
133{
fei.dengb9a1a572023-09-13 01:33:57 +0000134 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000135}
136
137int DrmPlugin::closeWindow()
138{
139 int ret;
140 mDrmDisplay->stop();
fei.dengb9a1a572023-09-13 01:33:57 +0000141 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000142}
143
144
145int DrmPlugin::getValue(PluginKey key, void *value)
146{
147 switch (key) {
148 case PLUGIN_KEY_VIDEO_FORMAT: {
149 *(int *)value = mVideoFormat;
fei.dengb9a1a572023-09-13 01:33:57 +0000150 TRACE(mLogCategory,"get video format:%d",*(int *)value);
fei.dengf7a0cd32023-08-29 09:36:37 +0000151 } break;
152 case PLUGIN_KEY_VIDEO_PIP: {
153 *(int *)value = (mIsPip == true) ? 1 : 0;
154 };
155 case PLUGIN_KEY_HIDE_VIDEO: {
156 bool isHide = false;
157 if (mDrmDisplay) {
158 isHide = mDrmDisplay->isHideVideo();
159 }
160 *(int *)value = isHide == true? 1: 0;
fei.dengb9a1a572023-09-13 01:33:57 +0000161 TRACE(mLogCategory,"get hide video:%d",*(int *)value);
fei.dengf7a0cd32023-08-29 09:36:37 +0000162 } break;
163 }
164
fei.dengb9a1a572023-09-13 01:33:57 +0000165 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000166}
167
168int DrmPlugin::setValue(PluginKey key, void *value)
169{
170 switch (key) {
171 case PLUGIN_KEY_WINDOW_SIZE: {
172 RenderRect* rect = static_cast<RenderRect*>(value);
173 if (mDrmDisplay) {
174 mDrmDisplay->setWindowSize(rect->x, rect->y, rect->w, rect->h);
175 }
176 } break;
177 case PLUGIN_KEY_FRAME_SIZE: {
178 RenderFrameSize * frameSize = static_cast<RenderFrameSize * >(value);
179 if (mDrmDisplay) {
180 mDrmDisplay->setFrameSize(frameSize->width, frameSize->height);
181 }
182 } break;
183 case PLUGIN_KEY_VIDEO_FORMAT: {
184 int format = *(int *)(value);
185 mVideoFormat = (RenderVideoFormat) format;
fei.dengb9a1a572023-09-13 01:33:57 +0000186 DEBUG(mLogCategory,"Set video format :%d",mVideoFormat);
fei.dengf7a0cd32023-08-29 09:36:37 +0000187 if (mDrmDisplay) {
188 mDrmDisplay->setVideoFormat(mVideoFormat);
189 }
190 } break;
191 case PLUGIN_KEY_VIDEO_PIP: {
192 int pip = *(int *) (value);
193 mIsPip = pip > 0? true:false;
194 };
195 case PLUGIN_KEY_IMMEDIATELY_OUTPUT: {
196 bool immediately = (*(int *)(value)) > 0? true: false;
fei.dengb9a1a572023-09-13 01:33:57 +0000197 DEBUG(mLogCategory, "Set immediately output:%d",immediately);
fei.dengf7a0cd32023-08-29 09:36:37 +0000198 if (mDrmDisplay) {
199 mDrmDisplay->setImmediatelyOutout(immediately);
200 }
201 } break;
202 case PLUGIN_KEY_HIDE_VIDEO: {
203 int hide = *(int *)(value);
204 if (mDrmDisplay) {
205 mDrmDisplay->setHideVideo(hide > 0? true:false);
206 }
207 } break;
208 case PLUGIN_KEY_KEEP_LAST_FRAME: {
209 int keep = *(int *) (value);
210 bool keepLastFrame = keep > 0? true:false;
fei.dengb9a1a572023-09-13 01:33:57 +0000211 DEBUG(mLogCategory, "Set keep last frame :%d",keepLastFrame);
fei.dengf7a0cd32023-08-29 09:36:37 +0000212 if (mDrmDisplay) {
213 mDrmDisplay->setKeepLastFrame(keepLastFrame);
214 }
215 } break;
216 }
fei.dengb9a1a572023-09-13 01:33:57 +0000217 return NO_ERROR;
fei.dengf7a0cd32023-08-29 09:36:37 +0000218}
219
220void DrmPlugin::handleBufferRelease(RenderBuffer *buffer)
221{
222 if (mCallback) {
223 mCallback->doBufferReleaseCallback(mUserData, (void *)buffer);
224 }
225}
226
227void DrmPlugin::handleFrameDisplayed(RenderBuffer *buffer)
228{
229 if (mCallback) {
230 mCallback->doBufferDisplayedCallback(mUserData, (void *)buffer);
231 }
232}
233
234void DrmPlugin::handleFrameDropped(RenderBuffer *buffer)
235{
236 if (mCallback) {
237 mCallback->doBufferDropedCallback(mUserData, (void *)buffer);
238 }
239}
240
241void DrmPlugin::handleMsgNotify(int type, void *detail)
242{
243 if (mCallback) {
244 mCallback->doMsgCallback(mUserData, type, detail);
245 }
246}
247
248void *makePluginInstance(int id)
249{
fei.dengb9a1a572023-09-13 01:33:57 +0000250 int category =Logger_init(id);
fei.dengc4677852023-10-09 07:21:04 +0000251 char *env = getenv("VIDEO_RENDER_PLUGIN_LOG_LEVEL");
fei.dengf7a0cd32023-08-29 09:36:37 +0000252 if (env) {
253 int level = atoi(env);
254 Logger_set_level(level);
fei.dengc4677852023-10-09 07:21:04 +0000255 INFO(category,"VIDEO_RENDER_PLUGIN_LOG_LEVEL=%d",level);
fei.dengf7a0cd32023-08-29 09:36:37 +0000256 }
fei.dengb9a1a572023-09-13 01:33:57 +0000257 DrmPlugin *drmPlugin = new DrmPlugin(category);
fei.dengf7a0cd32023-08-29 09:36:37 +0000258 return static_cast<void *>(drmPlugin);
259}
260
261void destroyPluginInstance(void * plugin)
262{
fei.dengb9a1a572023-09-13 01:33:57 +0000263 int category;
264
fei.dengf7a0cd32023-08-29 09:36:37 +0000265 DrmPlugin *pluginInstance = static_cast<DrmPlugin *>(plugin);
fei.dengb9a1a572023-09-13 01:33:57 +0000266 category = pluginInstance->getLogCategory();
fei.dengf7a0cd32023-08-29 09:36:37 +0000267 delete pluginInstance;
fei.dengb9a1a572023-09-13 01:33:57 +0000268 Logger_exit(category);
fei.dengf7a0cd32023-08-29 09:36:37 +0000269}