• 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);
58     int32_t RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs);
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, const std::string& bundleName, uint64_t instanceId);
69     void ResetRenderTime();
70     Status SetPerfRecEnabled(bool isPerfRecEnabled);
71 
72 private:
73     void PerfRecord(const std::shared_ptr<AVBuffer> buffer);
74     int32_t ReleaseOutputBufferWithPerfRecord(uint32_t index, bool render);
75     void GetInputBufferDts(std::shared_ptr<AVBuffer> &inputBuffer);
76     void SetOutputBufferPts(std::shared_ptr<AVBuffer> &outputBuffer);
77 
78     std::shared_ptr<Media::AVBufferQueue> inputBufferQueue_;
79     sptr<Media::AVBufferQueueProducer> inputBufferQueueProducer_;
80     sptr<Media::AVBufferQueueConsumer> inputBufferQueueConsumer_;
81 
82     std::shared_ptr<MediaAVCodec::AVCodecVideoDecoder> mediaCodec_;
83     std::shared_ptr<MediaAVCodec::MediaCodecCallback> callback_;
84     std::shared_ptr<AVBuffer> buffer_;
85     std::string mediaCodecName_;
86     std::shared_ptr<Pipeline::EventReceiver> eventReceiver_ {nullptr};
87     std::mutex mutex_;
88     std::mutex dtsQueMutex_;
89     std::vector<std::shared_ptr<AVBuffer>> bufferVector_;
90     int64_t currentTime_ = 0;
91     bool isConfigured_ {false};
92     uint64_t instanceId_ = 0;
93     int32_t appUid_ = -1;
94     int32_t appPid_ = -1;
95     std::string bundleName_;
96     bool isPerfRecEnabled_ { false };
97     PerfRecorder perfRecorder_ {};
98     int32_t fileType_{0};
99     std::deque<int64_t> inputBufferDtsQue_;
100 };
101 
102 class VideoDecoderCallback : public OHOS::MediaAVCodec::MediaCodecCallback {
103 public:
104     explicit VideoDecoderCallback(std::shared_ptr<VideoDecoderAdapter> videoDecoder);
105     virtual ~VideoDecoderCallback();
106 
107     void OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode);
108     void OnOutputFormatChanged(const MediaAVCodec::Format &format);
109     void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
110     void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
111 
112 private:
113     std::weak_ptr<VideoDecoderAdapter> videoDecoderAdapter_;
114 };
115 } // namespace Media
116 } // namespace OHOS
117 #endif // VIDEO_DECODER_ADAPTER_H
118