1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#include "native_avformat.h" 17fa7767c5Sopenharmony_ci 18fa7767c5Sopenharmony_ci#include "common/log.h" 19fa7767c5Sopenharmony_ci#include "common/native_mfmagic.h" 20fa7767c5Sopenharmony_ci#include "common/status.h" 21fa7767c5Sopenharmony_ci#include "meta/meta_key.h" 22fa7767c5Sopenharmony_ci#include "securec.h" 23fa7767c5Sopenharmony_ci 24fa7767c5Sopenharmony_cinamespace { 25fa7767c5Sopenharmony_ciconstexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "NativeAVFormat" }; 26fa7767c5Sopenharmony_ci} 27fa7767c5Sopenharmony_ci 28fa7767c5Sopenharmony_cinamespace { 29fa7767c5Sopenharmony_ciconstexpr uint32_t MAX_STRING_LENGTH = 256; 30fa7767c5Sopenharmony_ciconstexpr uint32_t MAX_DUMP_LENGTH = 1024; 31fa7767c5Sopenharmony_ci} // namespace 32fa7767c5Sopenharmony_ci 33fa7767c5Sopenharmony_ciusing namespace OHOS::Media; 34fa7767c5Sopenharmony_ci 35fa7767c5Sopenharmony_cistruct OH_AVFormat *OH_AVFormat_Create(void) 36fa7767c5Sopenharmony_ci{ 37fa7767c5Sopenharmony_ci return new (std::nothrow) OH_AVFormat(); 38fa7767c5Sopenharmony_ci} 39fa7767c5Sopenharmony_ci 40fa7767c5Sopenharmony_cistruct OH_AVFormat *OH_AVFormat_CreateAudioFormat(const char *mimeType, int32_t sampleRate, int32_t channelCount) 41fa7767c5Sopenharmony_ci{ 42fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(mimeType != nullptr, nullptr, "mimeType is nullptr!"); 43fa7767c5Sopenharmony_ci OH_AVFormat *audioFormat = new (std::nothrow) OH_AVFormat(); 44fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(audioFormat != nullptr, nullptr, "new format is nullptr!"); 45fa7767c5Sopenharmony_ci audioFormat->format_.PutStringValue(Tag::MIME_TYPE, mimeType); 46fa7767c5Sopenharmony_ci audioFormat->format_.PutIntValue(Tag::AUDIO_SAMPLE_RATE, sampleRate); 47fa7767c5Sopenharmony_ci audioFormat->format_.PutIntValue(Tag::AUDIO_CHANNEL_COUNT, channelCount); 48fa7767c5Sopenharmony_ci return audioFormat; 49fa7767c5Sopenharmony_ci} 50fa7767c5Sopenharmony_ci 51fa7767c5Sopenharmony_cistruct OH_AVFormat *OH_AVFormat_CreateVideoFormat(const char *mimeType, int32_t width, int32_t height) 52fa7767c5Sopenharmony_ci{ 53fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(mimeType != nullptr, nullptr, "mimeType is nullptr!"); 54fa7767c5Sopenharmony_ci OH_AVFormat *videoFormat = new (std::nothrow) OH_AVFormat(); 55fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(videoFormat != nullptr, nullptr, "new format is nullptr!"); 56fa7767c5Sopenharmony_ci videoFormat->format_.PutStringValue(Tag::MIME_TYPE, mimeType); 57fa7767c5Sopenharmony_ci videoFormat->format_.PutIntValue(Tag::VIDEO_WIDTH, width); 58fa7767c5Sopenharmony_ci videoFormat->format_.PutIntValue(Tag::VIDEO_HEIGHT, height); 59fa7767c5Sopenharmony_ci return videoFormat; 60fa7767c5Sopenharmony_ci} 61fa7767c5Sopenharmony_ci 62fa7767c5Sopenharmony_civoid OH_AVFormat_Destroy(struct OH_AVFormat *format) 63fa7767c5Sopenharmony_ci{ 64fa7767c5Sopenharmony_ci delete format; 65fa7767c5Sopenharmony_ci} 66fa7767c5Sopenharmony_ci 67fa7767c5Sopenharmony_cibool OH_AVFormat_Copy(struct OH_AVFormat *to, struct OH_AVFormat *from) 68fa7767c5Sopenharmony_ci{ 69fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(to != nullptr, false, "to format is nullptr!"); 70fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(to->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 71fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(from != nullptr, false, "from format is nullptr!"); 72fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(from->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 73fa7767c5Sopenharmony_ci 74fa7767c5Sopenharmony_ci to->format_ = from->format_; 75fa7767c5Sopenharmony_ci return true; 76fa7767c5Sopenharmony_ci} 77fa7767c5Sopenharmony_ci 78fa7767c5Sopenharmony_cibool OH_AVFormat_SetIntValue(struct OH_AVFormat *format, const char *key, int32_t value) 79fa7767c5Sopenharmony_ci{ 80fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 81fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 82fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 83fa7767c5Sopenharmony_ci 84fa7767c5Sopenharmony_ci return format->format_.PutIntValue(key, value); 85fa7767c5Sopenharmony_ci} 86fa7767c5Sopenharmony_ci 87fa7767c5Sopenharmony_cibool OH_AVFormat_SetLongValue(struct OH_AVFormat *format, const char *key, int64_t value) 88fa7767c5Sopenharmony_ci{ 89fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 90fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 91fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 92fa7767c5Sopenharmony_ci 93fa7767c5Sopenharmony_ci return format->format_.PutLongValue(key, value); 94fa7767c5Sopenharmony_ci} 95fa7767c5Sopenharmony_ci 96fa7767c5Sopenharmony_cibool OH_AVFormat_SetFloatValue(struct OH_AVFormat *format, const char *key, float value) 97fa7767c5Sopenharmony_ci{ 98fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 99fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 100fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 101fa7767c5Sopenharmony_ci 102fa7767c5Sopenharmony_ci return format->format_.PutFloatValue(key, value); 103fa7767c5Sopenharmony_ci} 104fa7767c5Sopenharmony_ci 105fa7767c5Sopenharmony_cibool OH_AVFormat_SetDoubleValue(struct OH_AVFormat *format, const char *key, double value) 106fa7767c5Sopenharmony_ci{ 107fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 108fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 109fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 110fa7767c5Sopenharmony_ci 111fa7767c5Sopenharmony_ci return format->format_.PutDoubleValue(key, value); 112fa7767c5Sopenharmony_ci} 113fa7767c5Sopenharmony_ci 114fa7767c5Sopenharmony_cibool OH_AVFormat_SetStringValue(struct OH_AVFormat *format, const char *key, const char *value) 115fa7767c5Sopenharmony_ci{ 116fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 117fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 118fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 119fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(value != nullptr, false, "value is nullptr!"); 120fa7767c5Sopenharmony_ci 121fa7767c5Sopenharmony_ci return format->format_.PutStringValue(key, value); 122fa7767c5Sopenharmony_ci} 123fa7767c5Sopenharmony_ci 124fa7767c5Sopenharmony_cibool OH_AVFormat_SetBuffer(struct OH_AVFormat *format, const char *key, const uint8_t *addr, size_t size) 125fa7767c5Sopenharmony_ci{ 126fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 127fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 128fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 129fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(addr != nullptr, false, "addr is nullptr!"); 130fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(size != 0, false, "size is zero!"); 131fa7767c5Sopenharmony_ci 132fa7767c5Sopenharmony_ci return format->format_.PutBuffer(key, addr, size); 133fa7767c5Sopenharmony_ci} 134fa7767c5Sopenharmony_ci 135fa7767c5Sopenharmony_cibool OH_AVFormat_GetIntValue(struct OH_AVFormat *format, const char *key, int32_t *out) 136fa7767c5Sopenharmony_ci{ 137fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 138fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 139fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 140fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(out != nullptr, false, "out is nullptr!"); 141fa7767c5Sopenharmony_ci 142fa7767c5Sopenharmony_ci return format->format_.GetIntValue(key, *out); 143fa7767c5Sopenharmony_ci} 144fa7767c5Sopenharmony_ci 145fa7767c5Sopenharmony_cibool OH_AVFormat_GetLongValue(struct OH_AVFormat *format, const char *key, int64_t *out) 146fa7767c5Sopenharmony_ci{ 147fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 148fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 149fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 150fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(out != nullptr, false, "out is nullptr!"); 151fa7767c5Sopenharmony_ci 152fa7767c5Sopenharmony_ci return format->format_.GetLongValue(key, *out); 153fa7767c5Sopenharmony_ci} 154fa7767c5Sopenharmony_ci 155fa7767c5Sopenharmony_cibool OH_AVFormat_GetFloatValue(struct OH_AVFormat *format, const char *key, float *out) 156fa7767c5Sopenharmony_ci{ 157fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 158fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 159fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 160fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(out != nullptr, false, "out is nullptr!"); 161fa7767c5Sopenharmony_ci 162fa7767c5Sopenharmony_ci return format->format_.GetFloatValue(key, *out); 163fa7767c5Sopenharmony_ci} 164fa7767c5Sopenharmony_ci 165fa7767c5Sopenharmony_cibool OH_AVFormat_GetDoubleValue(struct OH_AVFormat *format, const char *key, double *out) 166fa7767c5Sopenharmony_ci{ 167fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 168fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 169fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 170fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(out != nullptr, false, "out is nullptr!"); 171fa7767c5Sopenharmony_ci 172fa7767c5Sopenharmony_ci return format->format_.GetDoubleValue(key, *out); 173fa7767c5Sopenharmony_ci} 174fa7767c5Sopenharmony_ci 175fa7767c5Sopenharmony_cibool OH_AVFormat_GetStringValue(struct OH_AVFormat *format, const char *key, const char **out) 176fa7767c5Sopenharmony_ci{ 177fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 178fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 179fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 180fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(out != nullptr, false, "out is nullptr!"); 181fa7767c5Sopenharmony_ci 182fa7767c5Sopenharmony_ci if (format->outString_ != nullptr) { 183fa7767c5Sopenharmony_ci free(format->outString_); 184fa7767c5Sopenharmony_ci format->outString_ = nullptr; 185fa7767c5Sopenharmony_ci } 186fa7767c5Sopenharmony_ci 187fa7767c5Sopenharmony_ci std::string str; 188fa7767c5Sopenharmony_ci bool ret = format->format_.GetStringValue(key, str); 189fa7767c5Sopenharmony_ci if (!ret) { 190fa7767c5Sopenharmony_ci return false; 191fa7767c5Sopenharmony_ci } 192fa7767c5Sopenharmony_ci uint32_t bufLength = str.size() > MAX_STRING_LENGTH ? MAX_STRING_LENGTH : str.size(); 193fa7767c5Sopenharmony_ci 194fa7767c5Sopenharmony_ci format->outString_ = static_cast<char *>(malloc((bufLength + 1) * sizeof(char))); 195fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->outString_ != nullptr, false, "malloc out string nullptr!"); 196fa7767c5Sopenharmony_ci 197fa7767c5Sopenharmony_ci if (strcpy_s(format->outString_, bufLength + 1, str.c_str()) != EOK) { 198fa7767c5Sopenharmony_ci MEDIA_LOG_E("Failed to strcpy_s"); 199fa7767c5Sopenharmony_ci free(format->outString_); 200fa7767c5Sopenharmony_ci format->outString_ = nullptr; 201fa7767c5Sopenharmony_ci return false; 202fa7767c5Sopenharmony_ci } 203fa7767c5Sopenharmony_ci 204fa7767c5Sopenharmony_ci *out = format->outString_; 205fa7767c5Sopenharmony_ci return true; 206fa7767c5Sopenharmony_ci} 207fa7767c5Sopenharmony_ci 208fa7767c5Sopenharmony_cibool OH_AVFormat_GetBuffer(struct OH_AVFormat *format, const char *key, uint8_t **addr, size_t *size) 209fa7767c5Sopenharmony_ci{ 210fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, false, "input format is nullptr!"); 211fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->magic_ == MFMagic::MFMAGIC_FORMAT, false, "magic error!"); 212fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(key != nullptr, false, "key is nullptr!"); 213fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(addr != nullptr, false, "addr is nullptr!"); 214fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(size != nullptr, false, "size is nullptr!"); 215fa7767c5Sopenharmony_ci 216fa7767c5Sopenharmony_ci return format->format_.GetBuffer(key, addr, *size); 217fa7767c5Sopenharmony_ci} 218fa7767c5Sopenharmony_ci 219fa7767c5Sopenharmony_ciconst char *OH_AVFormat_DumpInfo(struct OH_AVFormat *format) 220fa7767c5Sopenharmony_ci{ 221fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format != nullptr, nullptr, "input format is nullptr!"); 222fa7767c5Sopenharmony_ci if (format->dumpInfo_ != nullptr) { 223fa7767c5Sopenharmony_ci free(format->dumpInfo_); 224fa7767c5Sopenharmony_ci format->dumpInfo_ = nullptr; 225fa7767c5Sopenharmony_ci } 226fa7767c5Sopenharmony_ci std::string info = format->format_.Stringify(); 227fa7767c5Sopenharmony_ci if (info.empty()) { 228fa7767c5Sopenharmony_ci return nullptr; 229fa7767c5Sopenharmony_ci } 230fa7767c5Sopenharmony_ci uint32_t bufLength = info.size() > MAX_DUMP_LENGTH ? MAX_DUMP_LENGTH : info.size(); 231fa7767c5Sopenharmony_ci format->dumpInfo_ = static_cast<char *>(malloc((bufLength + 1) * sizeof(char))); 232fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(format->dumpInfo_ != nullptr, nullptr, "malloc dump info nullptr!"); 233fa7767c5Sopenharmony_ci if (strcpy_s(format->dumpInfo_, bufLength + 1, info.c_str()) != EOK) { 234fa7767c5Sopenharmony_ci MEDIA_LOG_E("Failed to strcpy_s"); 235fa7767c5Sopenharmony_ci free(format->dumpInfo_); 236fa7767c5Sopenharmony_ci format->dumpInfo_ = nullptr; 237fa7767c5Sopenharmony_ci } 238fa7767c5Sopenharmony_ci return format->dumpInfo_; 239fa7767c5Sopenharmony_ci} 240