1f6603c60Sopenharmony_ci/* 2f6603c60Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License. 5f6603c60Sopenharmony_ci * You may obtain a copy of the License at 6f6603c60Sopenharmony_ci * 7f6603c60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f6603c60Sopenharmony_ci * 9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and 13f6603c60Sopenharmony_ci * limitations under the License. 14f6603c60Sopenharmony_ci */ 15f6603c60Sopenharmony_ci 16f6603c60Sopenharmony_ci#include "napi/native_api.h" 17f6603c60Sopenharmony_ci#include "node_api.h" 18f6603c60Sopenharmony_ci#include <fcntl.h> 19f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcodec_audiodecoder.h> 20f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcodec_base.h> 21f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avmuxer.h> 22f6603c60Sopenharmony_ci#include <unistd.h> 23f6603c60Sopenharmony_ci 24f6603c60Sopenharmony_ci#define MUNUSONE (-1) 25f6603c60Sopenharmony_ci#define ZEROVAL 0 26f6603c60Sopenharmony_ci#define ONEONEVAL 11 27f6603c60Sopenharmony_ci#define SUCCESS 0 28f6603c60Sopenharmony_ci#define FAIL (-1) 29f6603c60Sopenharmony_ci#define ONETWOVAL 12 30f6603c60Sopenharmony_ci#define ONEFIVEVAL 15 31f6603c60Sopenharmony_ci#define TWOTWOVAL 22 32f6603c60Sopenharmony_ci#define BIGVAL 44100 33f6603c60Sopenharmony_ci#define TWOVAL 2 34f6603c60Sopenharmony_ci#define PARAM_0666 0666 35f6603c60Sopenharmony_ci 36f6603c60Sopenharmony_cistatic napi_value OHAVMuxerCreate(napi_env env, napi_callback_info info) 37f6603c60Sopenharmony_ci{ 38f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 39f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 40f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 41f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 42f6603c60Sopenharmony_ci int returnValue = FAIL; 43f6603c60Sopenharmony_ci if (muxer != nullptr) { 44f6603c60Sopenharmony_ci returnValue = SUCCESS; 45f6603c60Sopenharmony_ci } 46f6603c60Sopenharmony_ci close(fileDescribe); 47f6603c60Sopenharmony_ci napi_value result = nullptr; 48f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 49f6603c60Sopenharmony_ci muxer = nullptr; 50f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 51f6603c60Sopenharmony_ci return result; 52f6603c60Sopenharmony_ci} 53f6603c60Sopenharmony_ci 54f6603c60Sopenharmony_cistatic napi_value OHAVMuxerSetRotation(napi_env env, napi_callback_info info) 55f6603c60Sopenharmony_ci{ 56f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 57f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 58f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 59f6603c60Sopenharmony_ci int trackId = audioTrackId; 60f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 61f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 62f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 63f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 64f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 65f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 66f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 67f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 68f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 69f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 70f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_SetRotation(muxer, rotation); 71f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 72f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 73f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 74f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 75f6603c60Sopenharmony_ci int returnValue = FAIL; 76f6603c60Sopenharmony_ci if (backInfo == AV_ERR_OK) { 77f6603c60Sopenharmony_ci returnValue = SUCCESS; 78f6603c60Sopenharmony_ci } 79f6603c60Sopenharmony_ci close(fileDescribe); 80f6603c60Sopenharmony_ci napi_value result = nullptr; 81f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 82f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 83f6603c60Sopenharmony_ci muxer = nullptr; 84f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 85f6603c60Sopenharmony_ci return result; 86f6603c60Sopenharmony_ci} 87f6603c60Sopenharmony_ci 88f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStart(napi_env env, napi_callback_info info) 89f6603c60Sopenharmony_ci{ 90f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 91f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 92f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 93f6603c60Sopenharmony_ci int trackId = audioTrackId; 94f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 95f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 96f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 97f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 98f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 99f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 100f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 101f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 102f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 103f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 104f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 105f6603c60Sopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 106f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL); 107f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL); 108f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 109f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_Start(muxer); 110f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 111f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 112f6603c60Sopenharmony_ci int returnValue = FAIL; 113f6603c60Sopenharmony_ci if (backInfo == AV_ERR_OK) { 114f6603c60Sopenharmony_ci returnValue = SUCCESS; 115f6603c60Sopenharmony_ci } 116f6603c60Sopenharmony_ci close(fileDescribe); 117f6603c60Sopenharmony_ci napi_value result = nullptr; 118f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 119f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 120f6603c60Sopenharmony_ci muxer = nullptr; 121f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 122f6603c60Sopenharmony_ci return result; 123f6603c60Sopenharmony_ci} 124f6603c60Sopenharmony_ci 125f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStop(napi_env env, napi_callback_info info) 126f6603c60Sopenharmony_ci{ 127f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 128f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 129f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 130f6603c60Sopenharmony_ci int trackId = audioTrackId; 131f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 132f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 133f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 134f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 135f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 136f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 137f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 138f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 139f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 140f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 141f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 142f6603c60Sopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 143f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL); 144f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL); 145f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 146f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 147f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 148f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_Stop(muxer); 149f6603c60Sopenharmony_ci int returnValue = FAIL; 150f6603c60Sopenharmony_ci if (backInfo == AV_ERR_OK) { 151f6603c60Sopenharmony_ci returnValue = SUCCESS; 152f6603c60Sopenharmony_ci } 153f6603c60Sopenharmony_ci close(fileDescribe); 154f6603c60Sopenharmony_ci napi_value result = nullptr; 155f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 156f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 157f6603c60Sopenharmony_ci muxer = nullptr; 158f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 159f6603c60Sopenharmony_ci return result; 160f6603c60Sopenharmony_ci} 161f6603c60Sopenharmony_ci 162f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSample(napi_env env, napi_callback_info info) 163f6603c60Sopenharmony_ci{ 164f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 165f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 166f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 167f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 168f6603c60Sopenharmony_ci attrInfo.pts = ONEONEVAL; 169f6603c60Sopenharmony_ci attrInfo.size = ONEONEVAL; 170f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 171f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 172f6603c60Sopenharmony_ci int trackId = audioTrackId; 173f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(TWOTWOVAL); 174f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_DEFAULT; 175f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, PARAM_0666); 176f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 177f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 178f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 179f6603c60Sopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 180f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL); 181f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL); 182f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &trackId, trackFormat); 183f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 184f6603c60Sopenharmony_ci int backInfo = OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 185f6603c60Sopenharmony_ci int returnValue = FAIL; 186f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 187f6603c60Sopenharmony_ci if (backInfo == AV_ERR_OK) { 188f6603c60Sopenharmony_ci returnValue = SUCCESS; 189f6603c60Sopenharmony_ci } 190f6603c60Sopenharmony_ci close(fileDescribe); 191f6603c60Sopenharmony_ci napi_value result = nullptr; 192f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 193f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 194f6603c60Sopenharmony_ci muxer = nullptr; 195f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 196f6603c60Sopenharmony_ci return result; 197f6603c60Sopenharmony_ci} 198f6603c60Sopenharmony_ci 199f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSampleBuffer(napi_env env, napi_callback_info info) { 200f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 201f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 202f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 203f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 204f6603c60Sopenharmony_ci attrInfo.pts = ONEONEVAL; 205f6603c60Sopenharmony_ci attrInfo.size = ONEONEVAL; 206f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 207f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 208f6603c60Sopenharmony_ci int trackId = audioTrackId; 209f6603c60Sopenharmony_ci OH_AVBuffer *sample = OH_AVBuffer_Create(TWOTWOVAL); 210f6603c60Sopenharmony_ci OH_AVBuffer_SetBufferAttr(sample, &attrInfo); 211f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_DEFAULT; 212f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, PARAM_0666); 213f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 214f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 215f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 216f6603c60Sopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 217f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL); 218f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL); 219f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &trackId, trackFormat); 220f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 221f6603c60Sopenharmony_ci int backInfo = OH_AVMuxer_WriteSampleBuffer(muxer, trackId, sample); 222f6603c60Sopenharmony_ci int returnValue = FAIL; 223f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 224f6603c60Sopenharmony_ci if (backInfo == AV_ERR_OK) { 225f6603c60Sopenharmony_ci returnValue = SUCCESS; 226f6603c60Sopenharmony_ci } 227f6603c60Sopenharmony_ci close(fileDescribe); 228f6603c60Sopenharmony_ci napi_value result = nullptr; 229f6603c60Sopenharmony_ci OH_AVBuffer_Destroy(sample); 230f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 231f6603c60Sopenharmony_ci OH_AVFormat_Destroy(trackFormat); 232f6603c60Sopenharmony_ci muxer = nullptr; 233f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 234f6603c60Sopenharmony_ci return result; 235f6603c60Sopenharmony_ci} 236f6603c60Sopenharmony_ci 237f6603c60Sopenharmony_cistatic napi_value OHAVMuxerAddTrack(napi_env env, napi_callback_info info) 238f6603c60Sopenharmony_ci{ 239f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 240f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 241f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 242f6603c60Sopenharmony_ci int trackId = audioTrackId; 243f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 244f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 245f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 246f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 247f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 248f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 249f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 250f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 251f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 252f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 253f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 254f6603c60Sopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 255f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL); 256f6603c60Sopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL); 257f6603c60Sopenharmony_ci int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 258f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 259f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 260f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 261f6603c60Sopenharmony_ci int returnValue = FAIL; 262f6603c60Sopenharmony_ci if (ret == AV_ERR_OK) { 263f6603c60Sopenharmony_ci returnValue = SUCCESS; 264f6603c60Sopenharmony_ci } 265f6603c60Sopenharmony_ci close(fileDescribe); 266f6603c60Sopenharmony_ci napi_value result = nullptr; 267f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 268f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 269f6603c60Sopenharmony_ci muxer = nullptr; 270f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 271f6603c60Sopenharmony_ci return result; 272f6603c60Sopenharmony_ci} 273f6603c60Sopenharmony_ci 274f6603c60Sopenharmony_cistatic napi_value OHAVMuxerDestroy(napi_env env, napi_callback_info info) 275f6603c60Sopenharmony_ci{ 276f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 277f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 278f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 279f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 280f6603c60Sopenharmony_ci int returnValue = FAIL; 281f6603c60Sopenharmony_ci napi_value result = nullptr; 282f6603c60Sopenharmony_ci OH_AVErrCode desval = OH_AVMuxer_Destroy(muxer); 283f6603c60Sopenharmony_ci if (desval == AV_ERR_OK) { 284f6603c60Sopenharmony_ci returnValue = SUCCESS; 285f6603c60Sopenharmony_ci } 286f6603c60Sopenharmony_ci close(fileDescribe); 287f6603c60Sopenharmony_ci muxer = nullptr; 288f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 289f6603c60Sopenharmony_ci return result; 290f6603c60Sopenharmony_ci} 291f6603c60Sopenharmony_ci 292f6603c60Sopenharmony_cistatic napi_value OHAVMuxerCreateAbnormal(napi_env env, napi_callback_info info) 293f6603c60Sopenharmony_ci{ 294f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 295f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 296f6603c60Sopenharmony_ci int fileDescribe = MUNUSONE; 297f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 298f6603c60Sopenharmony_ci int returnValue = FAIL; 299f6603c60Sopenharmony_ci if (muxer == nullptr) { 300f6603c60Sopenharmony_ci returnValue = SUCCESS; 301f6603c60Sopenharmony_ci } 302f6603c60Sopenharmony_ci napi_value result = nullptr; 303f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 304f6603c60Sopenharmony_ci return result; 305f6603c60Sopenharmony_ci} 306f6603c60Sopenharmony_ci 307f6603c60Sopenharmony_cistatic napi_value OHAVMuxerSetRotationAbnormal(napi_env env, napi_callback_info info) 308f6603c60Sopenharmony_ci{ 309f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 310f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 311f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 312f6603c60Sopenharmony_ci int trackId = audioTrackId; 313f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 314f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 315f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 316f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 317f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 318f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 319f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 320f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 321f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 322f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 323f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_SetRotation(nullptr, rotation); 324f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 325f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 326f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 327f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 328f6603c60Sopenharmony_ci int returnValue = FAIL; 329f6603c60Sopenharmony_ci if (backInfo == AV_ERR_INVALID_VAL) { 330f6603c60Sopenharmony_ci returnValue = SUCCESS; 331f6603c60Sopenharmony_ci } 332f6603c60Sopenharmony_ci close(fileDescribe); 333f6603c60Sopenharmony_ci napi_value result = nullptr; 334f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 335f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 336f6603c60Sopenharmony_ci muxer = nullptr; 337f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 338f6603c60Sopenharmony_ci return result; 339f6603c60Sopenharmony_ci} 340f6603c60Sopenharmony_ci 341f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStartAbnormal(napi_env env, napi_callback_info info) 342f6603c60Sopenharmony_ci{ 343f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 344f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 345f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 346f6603c60Sopenharmony_ci int trackId = audioTrackId; 347f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 348f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 349f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 350f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 351f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 352f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 353f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 354f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 355f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 356f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 357f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 358f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 359f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_Start(nullptr); 360f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 361f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 362f6603c60Sopenharmony_ci int returnValue = FAIL; 363f6603c60Sopenharmony_ci if (backInfo == AV_ERR_INVALID_VAL) { 364f6603c60Sopenharmony_ci returnValue = SUCCESS; 365f6603c60Sopenharmony_ci } 366f6603c60Sopenharmony_ci close(fileDescribe); 367f6603c60Sopenharmony_ci napi_value result = nullptr; 368f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 369f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 370f6603c60Sopenharmony_ci muxer = nullptr; 371f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 372f6603c60Sopenharmony_ci return result; 373f6603c60Sopenharmony_ci} 374f6603c60Sopenharmony_ci 375f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStopAbnormal(napi_env env, napi_callback_info info) 376f6603c60Sopenharmony_ci{ 377f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 378f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 379f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 380f6603c60Sopenharmony_ci int trackId = audioTrackId; 381f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 382f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 383f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 384f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 385f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 386f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 387f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 388f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 389f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 390f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 391f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 392f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 393f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 394f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 395f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_Stop(nullptr); 396f6603c60Sopenharmony_ci int returnValue = FAIL; 397f6603c60Sopenharmony_ci if (backInfo == AV_ERR_INVALID_VAL) { 398f6603c60Sopenharmony_ci returnValue = SUCCESS; 399f6603c60Sopenharmony_ci } 400f6603c60Sopenharmony_ci close(fileDescribe); 401f6603c60Sopenharmony_ci napi_value result = nullptr; 402f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 403f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 404f6603c60Sopenharmony_ci muxer = nullptr; 405f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 406f6603c60Sopenharmony_ci return result; 407f6603c60Sopenharmony_ci} 408f6603c60Sopenharmony_ci 409f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSampleAbnormal(napi_env env, napi_callback_info info) 410f6603c60Sopenharmony_ci{ 411f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 412f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 413f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 414f6603c60Sopenharmony_ci int trackId = audioTrackId; 415f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 416f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 417f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 418f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 419f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 420f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 421f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 422f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 423f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 424f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 425f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 426f6603c60Sopenharmony_ci OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat); 427f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 428f6603c60Sopenharmony_ci OH_AVErrCode backInfo = OH_AVMuxer_WriteSample(nullptr, trackId, sample, attrInfo); 429f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 430f6603c60Sopenharmony_ci int returnValue = FAIL; 431f6603c60Sopenharmony_ci if (backInfo == AV_ERR_INVALID_VAL) { 432f6603c60Sopenharmony_ci returnValue = SUCCESS; 433f6603c60Sopenharmony_ci } 434f6603c60Sopenharmony_ci close(fileDescribe); 435f6603c60Sopenharmony_ci napi_value result = nullptr; 436f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 437f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 438f6603c60Sopenharmony_ci muxer = nullptr; 439f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 440f6603c60Sopenharmony_ci return result; 441f6603c60Sopenharmony_ci} 442f6603c60Sopenharmony_ci 443f6603c60Sopenharmony_cistatic napi_value OHAVMuxerAddTrackAbnormal(napi_env env, napi_callback_info info) 444f6603c60Sopenharmony_ci{ 445f6603c60Sopenharmony_ci OH_AVMuxer *muxer = nullptr; 446f6603c60Sopenharmony_ci int audioTrackId = MUNUSONE; 447f6603c60Sopenharmony_ci int32_t rotation = ZEROVAL; 448f6603c60Sopenharmony_ci int trackId = audioTrackId; 449f6603c60Sopenharmony_ci OH_AVCodecBufferAttr attrInfo; 450f6603c60Sopenharmony_ci attrInfo.pts = ONETWOVAL; 451f6603c60Sopenharmony_ci attrInfo.size = ONEFIVEVAL; 452f6603c60Sopenharmony_ci attrInfo.offset = ZEROVAL; 453f6603c60Sopenharmony_ci attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 454f6603c60Sopenharmony_ci OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL); 455f6603c60Sopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 456f6603c60Sopenharmony_ci int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR); 457f6603c60Sopenharmony_ci muxer = OH_AVMuxer_Create(fileDescribe, format); 458f6603c60Sopenharmony_ci OH_AVFormat *trackFormat = OH_AVFormat_Create(); 459f6603c60Sopenharmony_ci OH_AVMuxer_SetRotation(muxer, rotation); 460f6603c60Sopenharmony_ci int ret = OH_AVMuxer_AddTrack(nullptr, &audioTrackId, trackFormat); 461f6603c60Sopenharmony_ci OH_AVMuxer_Start(muxer); 462f6603c60Sopenharmony_ci OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo); 463f6603c60Sopenharmony_ci OH_AVMuxer_Stop(muxer); 464f6603c60Sopenharmony_ci int returnValue = FAIL; 465f6603c60Sopenharmony_ci if (ret == AV_ERR_INVALID_VAL) { 466f6603c60Sopenharmony_ci returnValue = SUCCESS; 467f6603c60Sopenharmony_ci } 468f6603c60Sopenharmony_ci close(fileDescribe); 469f6603c60Sopenharmony_ci napi_value result = nullptr; 470f6603c60Sopenharmony_ci OH_AVMemory_Destroy(sample); 471f6603c60Sopenharmony_ci OH_AVMuxer_Destroy(muxer); 472f6603c60Sopenharmony_ci muxer = nullptr; 473f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 474f6603c60Sopenharmony_ci return result; 475f6603c60Sopenharmony_ci} 476f6603c60Sopenharmony_ci 477f6603c60Sopenharmony_cistatic napi_value OHAVMuxerDestroyAbnormal(napi_env env, napi_callback_info info) 478f6603c60Sopenharmony_ci{ 479f6603c60Sopenharmony_ci int returnValue = FAIL; 480f6603c60Sopenharmony_ci napi_value result = nullptr; 481f6603c60Sopenharmony_ci OH_AVErrCode desval = OH_AVMuxer_Destroy(nullptr); 482f6603c60Sopenharmony_ci if (desval == AV_ERR_INVALID_VAL) { 483f6603c60Sopenharmony_ci returnValue = SUCCESS; 484f6603c60Sopenharmony_ci } 485f6603c60Sopenharmony_ci napi_create_int32(env, returnValue, &result); 486f6603c60Sopenharmony_ci return result; 487f6603c60Sopenharmony_ci} 488f6603c60Sopenharmony_ciEXTERN_C_START 489f6603c60Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports) 490f6603c60Sopenharmony_ci{ 491f6603c60Sopenharmony_ci napi_property_descriptor desc[] = { 492f6603c60Sopenharmony_ci {"oHAVMuxerCreate", nullptr, OHAVMuxerCreate, nullptr, nullptr, nullptr, napi_default, nullptr}, 493f6603c60Sopenharmony_ci {"oHAVMuxerSetRotation", nullptr, OHAVMuxerSetRotation, nullptr, nullptr, nullptr, napi_default, nullptr}, 494f6603c60Sopenharmony_ci {"oHAVMuxerStart", nullptr, OHAVMuxerStart, nullptr, nullptr, nullptr, napi_default, nullptr}, 495f6603c60Sopenharmony_ci {"oHAVMuxerStop", nullptr, OHAVMuxerStop, nullptr, nullptr, nullptr, napi_default, nullptr}, 496f6603c60Sopenharmony_ci {"oHAVMuxerWriteSample", nullptr, OHAVMuxerWriteSample, nullptr, nullptr, nullptr, napi_default, nullptr}, 497f6603c60Sopenharmony_ci {"OHAVMuxerWriteSampleBuffer", nullptr, OHAVMuxerWriteSampleBuffer, nullptr, nullptr, nullptr, napi_default, nullptr}, 498f6603c60Sopenharmony_ci {"oHAVMuxerAddTrack", nullptr, OHAVMuxerAddTrack, nullptr, nullptr, nullptr, napi_default, nullptr}, 499f6603c60Sopenharmony_ci {"oHAVMuxerDestroy", nullptr, OHAVMuxerDestroy, nullptr, nullptr, nullptr, napi_default, nullptr}, 500f6603c60Sopenharmony_ci 501f6603c60Sopenharmony_ci {"oHAVMuxerCreateAbnormal", nullptr, OHAVMuxerCreateAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr}, 502f6603c60Sopenharmony_ci {"oHAVMuxerSetRotationAbnormal", nullptr, OHAVMuxerSetRotationAbnormal, nullptr, nullptr, nullptr, napi_default, 503f6603c60Sopenharmony_ci nullptr}, 504f6603c60Sopenharmony_ci {"oHAVMuxerStartAbnormal", nullptr, OHAVMuxerStartAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr}, 505f6603c60Sopenharmony_ci {"oHAVMuxerStopAbnormal", nullptr, OHAVMuxerStopAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr}, 506f6603c60Sopenharmony_ci {"oHAVMuxerWriteSampleAbnormal", nullptr, OHAVMuxerWriteSampleAbnormal, nullptr, nullptr, nullptr, napi_default, 507f6603c60Sopenharmony_ci nullptr}, 508f6603c60Sopenharmony_ci {"oHAVMuxerAddTrackAbnormal", nullptr, OHAVMuxerAddTrackAbnormal, nullptr, nullptr, nullptr, napi_default, 509f6603c60Sopenharmony_ci nullptr}, 510f6603c60Sopenharmony_ci {"oHAVMuxerDestroyAbnormal", nullptr, OHAVMuxerDestroyAbnormal, nullptr, nullptr, nullptr, napi_default, 511f6603c60Sopenharmony_ci nullptr}, 512f6603c60Sopenharmony_ci 513f6603c60Sopenharmony_ci }; 514f6603c60Sopenharmony_ci napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 515f6603c60Sopenharmony_ci return exports; 516f6603c60Sopenharmony_ci} 517f6603c60Sopenharmony_ci 518f6603c60Sopenharmony_ciEXTERN_C_END 519f6603c60Sopenharmony_ci 520f6603c60Sopenharmony_cistatic napi_module demoModule = { 521f6603c60Sopenharmony_ci .nm_version = 1, 522f6603c60Sopenharmony_ci .nm_flags = 0, 523f6603c60Sopenharmony_ci .nm_filename = nullptr, 524f6603c60Sopenharmony_ci .nm_register_func = Init, 525f6603c60Sopenharmony_ci .nm_modname = "nativeavmuxer", 526f6603c60Sopenharmony_ci .nm_priv = ((void *)0), 527f6603c60Sopenharmony_ci .reserved = {0}, 528f6603c60Sopenharmony_ci}; 529f6603c60Sopenharmony_ci 530f6603c60Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } 531