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 #ifndef HI_TRANSCODER_IMPL_H
17 #define HI_TRANSCODER_IMPL_H
18 
19 #include "i_transcoder_engine.h"
20 #include "transcoder_param.h"
21 #include "common/log.h"
22 #include "filter/filter_factory.h"
23 #include "osal/task/condition_variable.h"
24 #include "filter/filter.h"
25 #include "media_errors.h"
26 #include "osal/task/task.h"
27 #include "pipeline/pipeline.h"
28 #include "demuxer_filter.h"
29 #include "audio_decoder_filter.h"
30 #include "surface_decoder_filter.h"
31 #include "audio_encoder_filter.h"
32 #include "surface_encoder_filter.h"
33 #include "muxer_filter.h"
34 #include "video_resize_filter.h"
35 #include "hitranscoder_callback_looper.h"
36 
37 namespace OHOS {
38 namespace Media {
39 
40 class HiTransCoderImpl : public ITransCoderEngine {
41 public:
42     HiTransCoderImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId);
43     ~HiTransCoderImpl();
44     void SetInstanceId(uint64_t instanceId);
45     int32_t Init();
46     int32_t SetInputFile(const std::string &url);
47     int32_t SetOutputFile(const int32_t fd);
48     int32_t SetOutputFormat(OutputFormatType format);
49     int32_t SetObs(const std::weak_ptr<ITransCoderEngineObs> &obs);
50     int32_t Configure(const TransCoderParam &recParam);
51     int32_t Prepare();
52     int32_t Start();
53     int32_t Pause();
54     int32_t Resume();
55     int32_t Cancel();
56     void OnEvent(const Event &event);
57     void OnCallback(std::shared_ptr<Pipeline::Filter> filter, const Pipeline::FilterCallBackCommand cmd,
58         Pipeline::StreamType outType);
59     int32_t GetCurrentTime(int32_t& currentPositionMs);
60     int32_t GetDuration(int32_t& durationMs);
61 
62 private:
63     void AppendTranscoderMediaInfo();
64     void AppendSrcMediaInfo(std::shared_ptr<Meta> meta);
65     void AppendDstMediaInfo(std::shared_ptr<Meta> meta);
66     int32_t GetRealPath(const std::string &url, std::string &realUrlPath) const;
67     Status ConfigureVideoEncoderFormat(const TransCoderParam &transCoderParam);
68     Status LinkAudioDecoderFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
69     Status LinkAudioEncoderFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
70     Status LinkVideoDecoderFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
71     Status LinkVideoEncoderFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
72     Status LinkVideoResizeFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
73     Status LinkMuxerFilter(const std::shared_ptr<Pipeline::Filter>& preFilter, Pipeline::StreamType type);
74     void CancelTransCoder();
75     void HandleErrorEvent(int32_t errorCode);
76     Status ConfigureVideoAudioMetaData();
77     Status ConfigureMetaData(const std::vector<std::shared_ptr<Meta>> &trackInfos);
78     Status SetTrackMime(const std::vector<std::shared_ptr<Meta>> &trackInfos);
79     Status ConfigureVideoWidthHeight(const TransCoderParam &transCoderParam);
80     Status ConfigureVideoBitrate();
81     Status ConfigureInputVideoMetaData(const std::vector<std::shared_ptr<Meta>> &trackInfos, const size_t &index);
82     bool SetValueByType(const std::shared_ptr<Meta> &innerMeta, std::shared_ptr<Meta> &outputMeta);
83     bool ProcessMetaKey(
84         const std::shared_ptr<Meta> &innerMeta, std::shared_ptr<Meta> &outputMeta, const std::string &metaKey);
85     void ConfigureMetaDataToTrackFormat(const std::shared_ptr<Meta> &globalInfo,
86         const std::vector<std::shared_ptr<Meta>> &trackInfos);
87     int64_t GetCurrentMillisecond();
88     void CollectionErrorInfo(int32_t errCode, const std::string& errMsg);
89 
90     int32_t appUid_{0};
91     int32_t appPid_{0};
92     int32_t appTokenId_{0};
93     int64_t appFullTokenId_{0};
94 
95     std::shared_ptr<Pipeline::Pipeline> pipeline_;
96     std::shared_ptr<Pipeline::DemuxerFilter> demuxerFilter_;
97     std::shared_ptr<Pipeline::AudioDecoderFilter> audioDecoderFilter_;
98     std::shared_ptr<Pipeline::SurfaceDecoderFilter> videoDecoderFilter_;
99     std::shared_ptr<Pipeline::AudioEncoderFilter> audioEncoderFilter_;
100     std::shared_ptr<Pipeline::SurfaceEncoderFilter> videoEncoderFilter_;
101     std::shared_ptr<Pipeline::VideoResizeFilter> videoResizeFilter_;
102     std::shared_ptr<Pipeline::MuxerFilter> muxerFilter_;
103 
104     std::shared_ptr<Pipeline::EventReceiver> transCoderEventReceiver_;
105     std::shared_ptr<Pipeline::FilterCallback> transCoderFilterCallback_;
106 
107     std::shared_ptr<Task> cancelTask_{nullptr};
108     std::shared_ptr<Task> pauseTask_{nullptr};
109 
110     std::shared_ptr<Meta> audioEncFormat_ = std::make_shared<Meta>();
111     std::shared_ptr<Meta> videoEncFormat_ = std::make_shared<Meta>();
112     std::shared_ptr<Meta> muxerFormat_ = std::make_shared<Meta>();
113     std::shared_ptr<Meta> srcVideoFormat_ = std::make_shared<Meta>();
114     std::shared_ptr<Meta> srcAudioFormat_ = std::make_shared<Meta>();
115 
116     std::weak_ptr<ITransCoderEngineObs> obs_{};
117     std::shared_ptr<HiTransCoderCallbackLooper> callbackLooper_;
118     OutputFormatType outputFormatType_{OutputFormatType::FORMAT_BUTT};
119     int32_t fd_ = -1;
120     std::string inputFile_;
121 
122     std::string transCoderId_;
123     int32_t inputVideoWidth_ = 0;
124     int32_t inputVideoHeight_ = 0;
125     bool isExistVideoTrack_ = false;
126     bool isNeedVideoResizeFilter_ = false;
127     std::atomic<int32_t> durationMs_{-1};
128 
129     uint64_t instanceId_ = 0;
130     int64_t startTime_ = 0;
131     int64_t transcoderTotalDuration_ = 0;
132     int32_t errCode_ = 0;
133     std::string errMsg_ = "success";
134 };
135 } // namespace MEDIA
136 } // namespace OHOS
137 #endif // HI_RECORDER_IMPL_H