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
16da853ecaSopenharmony_ci#include "avmuxer_demo_runner.h"
17da853ecaSopenharmony_ci#include <iostream>
18da853ecaSopenharmony_ci#include <thread>
19da853ecaSopenharmony_ci#include "avmuxer_demo.h"
20da853ecaSopenharmony_ci#include "avmuxer_ffmpeg_demo.h"
21da853ecaSopenharmony_ci#include "avmuxer_engine_demo.h"
22da853ecaSopenharmony_ci#include "native_avmuxer_demo.h"
23da853ecaSopenharmony_ci
24da853ecaSopenharmony_ciusing namespace std;
25da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
26da853ecaSopenharmony_ci
27da853ecaSopenharmony_ciconstexpr int RUN_TIME = 60000;
28da853ecaSopenharmony_ciconstexpr int DEMO_THREAD_COUNT = 10;
29da853ecaSopenharmony_ci
30da853ecaSopenharmony_cistatic int RunLoopNativeMuxer(const string &out)
31da853ecaSopenharmony_ci{
32da853ecaSopenharmony_ci    time_t startTime = 0;
33da853ecaSopenharmony_ci    time_t curTime = 0;
34da853ecaSopenharmony_ci    (void)time(&startTime);
35da853ecaSopenharmony_ci    (void)time(&curTime);
36da853ecaSopenharmony_ci    while (difftime(curTime, startTime) < RUN_TIME) {
37da853ecaSopenharmony_ci        RunNativeMuxer(out.c_str());
38da853ecaSopenharmony_ci        (void)time(&curTime);
39da853ecaSopenharmony_ci    }
40da853ecaSopenharmony_ci    return 0;
41da853ecaSopenharmony_ci}
42da853ecaSopenharmony_ci
43da853ecaSopenharmony_cistatic int RunAVMuxer()
44da853ecaSopenharmony_ci{
45da853ecaSopenharmony_ci    auto avmuxer = std::make_unique<AVMuxerDemo>();
46da853ecaSopenharmony_ci    avmuxer->RunCase();
47da853ecaSopenharmony_ci    cout << "demo avmuxer end" << endl;
48da853ecaSopenharmony_ci    return 0;
49da853ecaSopenharmony_ci}
50da853ecaSopenharmony_ci
51da853ecaSopenharmony_cistatic int RunAVMuxerWithMultithread()
52da853ecaSopenharmony_ci{
53da853ecaSopenharmony_ci    auto avmuxer = std::make_unique<AVMuxerDemo>();
54da853ecaSopenharmony_ci    avmuxer->RunMultiThreadCase();
55da853ecaSopenharmony_ci    cout << "demo multi thread avmuxer end" << endl;
56da853ecaSopenharmony_ci    return 0;
57da853ecaSopenharmony_ci}
58da853ecaSopenharmony_ci
59da853ecaSopenharmony_cistatic int RunFfmpegMuxer()
60da853ecaSopenharmony_ci{
61da853ecaSopenharmony_ci    std::unique_ptr<AVMuxerDemoBase> ffmpegMuxer = std::make_unique<AVMuxerFFmpegDemo>();
62da853ecaSopenharmony_ci    ffmpegMuxer->RunCase();
63da853ecaSopenharmony_ci    cout << "demo ffmpegMuxer end" << endl;
64da853ecaSopenharmony_ci    return 0;
65da853ecaSopenharmony_ci}
66da853ecaSopenharmony_ci
67da853ecaSopenharmony_cistatic int RunEngineMuxer()
68da853ecaSopenharmony_ci{
69da853ecaSopenharmony_ci    std::unique_ptr<AVMuxerDemoBase> muxer = std::make_unique<AVMuxerEngineDemo>();
70da853ecaSopenharmony_ci    muxer->RunCase();
71da853ecaSopenharmony_ci    cout << "demo engine demo end" << endl;
72da853ecaSopenharmony_ci    return 0;
73da853ecaSopenharmony_ci}
74da853ecaSopenharmony_ci
75da853ecaSopenharmony_cistatic int RunLoopEngineMuxer()
76da853ecaSopenharmony_ci{
77da853ecaSopenharmony_ci    time_t startTime = 0;
78da853ecaSopenharmony_ci    time_t curTime = 0;
79da853ecaSopenharmony_ci    (void)time(&startTime);
80da853ecaSopenharmony_ci    (void)time(&curTime);
81da853ecaSopenharmony_ci    while (difftime(curTime, startTime) < RUN_TIME) {
82da853ecaSopenharmony_ci        RunEngineMuxer();
83da853ecaSopenharmony_ci        (void)time(&curTime);
84da853ecaSopenharmony_ci    }
85da853ecaSopenharmony_ci    return 0;
86da853ecaSopenharmony_ci}
87da853ecaSopenharmony_ci
88da853ecaSopenharmony_civoid AVMuxerDemoCase(void)
89da853ecaSopenharmony_ci{
90da853ecaSopenharmony_ci    cout << "Please select a muxer demo(default native muxer demo): " << endl;
91da853ecaSopenharmony_ci    cout << "0:native_muxer" << endl;
92da853ecaSopenharmony_ci    cout << "1:native_muxer loop" << endl;
93da853ecaSopenharmony_ci    cout << "2:native_muxer multithread" << endl;
94da853ecaSopenharmony_ci    cout << "3:inner_muxer" << endl;
95da853ecaSopenharmony_ci    cout << "4:inner_muxer with multithread write" << endl;
96da853ecaSopenharmony_ci    cout << "5:ffmpeg_muxer" << endl;
97da853ecaSopenharmony_ci    cout << "6:engine_muxer" << endl;
98da853ecaSopenharmony_ci    cout << "7:engine_muxer loop" << endl;
99da853ecaSopenharmony_ci
100da853ecaSopenharmony_ci    string mode;
101da853ecaSopenharmony_ci    (void)getline(cin, mode);
102da853ecaSopenharmony_ci
103da853ecaSopenharmony_ci    if (mode == "0" || mode == "") {
104da853ecaSopenharmony_ci        (void)NativeSelectMode();
105da853ecaSopenharmony_ci        (void)RunNativeMuxer("native_mux");
106da853ecaSopenharmony_ci    } else if (mode == "1") {
107da853ecaSopenharmony_ci        (void)NativeSelectMode();
108da853ecaSopenharmony_ci        (void)RunLoopNativeMuxer("loop_native_mux");
109da853ecaSopenharmony_ci    } else if (mode == "2") {
110da853ecaSopenharmony_ci        (void)NativeSelectMode();
111da853ecaSopenharmony_ci        vector<thread> vecThread;
112da853ecaSopenharmony_ci        for (int i = 0; i < DEMO_THREAD_COUNT; ++i) {
113da853ecaSopenharmony_ci            string out = to_string(i + 1);
114da853ecaSopenharmony_ci            out += "_native_mux";
115da853ecaSopenharmony_ci            vecThread.push_back(thread(RunLoopNativeMuxer, out));
116da853ecaSopenharmony_ci        }
117da853ecaSopenharmony_ci        for (int i = 0; i < DEMO_THREAD_COUNT; ++i) {
118da853ecaSopenharmony_ci            vecThread[i].join();
119da853ecaSopenharmony_ci        }
120da853ecaSopenharmony_ci    } else if (mode == "3") {
121da853ecaSopenharmony_ci        (void)RunAVMuxer();
122da853ecaSopenharmony_ci    } else if (mode == "4") {
123da853ecaSopenharmony_ci        (void)RunAVMuxerWithMultithread();
124da853ecaSopenharmony_ci    } else if (mode == "5") {
125da853ecaSopenharmony_ci        (void)RunFfmpegMuxer();
126da853ecaSopenharmony_ci    } else if (mode == "6") {
127da853ecaSopenharmony_ci        (void)RunEngineMuxer();
128da853ecaSopenharmony_ci    } else if (mode == "7") {
129da853ecaSopenharmony_ci        (void)RunLoopEngineMuxer();
130da853ecaSopenharmony_ci    }
131da853ecaSopenharmony_ci}