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