• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023-2025 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 #ifndef VIDEO_DECODER_ADAPTER_H
17 #define VIDEO_DECODER_ADAPTER_H
18 
19 #include <shared_mutex>
20 #include <vector>
21 #include <deque>
22 #include "surface.h"
23 #include "avcodec_video_decoder.h"
24 #include "buffer/avbuffer.h"
25 #include "buffer/avbuffer_queue.h"
26 #include "buffer/avbuffer_queue_producer.h"
27 #include "osal/task/condition_variable.h"
28 #include "meta/format.h"
29 #include "video_sink.h"
30 #include "performance_utils.h"
31 
32 namespace OHOS {
33 namespace Media {
34 class VideoDecoderAdapter : public std::enable_shared_from_this<VideoDecoderAdapter> {
35 public:
36     VideoDecoderAdapter();
37     virtual ~VideoDecoderAdapter();
38 
39     Status Init(MediaAVCodec::AVCodecType type, bool isMimeType, const std::string &name);
40     Status Configure(const Format &format);
41     int32_t SetParameter(const Format &format);
42     Status Start();
43     Status Flush();
44     Status Stop();
45     Status Reset();
46     Status Release();
47     int32_t SetCallback(const std::shared_ptr<MediaAVCodec::MediaCodecCallback> &callback);
48 
49     void PrepareInputBufferQueue();
50     sptr<AVBufferQueueProducer> GetBufferQueueProducer();
51     sptr<AVBufferQueueConsumer> GetBufferQueueConsumer();
52 
53     void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
54     void OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode);
55     void OnOutputFormatChanged(const MediaAVCodec::Format &format);
56     void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
57     int32_t ReleaseOutputBuffer(uint32_t index, bool render, int64_t pts = 0);
58     int32_t RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs, int64_t pts = 0);
59     void AquireAvailableInputBuffer();
60     int32_t SetOutputSurface(sptr<Surface> videoSurface);
61     int32_t GetOutputFormat(Format &format);
62     void SetEventReceiver(const std::shared_ptr<Pipeline::EventReceiver>& receiver);
63 
64     int32_t SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
65         const bool svpFlag);
66     void OnDumpInfo(int32_t fd);
67 
68     void SetCallingInfo(int32_t appUid, int32_t appPid, std::string bundleName, uint64_t instanceId);
69     void ResetRenderTime();
70     Status SetPerfRecEnabled(bool isPerfRecEnabled);
71     void NotifyMemoryExchange(bool exchangeFlag);
72     void InitDefaultSurface();
73 
74 private:
75     void PerfRecord(const std::shared_ptr<AVBuffer> buffer);
76     int32_t ReleaseOutputBufferWithPerfRecord(uint32_t index, bool render);
77     void GetInputBufferDts(std::shared_ptr<AVBuffer> &inputBuffer);
78     void SetOutputBufferPts(std::shared_ptr<AVBuffer> &outputBuffer);
79 
80     std::shared_ptr<Media::AVBufferQueue> inputBufferQueue_;
81     sptr<Media::AVBufferQueueProducer> inputBufferQueueProducer_;
82     sptr<Media::AVBufferQueueConsumer> inputBufferQueueConsumer_;
83 
84     std::shared_ptr<MediaAVCodec::AVCodecVideoDecoder> mediaCodec_;
85     std::shared_ptr<MediaAVCodec::MediaCodecCallback> callback_;
86     std::shared_ptr<AVBuffer> buffer_;
87     std::string mediaCodecName_;
88     std::shared_ptr<Pipeline::EventReceiver> eventReceiver_ {nullptr};
89     std::mutex mutex_;
90     std::mutex dtsQueMutex_;
91     std::vector<std::shared_ptr<AVBuffer>> bufferVector_;
92     int64_t currentTime_ = 0;
93     bool isConfigured_ {false};
94     uint64_t instanceId_ = 0;
95     int32_t appUid_ = -1;
96     int32_t appPid_ = -1;
97     std::string bundleName_;
98     bool isPerfRecEnabled_ { false };
99     PerfRecorder perfRecorder_ {};
100     int32_t fileType_{0};
101     std::deque<int64_t> inputBufferDtsQue_;
102     std::atomic<bool> isRenderStarted_{false};
103     sptr<Surface> producerSurface_{nullptr};
104     sptr<Surface> consumerSurface_{nullptr};
105 };
106 
107 class VideoDecoderCallback : public OHOS::MediaAVCodec::MediaCodecCallback {
108 public:
109     explicit VideoDecoderCallback(std::shared_ptr<VideoDecoderAdapter> videoDecoder);
110     virtual ~VideoDecoderCallback();
111 
112     void OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode);
113     void OnOutputFormatChanged(const MediaAVCodec::Format &format);
114     void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
115     void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
116 
117 private:
118     std::weak_ptr<VideoDecoderAdapter> videoDecoderAdapter_;
119 };
120 } // namespace Media
121 } // namespace OHOS
122 #endif // VIDEO_DECODER_ADAPTER_H
123