1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2022 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 "AVMuxerDemo.h"
17da853ecaSopenharmony_ci#include <iostream>
18da853ecaSopenharmony_ci#include <fstream>
19da853ecaSopenharmony_ci#include <cstdio>
20da853ecaSopenharmony_ci#include <unistd.h>
21da853ecaSopenharmony_ci#include <fcntl.h>
22da853ecaSopenharmony_ci#include <dlfcn.h>
23da853ecaSopenharmony_ci
24da853ecaSopenharmony_ciusing namespace OHOS;
25da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
26da853ecaSopenharmony_ciusing namespace OHOS::Media;
27da853ecaSopenharmony_ciusing namespace std;
28da853ecaSopenharmony_ciusing namespace Plugins;
29da853ecaSopenharmony_ci
30da853ecaSopenharmony_ciint32_t AVMuxerDemo::GetFdByMode(OH_AVOutputFormat format)
31da853ecaSopenharmony_ci{
32da853ecaSopenharmony_ci    if (format == AV_OUTPUT_FORMAT_MPEG_4) {
33da853ecaSopenharmony_ci        filename = "output.mp4";
34da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_M4A) {
35da853ecaSopenharmony_ci        filename = "output.m4a";
36da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_AMR) {
37da853ecaSopenharmony_ci        filename = "output.amr";
38da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_MP3) {
39da853ecaSopenharmony_ci        filename = "output.mp3";
40da853ecaSopenharmony_ci    } else {
41da853ecaSopenharmony_ci        filename = "output.bin";
42da853ecaSopenharmony_ci    }
43da853ecaSopenharmony_ci    int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
44da853ecaSopenharmony_ci    if (fd < 0) {
45da853ecaSopenharmony_ci        std::cout << "Open file failed! filePath is: " << filename << std::endl;
46da853ecaSopenharmony_ci        return -1;
47da853ecaSopenharmony_ci    }
48da853ecaSopenharmony_ci    return fd;
49da853ecaSopenharmony_ci}
50da853ecaSopenharmony_ci
51da853ecaSopenharmony_ciint32_t AVMuxerDemo::GetErrorFd()
52da853ecaSopenharmony_ci{
53da853ecaSopenharmony_ci    filename = "output.bin";
54da853ecaSopenharmony_ci    int32_t fd = open(filename.c_str(), O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR);
55da853ecaSopenharmony_ci    if (fd < 0) {
56da853ecaSopenharmony_ci        std::cout << "Open file failed! filePath is: " << filename << std::endl;
57da853ecaSopenharmony_ci        return -1;
58da853ecaSopenharmony_ci    }
59da853ecaSopenharmony_ci    return fd;
60da853ecaSopenharmony_ci}
61da853ecaSopenharmony_ci
62da853ecaSopenharmony_ciint32_t AVMuxerDemo::GetFdByName(OH_AVOutputFormat format, string fileName)
63da853ecaSopenharmony_ci{
64da853ecaSopenharmony_ci    if (format == AV_OUTPUT_FORMAT_MPEG_4) {
65da853ecaSopenharmony_ci        filename = fileName + ".mp4";
66da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_M4A) {
67da853ecaSopenharmony_ci        filename = fileName + ".m4a";
68da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_AMR) {
69da853ecaSopenharmony_ci        filename = fileName + ".amr";
70da853ecaSopenharmony_ci    } else if (format == AV_OUTPUT_FORMAT_MP3) {
71da853ecaSopenharmony_ci        filename = fileName + ".mp3";
72da853ecaSopenharmony_ci    } else {
73da853ecaSopenharmony_ci        filename = fileName + ".bin";
74da853ecaSopenharmony_ci    }
75da853ecaSopenharmony_ci    int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
76da853ecaSopenharmony_ci    if (fd < 0) {
77da853ecaSopenharmony_ci        std::cout << "Open file failed! filePath is: " << filename << std::endl;
78da853ecaSopenharmony_ci        return -1;
79da853ecaSopenharmony_ci    }
80da853ecaSopenharmony_ci    return fd;
81da853ecaSopenharmony_ci}
82da853ecaSopenharmony_ci
83da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerGetFdByMode(OutputFormat format)
84da853ecaSopenharmony_ci{
85da853ecaSopenharmony_ci    if (format == OutputFormat::MPEG_4) {
86da853ecaSopenharmony_ci        filename = "output.mp4";
87da853ecaSopenharmony_ci    } else if (format == OutputFormat::M4A) {
88da853ecaSopenharmony_ci        filename = "output.m4a";
89da853ecaSopenharmony_ci    } else {
90da853ecaSopenharmony_ci        filename = "output.bin";
91da853ecaSopenharmony_ci    }
92da853ecaSopenharmony_ci    int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
93da853ecaSopenharmony_ci    if (fd < 0) {
94da853ecaSopenharmony_ci        std::cout << "Open file failed! filePath is: " << filename << std::endl;
95da853ecaSopenharmony_ci        return -1;
96da853ecaSopenharmony_ci    }
97da853ecaSopenharmony_ci    return fd;
98da853ecaSopenharmony_ci}
99da853ecaSopenharmony_ci
100da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerGetFdByName(OutputFormat format, string fileName)
101da853ecaSopenharmony_ci{
102da853ecaSopenharmony_ci    if (format == OutputFormat::MPEG_4) {
103da853ecaSopenharmony_ci        filename = fileName + ".mp4";
104da853ecaSopenharmony_ci    } else if (format == OutputFormat::M4A) {
105da853ecaSopenharmony_ci        filename = fileName + ".m4a";
106da853ecaSopenharmony_ci    } else {
107da853ecaSopenharmony_ci        filename = fileName + ".bin";
108da853ecaSopenharmony_ci    }
109da853ecaSopenharmony_ci    int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
110da853ecaSopenharmony_ci    if (fd < 0) {
111da853ecaSopenharmony_ci        std::cout << "Open file failed! filePath is: " << filename << std::endl;
112da853ecaSopenharmony_ci        return -1;
113da853ecaSopenharmony_ci    }
114da853ecaSopenharmony_ci    return fd;
115da853ecaSopenharmony_ci}
116da853ecaSopenharmony_ciOH_AVMuxer* AVMuxerDemo::NativeCreate(int32_t fd, OH_AVOutputFormat format)
117da853ecaSopenharmony_ci{
118da853ecaSopenharmony_ci    return OH_AVMuxer_Create(fd, format);
119da853ecaSopenharmony_ci}
120da853ecaSopenharmony_ci
121da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeSetRotation(OH_AVMuxer* muxer, int32_t rotation)
122da853ecaSopenharmony_ci{
123da853ecaSopenharmony_ci    return OH_AVMuxer_SetRotation(muxer, rotation);
124da853ecaSopenharmony_ci}
125da853ecaSopenharmony_ci
126da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeAddTrack(OH_AVMuxer* muxer, int32_t* trackIndex, OH_AVFormat* trackFormat)
127da853ecaSopenharmony_ci{
128da853ecaSopenharmony_ci    return OH_AVMuxer_AddTrack(muxer, trackIndex, trackFormat);
129da853ecaSopenharmony_ci}
130da853ecaSopenharmony_ci
131da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeStart(OH_AVMuxer* muxer)
132da853ecaSopenharmony_ci{
133da853ecaSopenharmony_ci    return OH_AVMuxer_Start(muxer);
134da853ecaSopenharmony_ci}
135da853ecaSopenharmony_ci
136da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex,
137da853ecaSopenharmony_ci    OH_AVMemory* sampleBuffer, OH_AVCodecBufferAttr info)
138da853ecaSopenharmony_ci{
139da853ecaSopenharmony_ci    return OH_AVMuxer_WriteSample(muxer, trackIndex, sampleBuffer, info);
140da853ecaSopenharmony_ci}
141da853ecaSopenharmony_ci
142da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex,
143da853ecaSopenharmony_ci    OH_AVBuffer* sampleBuffer)
144da853ecaSopenharmony_ci{
145da853ecaSopenharmony_ci    return OH_AVMuxer_WriteSampleBuffer(muxer, trackIndex, sampleBuffer);
146da853ecaSopenharmony_ci}
147da853ecaSopenharmony_ci
148da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeStop(OH_AVMuxer* muxer)
149da853ecaSopenharmony_ci{
150da853ecaSopenharmony_ci    return OH_AVMuxer_Stop(muxer);
151da853ecaSopenharmony_ci}
152da853ecaSopenharmony_ci
153da853ecaSopenharmony_ciOH_AVErrCode AVMuxerDemo::NativeDestroy(OH_AVMuxer* muxer)
154da853ecaSopenharmony_ci{
155da853ecaSopenharmony_ci    return OH_AVMuxer_Destroy(muxer);
156da853ecaSopenharmony_ci}
157da853ecaSopenharmony_ci
158da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerCreate(int32_t fd, OutputFormat format)
159da853ecaSopenharmony_ci{
160da853ecaSopenharmony_ci    cout << "InnerCreate" << endl;
161da853ecaSopenharmony_ci    avmuxer_ = AVMuxerFactory::CreateAVMuxer(fd, format);
162da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
163da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
164da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
165da853ecaSopenharmony_ci    }
166da853ecaSopenharmony_ci    return AV_ERR_OK;
167da853ecaSopenharmony_ci}
168da853ecaSopenharmony_ci
169da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerSetRotation(int32_t rotation)
170da853ecaSopenharmony_ci{
171da853ecaSopenharmony_ci    cout << "InnerSetRotation" << endl;
172da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
173da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
174da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
175da853ecaSopenharmony_ci    }
176da853ecaSopenharmony_ci    std::shared_ptr<Meta> param = std::make_shared<Meta>();
177da853ecaSopenharmony_ci    param->Set<Tag::VIDEO_ROTATION>(static_cast<Plugins::VideoRotation>(rotation));
178da853ecaSopenharmony_ci    return avmuxer_->SetParameter(param);
179da853ecaSopenharmony_ci}
180da853ecaSopenharmony_ci
181da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerAddTrack(int32_t& trackIndex, std::shared_ptr<Meta> trackDesc)
182da853ecaSopenharmony_ci{
183da853ecaSopenharmony_ci    cout << "InnerAddTrack" << endl;
184da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
185da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
186da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
187da853ecaSopenharmony_ci    }
188da853ecaSopenharmony_ci    return avmuxer_->AddTrack(trackIndex, trackDesc);
189da853ecaSopenharmony_ci}
190da853ecaSopenharmony_ci
191da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerStart()
192da853ecaSopenharmony_ci{
193da853ecaSopenharmony_ci    cout << "InnerStart" << endl;
194da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
195da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
196da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
197da853ecaSopenharmony_ci    }
198da853ecaSopenharmony_ci    return avmuxer_->Start();
199da853ecaSopenharmony_ci}
200da853ecaSopenharmony_ci
201da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerWriteSample(uint32_t trackIndex, std::shared_ptr<AVBuffer> sample)
202da853ecaSopenharmony_ci{
203da853ecaSopenharmony_ci    cout << "InnerWriteSample" << endl;
204da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
205da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
206da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
207da853ecaSopenharmony_ci    }
208da853ecaSopenharmony_ci    return avmuxer_->WriteSample(trackIndex, sample);
209da853ecaSopenharmony_ci}
210da853ecaSopenharmony_ci
211da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerStop()
212da853ecaSopenharmony_ci{
213da853ecaSopenharmony_ci    cout << "InnerStop" << endl;
214da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
215da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
216da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
217da853ecaSopenharmony_ci    }
218da853ecaSopenharmony_ci    return avmuxer_->Stop();
219da853ecaSopenharmony_ci}
220da853ecaSopenharmony_ci
221da853ecaSopenharmony_ciint32_t AVMuxerDemo::InnerDestroy()
222da853ecaSopenharmony_ci{
223da853ecaSopenharmony_ci    cout << "InnerDestroy" << endl;
224da853ecaSopenharmony_ci    if (avmuxer_ == nullptr) {
225da853ecaSopenharmony_ci        std::cout << "InnerMuxer create failed!" << std::endl;
226da853ecaSopenharmony_ci        return AVCS_ERR_NO_MEMORY;
227da853ecaSopenharmony_ci    }
228da853ecaSopenharmony_ci    avmuxer_->~AVMuxer();
229da853ecaSopenharmony_ci    avmuxer_ = nullptr;
230da853ecaSopenharmony_ci    return AV_ERR_OK;
231da853ecaSopenharmony_ci}
232