1 /*
2 * Copyright (C) 2023 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 #include "avmuxer_engine_demo.h"
17 #include <iostream>
18 #include <fstream>
19 #include <cstdio>
20 #include <unistd.h>
21 #include <fcntl.h>
22 #include <thread>
23 #include <vector>
24
25 namespace OHOS {
26 namespace MediaAVCodec {
DoWriteSample(uint32_t trackIndex,std::shared_ptr<AVBuffer> sample)27 int AVMuxerEngineDemo::DoWriteSample(uint32_t trackIndex, std::shared_ptr<AVBuffer> sample)
28 {
29 if (avmuxer_ != nullptr &&
30 avmuxer_->WriteSample(trackIndex, sample) == Status::OK) {
31 return 0;
32 }
33 return -1;
34 }
35
DoAddTrack(int32_t & trackIndex,std::shared_ptr<Meta> trackDesc)36 int AVMuxerEngineDemo::DoAddTrack(int32_t &trackIndex, std::shared_ptr<Meta> trackDesc)
37 {
38 Status ret;
39 if ((ret = avmuxer_->AddTrack(trackIndex, trackDesc)) != Status::OK) {
40 std::cout<<"AVMuxerEngineDemo::DoAddTrack failed! ret:"<<static_cast<int32_t>(ret)<<std::endl;
41 return -1;
42 }
43 return 0;
44 }
45
DoGetInputBufferQueue(uint32_t trackIndex)46 sptr<AVBufferQueueProducer> AVMuxerEngineDemo::DoGetInputBufferQueue(uint32_t trackIndex)
47 {
48 std::cout<<"AVMuxerEngineDemo::DoGetInputBufferQueue "<<trackIndex<<std::endl;
49 return avmuxer_->GetInputBufferQueue(trackIndex);
50 }
51
DoRunMuxer(const std::string & runMode)52 void AVMuxerEngineDemo::DoRunMuxer(const std::string &runMode)
53 {
54 std::string outFileName = GetOutputFileName("engine_mux_" + runMode);
55 outFd_ = open(outFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
56 if (outFd_ < 0) {
57 std::cout << "Open file failed! filePath is: " << outFileName << std::endl;
58 return;
59 }
60 std::cout<<"==== open success! =====\noutputFileName: "<<outFileName<<"\n============"<<std::endl;
61 long long testTimeStart = GetTimestamp();
62 avmuxer_ = std::make_shared<MediaMuxer>(-1, -1);
63 if (avmuxer_ == nullptr || avmuxer_->Init(outFd_, outputFormat_) != Status::OK) {
64 std::cout << "avmuxer_ is null" << std::endl;
65 return;
66 }
67
68 std::cout << "create muxer success " << avmuxer_ << std::endl;
69
70 SetParameter();
71 AddAudioTrack(audioParams_);
72 AddVideoTrack(videoParams_);
73 AddCoverTrack(coverParams_);
74
75 std::cout << "add track success" << std::endl;
76
77 if (avmuxer_->Start() != Status::OK) {
78 return;
79 }
80
81 std::cout << "start muxer success" << std::endl;
82
83 WriteCoverSample();
84
85 std::cout<<"AVMuxerEngineDemo::DoRunMuxer runMode is : "<<runMode<<std::endl;
86 if (runMode.compare(RUN_NORMAL) == 0) {
87 WriteTrackSampleByBufferQueue();
88 } else if (runMode.compare(RUN_MUL_THREAD) == 0) {
89 std::vector<std::thread> vecThread;
90 vecThread.emplace_back(MulThdWriteTrackSampleByBufferQueue, this, audioBufferQueue_, audioFile_);
91 vecThread.emplace_back(MulThdWriteTrackSampleByBufferQueue, this, videoBufferQueue_, videoFile_);
92 for (uint32_t i = 0; i < vecThread.size(); ++i) {
93 vecThread[i].join();
94 }
95 }
96
97 std::cout << "write muxer success" << std::endl;
98
99 if (avmuxer_->Stop() != Status::OK) {
100 return;
101 }
102 std::cout << "stop muxer success" << std::endl;
103 long long testTimeEnd = GetTimestamp();
104 std::cout << "muxer used time: " << testTimeEnd - testTimeStart << "us" << std::endl;
105 }
106
DoRunMuxer()107 void AVMuxerEngineDemo::DoRunMuxer()
108 {
109 DoRunMuxer(std::string(RUN_NORMAL));
110 }
111
DoRunMultiThreadCase()112 void AVMuxerEngineDemo::DoRunMultiThreadCase()
113 {
114 DoRunMuxer(std::string(RUN_MUL_THREAD));
115 }
116
SetParameter()117 void AVMuxerEngineDemo::SetParameter()
118 {
119 std::shared_ptr<Meta> param = std::make_shared<Meta>();
120 param->Set<Tag::VIDEO_ROTATION>(Plugins::VideoRotation::VIDEO_ROTATION_0);
121 param->Set<Tag::MEDIA_CREATION_TIME>("2023-12-19T03:16:00.000Z");
122 param->Set<Tag::MEDIA_LATITUDE>(22.67f);
123 param->Set<Tag::MEDIA_LONGITUDE>(114.06f);
124 param->Set<Tag::MEDIA_TITLE>("ohos muxer");
125 param->Set<Tag::MEDIA_ARTIST>("ohos muxer");
126 param->Set<Tag::MEDIA_COMPOSER>("ohos muxer");
127 param->Set<Tag::MEDIA_DATE>("2023-12-19");
128 param->Set<Tag::MEDIA_ALBUM>("ohos muxer");
129 param->Set<Tag::MEDIA_ALBUM_ARTIST>("ohos muxer");
130 param->Set<Tag::MEDIA_COPYRIGHT>("ohos muxer");
131 if (avmuxer_->SetParameter(param) != Status::OK) {
132 std::cout<<"set parameter failed!"<<std::endl;
133 }
134 }
135 } // namespace MediaAVCodec
136 } // namespace OHOS