1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
3 */
4 /*
5 * Copyright (C) 2024 Huawei Device Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include "lpp_video_streamer.h"
20 #include "lppCallback.h"
21 #include "multimedia/player_framework/lowpower_audio_sink.h"
22 #include "multimedia/player_framework/lowpower_audio_sink_base.h"
23 #include "multimedia/player_framework/lowpower_video_sink.h"
24 #include "multimedia/player_framework/lowpower_video_sink_base.h"
25 #include <js_native_api_types.h>
26
27 #undef LOG_TAG
28 #define LOG_TAG "LppVideoStreamer"
29
~LppVideoStreamer()30 LppVideoStreamer::~LppVideoStreamer()
31 {
32 if (lppVideoStreamer_ != nullptr) {
33 Release();
34 }
35 }
36
Create(const std::string & codecMime)37 int32_t LppVideoStreamer::Create(const std::string &codecMime)
38 {
39 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Create ======");
40 lppVideoStreamer_ = OH_LowPowerVideoSink_CreateByMime(codecMime.c_str());
41 CHECK_AND_RETURN_RET_LOG(lppVideoStreamer_ != nullptr, AVCODEC_SAMPLE_ERR_ERROR, "Create failed");
42 return AVCODEC_SAMPLE_ERR_OK;
43 }
44
SetCallbackCreateNull(LppUserData * lppUserData)45 int32_t LppVideoStreamer::SetCallbackCreateNull(LppUserData *lppUserData)
46 {
47 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetCallbackCreateNull ======");
48 int32_t ret = AV_ERR_OK;
49 lppVideoStreamerCallback_ = OH_LowPowerVideoSinkCallback_Create();
50 lppVideoStreamerCallback_ = nullptr;
51 ret = OH_LowPowerVideoSink_RegisterCallback(lppVideoStreamer_, lppVideoStreamerCallback_);
52 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Set callback failed, ret::: %{public}d", ret);
53
54 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSink_RegisterCallback ret:::%{public}d ", ret);
55 return ret;
56 }
SetDataNeededListener(LppUserData * lppUserData)57 int32_t LppVideoStreamer::SetDataNeededListener(LppUserData *lppUserData)
58 {
59 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetCallback ======");
60 int32_t ret = AV_ERR_OK;
61 ret = OH_LowPowerVideoSinkCallback_SetDataNeededListener(lppVideoStreamerCallback_,
62 LppCallback::OnDataNeededVideo, lppUserData);
63 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSinkCallback_SetDataNeededListener ret:::%{public}d ", ret);
64 return ret;
65 }
SetStreamChangedListener(LppUserData * lppUserData)66 int32_t LppVideoStreamer::SetStreamChangedListener(LppUserData *lppUserData)
67 {
68 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetStreamChangedListener ======");
69 int32_t ret = AV_ERR_OK;
70 ret = OH_LowPowerVideoSinkCallback_SetStreamChangedListener(
71 lppVideoStreamerCallback_, LppCallback::OH_LowPowerVideoSink_OnStreamChanged, lppUserData);
72 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSinkCallback_SetStreamChangedListener ret:::%{public}d ", ret);
73 return ret;
74 }
SetCallback(LppUserData * lppUserData)75 int32_t LppVideoStreamer::SetCallback(LppUserData *lppUserData)
76 {
77 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetCallback ======");
78 int32_t ret = AV_ERR_OK;
79 lppVideoStreamerCallback_ = OH_LowPowerVideoSinkCallback_Create();
80 ret = OH_LowPowerVideoSinkCallback_SetDataNeededListener(lppVideoStreamerCallback_,
81 LppCallback::OnDataNeededVideo, lppUserData);
82 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSinkCallback_SetDataNeededListener ret:::%{public}d ", ret);
83 ret = OH_LowPowerVideoSinkCallback_SetStreamChangedListener(
84 lppVideoStreamerCallback_, LppCallback::OH_LowPowerVideoSink_OnStreamChanged, lppUserData);
85 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSinkCallback_SetStreamChangedListener ret:::%{public}d ", ret);
86 ret = OH_LowPowerVideoSink_RegisterCallback(lppVideoStreamer_, lppVideoStreamerCallback_);
87 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Set callback failed, ret::: %{public}d", ret);
88
89 AVCODEC_SAMPLE_LOGI("OH_LowPowerVideoSink_RegisterCallback ret:::%{public}d ", ret);
90 return ret;
91 }
92
SetErrorCallback(LppUserData * lppUserData)93 int32_t LppVideoStreamer::SetErrorCallback(LppUserData *lppUserData)
94 {
95 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetErrorCallback ======");
96 int32_t ret = AV_ERR_OK;
97 ret = OH_LowPowerVideoSinkCallback_SetErrorListener(lppVideoStreamerCallback_,
98 LppCallback::OnVideoError, lppUserData);
99 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Set callback failed, ret::: %{public}d", ret);
100
101 AVCODEC_SAMPLE_LOGI("OnVideoError ret:::%{public}d ", ret);
102 return ret;
103 }
104
SetRenderStartCallback(LppUserData * lppUserData)105 int32_t LppVideoStreamer::SetRenderStartCallback(LppUserData *lppUserData)
106 {
107 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetRenderStartCallback ======");
108 int32_t ret = AV_ERR_OK;
109 ret = OH_LowPowerVideoSinkCallback_SetRenderStartListener(lppVideoStreamerCallback_,
110 LppCallback::OnRenderStarted, lppUserData);
111 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Set callback failed, ret::: %{public}d", ret);
112
113 AVCODEC_SAMPLE_LOGI("OnRenderStarted ret:::%{public}d ", ret);
114 return ret;
115 }
116
SetFirstFrameDecodedCallback(LppUserData * lppUserData)117 int32_t LppVideoStreamer::SetFirstFrameDecodedCallback(LppUserData *lppUserData)
118 {
119 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetFirstFrameDecodedCallback ======");
120 int32_t ret = AV_ERR_OK;
121 ret = OH_LowPowerVideoSinkCallback_SetFirstFrameDecodedListener(lppVideoStreamerCallback_,
122 LppCallback::OnEos, lppUserData);
123
124 AVCODEC_SAMPLE_LOGI("OnEos ret:::%{public}d ", ret);
125 return ret;
126 }
127
SetEosCallback(LppUserData * lppUserData)128 int32_t LppVideoStreamer::SetEosCallback(LppUserData *lppUserData)
129 {
130 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetEosCallback ======");
131 int32_t ret = AV_ERR_OK;
132 ret = OH_LowPowerVideoSinkCallback_SetEosListener(lppVideoStreamerCallback_, LppCallback::OnEos,
133 lppUserData);
134 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Set callback failed, ret::: %{public}d", ret);
135
136 AVCODEC_SAMPLE_LOGI("OnEos ret:::%{public}d ", ret);
137 return ret;
138 }
139
Configure(const SampleInfo & sampleInfo)140 int32_t LppVideoStreamer::Configure(const SampleInfo &sampleInfo)
141 {
142 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Configure ======");
143 OH_AVFormat *format = OH_AVFormat_Create();
144 CHECK_AND_RETURN_RET_LOG(format != nullptr, AVCODEC_SAMPLE_ERR_ERROR, "AVFormat create failed");
145
146 OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, sampleInfo.videoWidth);
147 OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, sampleInfo.videoHeight);
148 OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, sampleInfo.frameRate);
149 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, sampleInfo.pixelFormat);
150 OH_AVFormat_SetIntValue(format, OH_MD_KEY_ROTATION, sampleInfo.rotation);
151
152 AVCODEC_SAMPLE_LOGI("====== VideoDecoder config ======");
153 AVCODEC_SAMPLE_LOGI("%{public}d*%{public}d, %{public}.1ffps, qzmmm%{public}d,%{public}d", sampleInfo.videoWidth,
154 sampleInfo.videoHeight, sampleInfo.frameRate, sampleInfo.pixelFormat, sampleInfo.rotation);
155 AVCODEC_SAMPLE_LOGI("====== VideoDecoder config ======");
156 int ret = OH_LowPowerVideoSink_Configure(lppVideoStreamer_, format);
157 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Configure failed, ret::: %{public}d", ret);
158 return ret;
159 }
160
returnFrames(LppUserData * lppUserData)161 int32_t LppVideoStreamer::returnFrames(LppUserData *lppUserData)
162 {
163 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ returnFrames ======");
164 int ret = OH_LowPowerVideoSink_ReturnSamples(lppVideoStreamer_, lppUserData->framePacket_);
165 return ret;
166 }
167
SetParameter(const SampleInfo & sampleInfo)168 int32_t LppVideoStreamer::SetParameter(const SampleInfo &sampleInfo)
169 {
170 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetParameter ======");
171 OH_AVFormat *format = OH_AVFormat_Create();
172 CHECK_AND_RETURN_RET_LOG(format != nullptr, AVCODEC_SAMPLE_ERR_ERROR, "AVFormat create failed");
173 OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, sampleInfo.videoWidth);
174 OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, sampleInfo.videoHeight);
175 OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, sampleInfo.frameRate);
176 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, sampleInfo.pixelFormat);
177 OH_AVFormat_SetIntValue(format, OH_MD_KEY_ROTATION, sampleInfo.rotation);
178 AVCODEC_SAMPLE_LOGI("====== VideoDecoder config ======");
179 AVCODEC_SAMPLE_LOGI("%{public}d*%{public}d, %{public}.1ffps", sampleInfo.videoWidth, sampleInfo.videoHeight,
180 sampleInfo.frameRate);
181 AVCODEC_SAMPLE_LOGI("====== VideoDecoder config ======");
182 int ret = OH_LowPowerVideoSink_SetParameter(lppVideoStreamer_, format);
183 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Configure failed, ret::: %{public}d", ret);
184 return ret;
185 }
GetParameter(const SampleInfo & sampleInfo)186 int32_t LppVideoStreamer::GetParameter(const SampleInfo &sampleInfo)
187 {
188 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ GetParameter ======");
189 OH_AVFormat *format = OH_AVFormat_Create();
190 CHECK_AND_RETURN_RET_LOG(format != nullptr, AVCODEC_SAMPLE_ERR_ERROR, "AVFormat create failed");
191 int ret = OH_LowPowerVideoSink_GetParameter(lppVideoStreamer_, format);
192 CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, ret, "Configure failed, ret::: %{public}d", ret);
193 return ret;
194 }
195
Prepare()196 int32_t LppVideoStreamer::Prepare()
197 {
198 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Prepare ======");
199 int ret = OH_LowPowerVideoSink_Prepare(lppVideoStreamer_);
200 return ret;
201 }
202
Resume()203 int32_t LppVideoStreamer::Resume()
204 {
205 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Resume ======");
206 int ret = OH_LowPowerVideoSink_Resume(lppVideoStreamer_);
207 return ret;
208 }
209
Flush()210 int32_t LppVideoStreamer::Flush()
211 {
212 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Flush ======");
213 int ret = OH_LowPowerVideoSink_Flush(lppVideoStreamer_);
214 return ret;
215 }
216
Stop()217 int32_t LppVideoStreamer::Stop()
218 {
219 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Stop ======");
220 int ret = OH_LowPowerVideoSink_Stop(lppVideoStreamer_);
221 return ret;
222 }
223
Reset()224 int32_t LppVideoStreamer::Reset()
225 {
226 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Reset ======");
227 AVCODEC_SAMPLE_LOGI("reset in4");
228 int ret = OH_LowPowerVideoSink_Reset(lppVideoStreamer_);
229 AVCODEC_SAMPLE_LOGI("reset in5");
230 return ret;
231 }
232
Destroy()233 int32_t LppVideoStreamer::Destroy()
234 {
235 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Destroy ======");
236 int ret = OH_LowPowerVideoSink_Destroy(lppVideoStreamer_);
237 AVCODEC_SAMPLE_LOGW("lppVideoStreamer_ Destroy ret:::%{public}d", ret);
238 lppVideoStreamer_ = nullptr;
239 return ret;
240 }
241
CallbackDestroy()242 int32_t LppVideoStreamer::CallbackDestroy()
243 {
244 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ CallbackDestroy ======");
245 int ret = OH_LowPowerVideoSinkCallback_Destroy(lppVideoStreamerCallback_);
246 AVCODEC_SAMPLE_LOGW("lppVideoStreamer_ CallbackDestroy ret:::%{public}d", ret);
247 lppVideoStreamerCallback_ = nullptr;
248 return ret;
249 }
250
StartDecode(bool flag)251 int32_t LppVideoStreamer::StartDecode(bool flag)
252 {
253 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ StartDecode ======");
254 int ret = OH_LowPowerVideoSink_StartDecoder(lppVideoStreamer_);
255 return ret;
256 }
257
StartRender()258 int32_t LppVideoStreamer::StartRender()
259 {
260 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ StartRender ======");
261 int ret = OH_LowPowerVideoSink_StartRenderer(lppVideoStreamer_);
262 return ret;
263 }
264
Pause()265 int32_t LppVideoStreamer::Pause()
266 {
267 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ Pause ======");
268 int ret = OH_LowPowerVideoSink_Pause(lppVideoStreamer_);
269 return ret;
270 }
271
SetVideoSurface(const SampleInfo & sampleInfo)272 int32_t LppVideoStreamer::SetVideoSurface(const SampleInfo &sampleInfo)
273 {
274 int ret = 1;
275 if (sampleInfo.window != nullptr) {
276 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetVideoSurface ======");
277 ret =OH_LowPowerVideoSink_SetVideoSurface(lppVideoStreamer_, sampleInfo.window);
278 }
279 return ret;
280 }
281
SetSyncAudioStreamer(OH_LowPowerAudioSink * audioStreamer)282 int32_t LppVideoStreamer::SetSyncAudioStreamer(OH_LowPowerAudioSink *audioStreamer)
283 {
284 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetSyncAudioStreamer ======");
285 int ret = OH_LowPowerVideoSink_SetSyncAudioSink(lppVideoStreamer_, audioStreamer);
286 return ret;
287 }
288
SetTargetStartFrame(const int64_t framePts,OH_LowPowerVideoSink_OnTargetArrived onTargetArrived,const int64_t timeoutMs,LppUserData * lppUserData)289 int32_t LppVideoStreamer::SetTargetStartFrame(const int64_t framePts,
290 OH_LowPowerVideoSink_OnTargetArrived onTargetArrived,
291 const int64_t timeoutMs, LppUserData *lppUserData)
292 {
293 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetTargetStartFrame ======");
294 int ret = OH_LowPowerVideoSink_SetTargetStartFrame(lppVideoStreamer_,
295 framePts, onTargetArrived, timeoutMs, lppUserData);
296 return ret;
297 }
298
SetPlaybackSpeed(const float speed)299 int32_t LppVideoStreamer::SetPlaybackSpeed(const float speed)
300 {
301 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ SetPlaybackSpeed ======");
302 int ret = OH_LowPowerVideoSink_SetPlaybackSpeed(lppVideoStreamer_, speed);
303 return ret;
304 }
305
Release()306 int32_t LppVideoStreamer::Release()
307 {
308 Destroy();
309 CallbackDestroy();
310 return AVCODEC_SAMPLE_ERR_OK;
311 }
312
RenderFirstFrame()313 int32_t LppVideoStreamer::RenderFirstFrame()
314 {
315 AVCODEC_SAMPLE_LOGI("====== lppVideoStreamer_ RenderFirstFrame ======");
316 int ret = OH_LowPowerVideoSink_RenderFirstFrame(lppVideoStreamer_);
317 return ret;
318 }
319