• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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