1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci#ifndef AVMUXER_DEMO_BASE
16da853ecaSopenharmony_ci#define AVMUXER_DEMO_BASE
17da853ecaSopenharmony_ci
18da853ecaSopenharmony_ci#include "avmuxer.h"
19da853ecaSopenharmony_ci#include "avmuxer_demo_common.h"
20da853ecaSopenharmony_ci
21da853ecaSopenharmony_cinamespace OHOS {
22da853ecaSopenharmony_cinamespace MediaAVCodec {
23da853ecaSopenharmony_ciclass AVMuxerDemoBase {
24da853ecaSopenharmony_cipublic:
25da853ecaSopenharmony_ci    AVMuxerDemoBase();
26da853ecaSopenharmony_ci    virtual ~AVMuxerDemoBase() = default;
27da853ecaSopenharmony_ci    void RunCase();
28da853ecaSopenharmony_ci    void RunMultiThreadCase();
29da853ecaSopenharmony_ci    std::string GetOutputFileName(std::string header);
30da853ecaSopenharmony_ci
31da853ecaSopenharmony_ciprotected:
32da853ecaSopenharmony_ci    virtual void DoRunMuxer() = 0;
33da853ecaSopenharmony_ci    virtual void DoRunMultiThreadCase()= 0;
34da853ecaSopenharmony_ci    virtual int DoWriteSample(uint32_t trackIndex, std::shared_ptr<AVBuffer> sample) = 0;
35da853ecaSopenharmony_ci    virtual int DoAddTrack(int32_t &trackIndex, std::shared_ptr<Meta> trackDesc) = 0;
36da853ecaSopenharmony_ci    virtual sptr<AVBufferQueueProducer> DoGetInputBufferQueue(uint32_t trackIndex) { return nullptr; };
37da853ecaSopenharmony_ci    int AddVideoTrack(const VideoTrackParam *param);
38da853ecaSopenharmony_ci    int AddAudioTrack(const AudioTrackParam *param);
39da853ecaSopenharmony_ci    int AddCoverTrack(const VideoTrackParam *param);
40da853ecaSopenharmony_ci    void WriteTrackSample();
41da853ecaSopenharmony_ci    void WriteAvTrackSample();
42da853ecaSopenharmony_ci    void WriteSingleTrackSample(uint32_t trackId, std::shared_ptr<std::ifstream> file);
43da853ecaSopenharmony_ci    void WriteCoverSample();
44da853ecaSopenharmony_ci    void WriteTrackSampleByBufferQueue();
45da853ecaSopenharmony_ci    void WriteAvTrackSampleByBufferQueue();
46da853ecaSopenharmony_ci    void WriteSingleTrackSampleByBufferQueue(sptr<AVBufferQueueProducer> bufferQueue,
47da853ecaSopenharmony_ci        std::shared_ptr<std::ifstream> file);
48da853ecaSopenharmony_ci    void SelectFormatMode();
49da853ecaSopenharmony_ci    void SelectAudioMode();
50da853ecaSopenharmony_ci    void SelectVideoMode();
51da853ecaSopenharmony_ci    void SelectCoverMode();
52da853ecaSopenharmony_ci    int SelectMode();
53da853ecaSopenharmony_ci    int SelectModeAndOpenFile();
54da853ecaSopenharmony_ci    bool ReadSampleDataInfo(std::shared_ptr<std::ifstream> file, std::shared_ptr<AVBuffer> &buffer);
55da853ecaSopenharmony_ci    bool ReadSampleDataInfoByBufferQueue(std::shared_ptr<std::ifstream> file, std::shared_ptr<AVBuffer> &buffer,
56da853ecaSopenharmony_ci        sptr<AVBufferQueueProducer> bufferQueue);
57da853ecaSopenharmony_ci    void Reset();
58da853ecaSopenharmony_ci    static void MulThdWriteTrackSample(AVMuxerDemoBase *muxerBase, uint32_t trackId,
59da853ecaSopenharmony_ci        std::shared_ptr<std::ifstream> file);
60da853ecaSopenharmony_ci    static void MulThdWriteTrackSampleByBufferQueue(AVMuxerDemoBase *muxerBase,
61da853ecaSopenharmony_ci        sptr<AVBufferQueueProducer> bufferQueue, std::shared_ptr<std::ifstream> file);
62da853ecaSopenharmony_ci
63da853ecaSopenharmony_ci    const static AudioTrackParam *audioParams_;
64da853ecaSopenharmony_ci    const static VideoTrackParam *videoParams_;
65da853ecaSopenharmony_ci    const static VideoTrackParam *coverParams_;
66da853ecaSopenharmony_ci    static std::string videoType_;
67da853ecaSopenharmony_ci    static std::string audioType_;
68da853ecaSopenharmony_ci    static std::string coverType_;
69da853ecaSopenharmony_ci    static std::string format_;
70da853ecaSopenharmony_ci    static Plugins::OutputFormat outputFormat_;
71da853ecaSopenharmony_ci    static bool hasSetMode_;
72da853ecaSopenharmony_ci
73da853ecaSopenharmony_ci    int32_t videoTrackId_ {-1};
74da853ecaSopenharmony_ci    int32_t audioTrackId_ {-1};
75da853ecaSopenharmony_ci    int32_t coverTrackId_ {-1};
76da853ecaSopenharmony_ci    sptr<AVBufferQueueProducer> videoBufferQueue_ {nullptr};
77da853ecaSopenharmony_ci    sptr<AVBufferQueueProducer> audioBufferQueue_ {nullptr};
78da853ecaSopenharmony_ci    sptr<AVBufferQueueProducer> coverBufferQueue_ {nullptr};
79da853ecaSopenharmony_ci    std::shared_ptr<std::ifstream> audioFile_ {nullptr};
80da853ecaSopenharmony_ci    std::shared_ptr<std::ifstream> videoFile_ {nullptr};
81da853ecaSopenharmony_ci    std::shared_ptr<std::ifstream> coverFile_ {nullptr};
82da853ecaSopenharmony_ci    int32_t outFd_ {-1};
83da853ecaSopenharmony_ci    int64_t audioPts_ {0};
84da853ecaSopenharmony_ci    int64_t videoPts_ {0};
85da853ecaSopenharmony_ci};
86da853ecaSopenharmony_ci} // MediaAVCodec
87da853ecaSopenharmony_ci} // OHOS
88da853ecaSopenharmony_ci#endif