1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef AVMUXER_DEMO_COMMON_H
17#define AVMUXER_DEMO_COMMON_H
18
19#include <iostream>
20#include <unistd.h>
21#include <fcntl.h>
22#include "avmuxer.h"
23#include "nocopyable.h"
24#include "native_avmuxer.h"
25#include "avcodec_errors.h"
26
27namespace OHOS {
28namespace MediaAVCodec {
29// only for demo
30typedef struct AudioTrackParam {
31    const char* mimeType;
32    long long bitRate;
33    int sampleFormat;
34    int sampleRate;
35    int channels;
36    long long channelMask;
37    int samplePerFrame;
38} AudioTrackParam;
39
40typedef struct VideoTrackParam {
41    const char* mimeType;
42    long long bitRate;
43    int pixelFormat;
44    int width;
45    int height;
46} VideoTrackParam;
47
48class AVMuxerDemo : public NoCopyable {
49public:
50    AVMuxerDemo() = default;
51    ~AVMuxerDemo() = default;
52
53    int32_t GetFdByMode(OH_AVOutputFormat format);
54    int32_t GetErrorFd();
55    int32_t GetFdByName(OH_AVOutputFormat format, std::string fileName);
56    int32_t InnerGetFdByMode(Plugins::OutputFormat format);
57    int32_t InnerGetFdByName(Plugins::OutputFormat format, std::string fileName);
58    // native api
59    OH_AVMuxer* NativeCreate(int32_t fd, OH_AVOutputFormat format);
60    OH_AVErrCode NativeSetRotation(OH_AVMuxer* muxer, int32_t rotation);
61    OH_AVErrCode NativeAddTrack(OH_AVMuxer* muxer, int32_t* trackIndex, OH_AVFormat* trackFormat);
62    OH_AVErrCode NativeStart(OH_AVMuxer* muxer);
63    OH_AVErrCode NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex,
64        OH_AVMemory* sample, OH_AVCodecBufferAttr info);
65    OH_AVErrCode NativeWriteSampleBuffer(OH_AVMuxer* muxer, uint32_t trackIndex,
66        OH_AVBuffer* sample);
67    OH_AVErrCode NativeStop(OH_AVMuxer* muxer);
68    OH_AVErrCode NativeDestroy(OH_AVMuxer* muxer);
69
70    // Inner api
71    int32_t InnerCreate(int32_t fd, Plugins::OutputFormat format);
72    int32_t InnerSetRotation(int32_t rotation);
73    int32_t InnerAddTrack(int32_t& trackIndex, std::shared_ptr<Meta> trackDesc);
74    int32_t InnerStart();
75    int32_t InnerWriteSample(uint32_t trackIndex, std::shared_ptr<AVBuffer> sample);
76    int32_t InnerStop();
77    int32_t InnerDestroy();
78private:
79    std::string filename = "";
80    std::shared_ptr<AVMuxer> avmuxer_;
81};
82}
83}
84#endif // AVMUXER_DEMO_COMMON_H