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}