/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AVMuxerDemo.h" #include #include #include #include #include #include using namespace OHOS; using namespace OHOS::MediaAVCodec; using namespace OHOS::Media; using namespace std; using namespace Plugins; int32_t AVMuxerDemo::GetFdByMode(OH_AVOutputFormat format) { if (format == AV_OUTPUT_FORMAT_MPEG_4) { filename = "output.mp4"; } else if (format == AV_OUTPUT_FORMAT_M4A) { filename = "output.m4a"; } else if (format == AV_OUTPUT_FORMAT_AMR) { filename = "output.amr"; } else if (format == AV_OUTPUT_FORMAT_MP3) { filename = "output.mp3"; } else { filename = "output.bin"; } int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { std::cout << "Open file failed! filePath is: " << filename << std::endl; return -1; } return fd; } int32_t AVMuxerDemo::GetErrorFd() { filename = "output.bin"; int32_t fd = open(filename.c_str(), O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR); if (fd < 0) { std::cout << "Open file failed! filePath is: " << filename << std::endl; return -1; } return fd; } int32_t AVMuxerDemo::GetFdByName(OH_AVOutputFormat format, string fileName) { if (format == AV_OUTPUT_FORMAT_MPEG_4) { filename = fileName + ".mp4"; } else if (format == AV_OUTPUT_FORMAT_M4A) { filename = fileName + ".m4a"; } else if (format == AV_OUTPUT_FORMAT_AMR) { filename = fileName + ".amr"; } else if (format == AV_OUTPUT_FORMAT_MP3) { filename = fileName + ".mp3"; } else { filename = fileName + ".bin"; } int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { std::cout << "Open file failed! filePath is: " << filename << std::endl; return -1; } return fd; } int32_t AVMuxerDemo::InnerGetFdByMode(OutputFormat format) { if (format == OutputFormat::MPEG_4) { filename = "output.mp4"; } else if (format == OutputFormat::M4A) { filename = "output.m4a"; } else { filename = "output.bin"; } int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { std::cout << "Open file failed! filePath is: " << filename << std::endl; return -1; } return fd; } int32_t AVMuxerDemo::InnerGetFdByName(OutputFormat format, string fileName) { if (format == OutputFormat::MPEG_4) { filename = fileName + ".mp4"; } else if (format == OutputFormat::M4A) { filename = fileName + ".m4a"; } else { filename = fileName + ".bin"; } int32_t fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { std::cout << "Open file failed! filePath is: " << filename << std::endl; return -1; } return fd; } OH_AVMuxer* AVMuxerDemo::NativeCreate(int32_t fd, OH_AVOutputFormat format) { return OH_AVMuxer_Create(fd, format); } OH_AVErrCode AVMuxerDemo::NativeSetRotation(OH_AVMuxer* muxer, int32_t rotation) { return OH_AVMuxer_SetRotation(muxer, rotation); } OH_AVErrCode AVMuxerDemo::NativeAddTrack(OH_AVMuxer* muxer, int32_t* trackIndex, OH_AVFormat* trackFormat) { return OH_AVMuxer_AddTrack(muxer, trackIndex, trackFormat); } OH_AVErrCode AVMuxerDemo::NativeStart(OH_AVMuxer* muxer) { return OH_AVMuxer_Start(muxer); } OH_AVErrCode AVMuxerDemo::NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex, OH_AVMemory* sampleBuffer, OH_AVCodecBufferAttr info) { return OH_AVMuxer_WriteSample(muxer, trackIndex, sampleBuffer, info); } OH_AVErrCode AVMuxerDemo::NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex, OH_AVBuffer* sampleBuffer) { return OH_AVMuxer_WriteSampleBuffer(muxer, trackIndex, sampleBuffer); } OH_AVErrCode AVMuxerDemo::NativeStop(OH_AVMuxer* muxer) { return OH_AVMuxer_Stop(muxer); } OH_AVErrCode AVMuxerDemo::NativeDestroy(OH_AVMuxer* muxer) { return OH_AVMuxer_Destroy(muxer); } int32_t AVMuxerDemo::InnerCreate(int32_t fd, OutputFormat format) { cout << "InnerCreate" << endl; avmuxer_ = AVMuxerFactory::CreateAVMuxer(fd, format); if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } return AV_ERR_OK; } int32_t AVMuxerDemo::InnerSetRotation(int32_t rotation) { cout << "InnerSetRotation" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } std::shared_ptr param = std::make_shared(); param->Set(static_cast(rotation)); return avmuxer_->SetParameter(param); } int32_t AVMuxerDemo::InnerAddTrack(int32_t& trackIndex, std::shared_ptr trackDesc) { cout << "InnerAddTrack" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } return avmuxer_->AddTrack(trackIndex, trackDesc); } int32_t AVMuxerDemo::InnerStart() { cout << "InnerStart" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } return avmuxer_->Start(); } int32_t AVMuxerDemo::InnerWriteSample(uint32_t trackIndex, std::shared_ptr sample) { cout << "InnerWriteSample" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } return avmuxer_->WriteSample(trackIndex, sample); } int32_t AVMuxerDemo::InnerStop() { cout << "InnerStop" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } return avmuxer_->Stop(); } int32_t AVMuxerDemo::InnerDestroy() { cout << "InnerDestroy" << endl; if (avmuxer_ == nullptr) { std::cout << "InnerMuxer create failed!" << std::endl; return AVCS_ERR_NO_MEMORY; } avmuxer_->~AVMuxer(); avmuxer_ = nullptr; return AV_ERR_OK; }