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