1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "surface_decoder_filter.h"
17 #include "surface_encoder_filter.h"
18 #include "filter/filter_factory.h"
19 #include "surface_decoder_adapter.h"
20 #include "meta/format.h"
21 #include "common/media_core.h"
22 #include "surface/native_buffer.h"
23 #include "media_description.h"
24 #include "av_common.h"
25
26 namespace {
27 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_ONLY_PRERELEASE, LOG_DOMAIN_SYSTEM_PLAYER, "SurfaceDecoderFilter" };
28 }
29
30 namespace OHOS {
31 namespace Media {
32 namespace Pipeline {
33 static AutoRegisterFilter<SurfaceDecoderFilter> g_registerSurfaceDecoderFilter("builtin.player.surfacedecoder",
__anon796c85e10202(const std::string& name, const FilterType type) 34 FilterType::FILTERTYPE_VIDEODEC, [](const std::string& name, const FilterType type) {
35 return std::make_shared<SurfaceDecoderFilter>(name, FilterType::FILTERTYPE_VIDEODEC);
36 });
37
38 class SurfaceDecoderFilterLinkCallback : public FilterLinkCallback {
39 public:
SurfaceDecoderFilterLinkCallback(std::shared_ptr<SurfaceDecoderFilter> surfaceDecoderFilter)40 explicit SurfaceDecoderFilterLinkCallback(std::shared_ptr<SurfaceDecoderFilter> surfaceDecoderFilter)
41 : surfaceDecoderFilter_(std::move(surfaceDecoderFilter))
42 {
43 }
44
45 ~SurfaceDecoderFilterLinkCallback() = default;
46
OnLinkedResult(const sptr<AVBufferQueueProducer> & queue,std::shared_ptr<Meta> & meta)47 void OnLinkedResult(const sptr<AVBufferQueueProducer> &queue, std::shared_ptr<Meta> &meta) override
48 {
49 if (auto surfaceDecoderFilter = surfaceDecoderFilter_.lock()) {
50 surfaceDecoderFilter->OnLinkedResult(queue, meta);
51 } else {
52 MEDIA_LOG_I("invalid surfaceDecoderFilter");
53 }
54 }
55
OnUnlinkedResult(std::shared_ptr<Meta> & meta)56 void OnUnlinkedResult(std::shared_ptr<Meta> &meta) override
57 {
58 if (auto surfaceDecoderFilter = surfaceDecoderFilter_.lock()) {
59 surfaceDecoderFilter->OnUnlinkedResult(meta);
60 } else {
61 MEDIA_LOG_I("invalid surfaceDecoderFilter");
62 }
63 }
64
OnUpdatedResult(std::shared_ptr<Meta> & meta)65 void OnUpdatedResult(std::shared_ptr<Meta> &meta) override
66 {
67 if (auto surfaceDecoderFilter = surfaceDecoderFilter_.lock()) {
68 surfaceDecoderFilter->OnUpdatedResult(meta);
69 } else {
70 MEDIA_LOG_I("invalid surfaceDecoderFilter");
71 }
72 }
73 private:
74 std::weak_ptr<SurfaceDecoderFilter> surfaceDecoderFilter_;
75 };
76
77 class SurfaceDecoderAdapterCallback : public DecoderAdapterCallback {
78 public:
SurfaceDecoderAdapterCallback(std::shared_ptr<SurfaceDecoderFilter> surfaceDecoderFilter)79 explicit SurfaceDecoderAdapterCallback(std::shared_ptr<SurfaceDecoderFilter> surfaceDecoderFilter)
80 : surfaceDecoderFilter_(std::move(surfaceDecoderFilter))
81 {
82 }
83
OnError(MediaAVCodec::AVCodecErrorType type,int32_t errorCode)84 void OnError(MediaAVCodec::AVCodecErrorType type, int32_t errorCode) override
85 {
86 if (auto surfaceDecoderFilter = surfaceDecoderFilter_.lock()) {
87 surfaceDecoderFilter->OnError(type, errorCode);
88 } else {
89 MEDIA_LOG_W("invalid surfaceDecoderFilter");
90 }
91 }
92
OnOutputFormatChanged(const std::shared_ptr<Meta> & format)93 void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) override
94 {
95 }
96
OnBufferEos(int64_t pts,int64_t frameNum)97 void OnBufferEos(int64_t pts, int64_t frameNum) override
98 {
99 if (auto surfaceDecoderFilter = surfaceDecoderFilter_.lock()) {
100 surfaceDecoderFilter->NotifyNextFilterEos(pts, frameNum);
101 } else {
102 MEDIA_LOG_I("invalid surfaceDecoderFilter");
103 }
104 }
105 private:
106 std::weak_ptr<SurfaceDecoderFilter> surfaceDecoderFilter_;
107 };
108
SurfaceDecoderFilter(const std::string & name,FilterType type)109 SurfaceDecoderFilter::SurfaceDecoderFilter(const std::string& name, FilterType type): Filter(name, type)
110 {
111 MEDIA_LOG_I("surface decoder filter create");
112 }
113
~SurfaceDecoderFilter()114 SurfaceDecoderFilter::~SurfaceDecoderFilter()
115 {
116 MEDIA_LOG_I("surface decoder filter destroy");
117 }
118
OnError(MediaAVCodec::AVCodecErrorType errorType,int32_t errorCode)119 void SurfaceDecoderFilter::OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode)
120 {
121 MEDIA_LOG_E("AVCodec decoder error happened. ErrorType: %{public}d, errorCode: %{public}d",
122 static_cast<int32_t>(errorType), errorCode);
123 if (eventReceiver_ != nullptr) {
124 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_VID_DEC_FAILED});
125 }
126 }
127
Init(const std::shared_ptr<EventReceiver> & receiver,const std::shared_ptr<FilterCallback> & callback)128 void SurfaceDecoderFilter::Init(const std::shared_ptr<EventReceiver> &receiver,
129 const std::shared_ptr<FilterCallback> &callback)
130 {
131 MEDIA_LOG_I("Init");
132 eventReceiver_ = receiver;
133 filterCallback_ = callback;
134 }
135
Configure(const std::shared_ptr<Meta> & parameter)136 Status SurfaceDecoderFilter::Configure(const std::shared_ptr<Meta> ¶meter)
137 {
138 MEDIA_LOG_I("Configure");
139 if (mediaCodec_ == nullptr) {
140 MEDIA_LOG_E("mediaCodec is null");
141 return Status::ERROR_UNKNOWN;
142 }
143 configureParameter_ = parameter;
144 configFormat_.SetMeta(configureParameter_);
145 bool isHdr = false;
146 configureParameter_->GetData(Tag::VIDEO_IS_HDR_VIVID, isHdr);
147 if (isHdr) {
148 MEDIA_LOG_D("isHdr true,set video_decoder_output_colorspace, pixel_format");
149 configFormat_.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_VIDEO_DECODER_OUTPUT_COLOR_SPACE,
150 static_cast<int8_t>(OH_NativeBuffer_ColorSpace::OH_COLORSPACE_BT709_LIMIT));
151 configFormat_.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_PIXEL_FORMAT,
152 static_cast<int8_t>(MediaAVCodec::VideoPixelFormat::NV12));
153 } else {
154 MEDIA_LOG_D("isHdr false");
155 }
156 configFormat_.PutIntValue(Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE, true);
157 Status ret = mediaCodec_->Configure(configFormat_);
158 if (ret != Status::OK) {
159 MEDIA_LOG_E("mediaCodec Configure fail");
160 if (eventReceiver_ != nullptr) {
161 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
162 }
163 }
164 return ret;
165 }
166
SetOutputSurface(sptr<Surface> surface)167 Status SurfaceDecoderFilter::SetOutputSurface(sptr<Surface> surface)
168 {
169 MEDIA_LOG_I("SetOutputSurface");
170 if (mediaCodec_ == nullptr) {
171 MEDIA_LOG_E("mediaCodec is null");
172 return Status::ERROR_UNKNOWN;
173 }
174 outputSurface_ = surface;
175 Status ret = mediaCodec_->SetOutputSurface(outputSurface_);
176 if (ret != Status::OK) {
177 MEDIA_LOG_E("mediaCodec SetOutputSurface fail");
178 if (eventReceiver_ != nullptr) {
179 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
180 }
181 }
182 return ret;
183 }
184
NotifyNextFilterEos(int64_t pts,int64_t frameNum)185 Status SurfaceDecoderFilter::NotifyNextFilterEos(int64_t pts, int64_t frameNum)
186 {
187 MEDIA_LOG_I("NotifyNextFilterEos");
188 for (auto iter : nextFiltersMap_) {
189 for (auto filter : iter.second) {
190 std::shared_ptr<Meta> eosMeta = std::make_shared<Meta>();
191 eosMeta->Set<Tag::MEDIA_END_OF_STREAM>(true);
192 MEDIA_LOG_I("lastBuffer PTS: " PUBLIC_LOG_D64 " frameNum: " PUBLIC_LOG_D64, pts, frameNum);
193 eosMeta->Set<Tag::USER_FRAME_PTS>(pts);
194 eosMeta->Set<Tag::USER_PUSH_DATA_TIME>(frameNum);
195 filter->SetParameter(eosMeta);
196 }
197 }
198 return Status::OK;
199 }
200
DoPrepare()201 Status SurfaceDecoderFilter::DoPrepare()
202 {
203 MEDIA_LOG_I("Prepare");
204 if (filterCallback_ == nullptr) {
205 MEDIA_LOG_E("filterCallback is null");
206 return Status::ERROR_UNKNOWN;
207 }
208 filterCallback_->OnCallback(shared_from_this(), FilterCallBackCommand::NEXT_FILTER_NEEDED,
209 StreamType::STREAMTYPE_RAW_VIDEO);
210 return Status::OK;
211 }
212
DoStart()213 Status SurfaceDecoderFilter::DoStart()
214 {
215 MEDIA_LOG_I("Start");
216 if (mediaCodec_ == nullptr) {
217 MEDIA_LOG_E("mediaCodec is null");
218 return Status::ERROR_UNKNOWN;
219 }
220 Status ret = mediaCodec_->Start();
221 if (ret != Status::OK) {
222 MEDIA_LOG_E("mediaCodec Start fail");
223 if (eventReceiver_ != nullptr) {
224 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
225 }
226 }
227 return ret;
228 }
229
DoPause()230 Status SurfaceDecoderFilter::DoPause()
231 {
232 MEDIA_LOG_I("Pause");
233 if (mediaCodec_ == nullptr) {
234 MEDIA_LOG_E("mediaCodec is null");
235 return Status::ERROR_UNKNOWN;
236 }
237 Status ret = mediaCodec_->Pause();
238 if (ret != Status::OK) {
239 MEDIA_LOG_E("mediaCodec Pause fail");
240 if (eventReceiver_ != nullptr) {
241 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
242 }
243 }
244 return ret;
245 }
246
DoResume()247 Status SurfaceDecoderFilter::DoResume()
248 {
249 MEDIA_LOG_I("Resume");
250 if (mediaCodec_ == nullptr) {
251 MEDIA_LOG_E("mediaCodec is null");
252 return Status::ERROR_UNKNOWN;
253 }
254 Status ret = mediaCodec_->Resume();
255 if (ret != Status::OK) {
256 MEDIA_LOG_E("mediaCodec Resume fail");
257 if (eventReceiver_ != nullptr) {
258 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
259 }
260 }
261 return ret;
262 }
263
DoStop()264 Status SurfaceDecoderFilter::DoStop()
265 {
266 MEDIA_LOG_I("Stop enter");
267 if (mediaCodec_ == nullptr) {
268 return Status::OK;
269 }
270 Status ret = mediaCodec_->Stop();
271 if (ret != Status::OK) {
272 MEDIA_LOG_E("mediaCodec Stop fail");
273 if (eventReceiver_ != nullptr) {
274 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
275 }
276 return ret;
277 }
278 MEDIA_LOG_I("Stop done");
279 return Status::OK;
280 }
281
DoFlush()282 Status SurfaceDecoderFilter::DoFlush()
283 {
284 MEDIA_LOG_I("Flush");
285 return Status::OK;
286 }
287
DoRelease()288 Status SurfaceDecoderFilter::DoRelease()
289 {
290 MEDIA_LOG_I("Release");
291 return Status::OK;
292 }
293
SetParameter(const std::shared_ptr<Meta> & parameter)294 void SurfaceDecoderFilter::SetParameter(const std::shared_ptr<Meta> ¶meter)
295 {
296 MEDIA_LOG_I("SetParameter");
297 if (mediaCodec_ == nullptr) {
298 return;
299 }
300 Format format;
301 format.SetMeta(parameter);
302 auto ret = mediaCodec_->SetParameter(format);
303 if (ret != Status::OK) {
304 MEDIA_LOG_E("mediaCodec SetParameter fail");
305 if (eventReceiver_ != nullptr) {
306 eventReceiver_->OnEvent({"surface_decoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
307 }
308 }
309 }
310
GetParameter(std::shared_ptr<Meta> & parameter)311 void SurfaceDecoderFilter::GetParameter(std::shared_ptr<Meta> ¶meter)
312 {
313 MEDIA_LOG_I("GetParameter");
314 }
315
LinkNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)316 Status SurfaceDecoderFilter::LinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
317 {
318 MEDIA_LOG_I("LinkNext");
319 nextFilter_ = nextFilter;
320 nextFiltersMap_[outType].push_back(nextFilter_);
321 std::shared_ptr<FilterLinkCallback> filterLinkCallback =
322 std::make_shared<SurfaceDecoderFilterLinkCallback>(shared_from_this());
323 nextFilter->OnLinked(outType, configureParameter_, filterLinkCallback);
324 return Status::OK;
325 }
326
UpdateNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)327 Status SurfaceDecoderFilter::UpdateNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
328 {
329 MEDIA_LOG_I("UpdateNext");
330 return Status::OK;
331 }
332
UnLinkNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)333 Status SurfaceDecoderFilter::UnLinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
334 {
335 MEDIA_LOG_I("UnLinkNext");
336 return Status::OK;
337 }
338
GetFilterType()339 FilterType SurfaceDecoderFilter::GetFilterType()
340 {
341 return filterType_;
342 }
343
OnLinked(StreamType inType,const std::shared_ptr<Meta> & meta,const std::shared_ptr<FilterLinkCallback> & callback)344 Status SurfaceDecoderFilter::OnLinked(StreamType inType, const std::shared_ptr<Meta> &meta,
345 const std::shared_ptr<FilterLinkCallback> &callback)
346 {
347 MEDIA_LOG_I("OnLinked");
348 FALSE_RETURN_V_MSG(meta->GetData(Tag::MIME_TYPE, codecMimeType_),
349 Status::ERROR_INVALID_PARAMETER, "get mime failed.");
350 MEDIA_LOG_I("OnLinked enter the codecMimeType_ is %{public}s", codecMimeType_.c_str());
351 mediaCodec_ = std::make_shared<SurfaceDecoderAdapter>();
352 Status ret = mediaCodec_->Init(codecMimeType_);
353 if (ret == Status::OK) {
354 std::shared_ptr<DecoderAdapterCallback> decoderSurfaceCallback =
355 std::make_shared<SurfaceDecoderAdapterCallback>(shared_from_this());
356 mediaCodec_->SetDecoderAdapterCallback(decoderSurfaceCallback);
357 } else {
358 MEDIA_LOG_E("Init mediaCodec fail");
359 if (eventReceiver_ != nullptr) {
360 eventReceiver_->OnEvent({"surface_encoder_filter", EventType::EVENT_ERROR, MSERR_UNKNOWN});
361 }
362 }
363 meta_ = meta;
364 ret = Configure(meta);
365 if (ret != Status::OK) {
366 MEDIA_LOG_E("mediaCodec Configure fail");
367 }
368 onLinkedResultCallback_ = callback;
369 return Status::OK;
370 }
371
OnUpdated(StreamType inType,const std::shared_ptr<Meta> & meta,const std::shared_ptr<FilterLinkCallback> & callback)372 Status SurfaceDecoderFilter::OnUpdated(StreamType inType, const std::shared_ptr<Meta> &meta,
373 const std::shared_ptr<FilterLinkCallback> &callback)
374 {
375 MEDIA_LOG_I("OnUpdated");
376 return Status::OK;
377 }
378
OnUnLinked(StreamType inType,const std::shared_ptr<FilterLinkCallback> & callback)379 Status SurfaceDecoderFilter::OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback>& callback)
380 {
381 MEDIA_LOG_I("OnUnLinked");
382 return Status::OK;
383 }
384
OnLinkedResult(const sptr<AVBufferQueueProducer> & outputBufferQueue,std::shared_ptr<Meta> & meta)385 void SurfaceDecoderFilter::OnLinkedResult(const sptr<AVBufferQueueProducer> &outputBufferQueue,
386 std::shared_ptr<Meta> &meta)
387 {
388 MEDIA_LOG_I("OnLinkedResult");
389 (void) meta;
390 if (onLinkedResultCallback_) {
391 onLinkedResultCallback_->OnLinkedResult(mediaCodec_->GetInputBufferQueue(), meta_);
392 }
393 }
394
OnUpdatedResult(std::shared_ptr<Meta> & meta)395 void SurfaceDecoderFilter::OnUpdatedResult(std::shared_ptr<Meta> &meta)
396 {
397 MEDIA_LOG_I("OnUpdatedResult");
398 }
399
OnUnlinkedResult(std::shared_ptr<Meta> & meta)400 void SurfaceDecoderFilter::OnUnlinkedResult(std::shared_ptr<Meta> &meta)
401 {
402 MEDIA_LOG_I("OnUnlinkedResult");
403 (void) meta;
404 }
405 } // namespace Pipeline
406 } // namespace MEDIA
407 } // namespace OHOS
408