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