ADecEncNdkSample.h 4.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*
 * 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.
 */

#ifndef AUDIODECENC_NDK_SAMPLE_H
#define AUDIODECENC_NDK_SAMPLE_H

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <atomic>
#include <fstream>
#include <thread>
#include <mutex>
#include <queue>
#include <string>
#include "securec.h"
#include "native_avcodec_base.h"
#include "native_avcodec_audiodecoder.h"
#include "native_avcodec_audioencoder.h"
#include "nocopyable.h"
#include "ndktest_log.h"

namespace OHOS {
Y
yj 已提交
36
namespace MediaAVCodec {
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
class ADecEncSignal {
public:
    std::mutex inMutexDec_;
    std::condition_variable inCondDec_;
    std::queue<uint32_t> inQueueDec_;
    std::queue<uint32_t> outQueueDec_;
    std::queue<uint32_t>  sizeQueueDec_;
    std::queue<uint32_t>  flagQueueDec_;
    std::queue<OH_AVMemory *> inBufferQueueDec_;
    std::queue<OH_AVMemory *> outBufferQueueDec_;

    std::mutex inMutexEnc_;
    std::mutex outMutexEnc_;
    std::condition_variable inCondEnc_;
    std::condition_variable outCondEnc_;
    std::queue<uint32_t> inQueueEnc_;
    std::queue<uint32_t> outQueueEnc_;
    std::queue<uint32_t>  sizeQueueEnc_;
    std::queue<uint32_t>  flagQueueEnc_;
    std::queue<OH_AVMemory *> inBufferQueueEnc_;
    std::queue<OH_AVMemory *> outBufferQueueEnc_;
    int32_t errorNum_ = 0;
    std::atomic<bool> isFlushing_ = false;
};

class ADecEncNdkSample : public NoCopyable {
public:
    ADecEncNdkSample() = default;
    ~ADecEncNdkSample();

67 68
    struct OH_AVCodec* CreateAudioDecoderByMime(std::string mimetype);
    struct OH_AVCodec* CreateAudioDecoderByName(std::string name);
69
    int32_t ConfigureDec(struct OH_AVFormat *format);
70
    int32_t SetParameterDec(struct OH_AVFormat *format);
71 72 73 74 75 76 77
    int32_t PrepareDec();
    int32_t StartDec();
    int32_t StopDec();
    int32_t FlushDec();
    int32_t ResetDec();
    int32_t ReleaseDec();

78 79
    struct OH_AVCodec* CreateAudioEncoderByMime(std::string mimetype);
    struct OH_AVCodec* CreateAudioEncoderByName(std::string name);
80
    int32_t ConfigureEnc(struct OH_AVFormat *format);
81
    int32_t SetParameterEnc(struct OH_AVFormat *format);
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    int32_t PrepareEnc();
    int32_t StartEnc();
    int32_t StopEnc();
    int32_t FlushEnc();
    int32_t ResetEnc();
    int32_t ReleaseEnc();
    int32_t CalcuError();

    void SetReadPath(const char* inp_path, uint32_t es[], uint32_t length);
    void SetEosState(bool needSetEos);
    void SetSavePath(const char* outp_path);
    void ReRead();
    void ResetDecParam();
    void ResetEncParam();
    int32_t GetFrameCount();
    bool GetEncEosState();
    bool GetDecEosState();
    void PopInqueueDec();
    void PopOutqueueDec();
    void PopInqueueEnc();
    void PopOutqueueEnc();
    int32_t PushInbufferDec(uint32_t index, uint32_t bufferSize);
    int32_t PushInbufferEnc();

    ADecEncSignal* acodecSignal_ = nullptr;
    uint32_t decInCnt_ = 0;
    uint32_t decOutCnt_ = 0;
    uint32_t encInCnt_ = 0;
    uint32_t encOutCnt_ = 0;
    bool isDecInputEOS = false;
    bool isEncInputEOS = false;
    bool isDecOutputEOS = false;
    bool isEncOutputEOS = false;
    bool setEos = true;

private:
    struct OH_AVCodec* adec_;
    void InputFuncDec();
    std::atomic<bool> isDecRunning_ = false;
    std::unique_ptr<std::ifstream> testFile_;
    std::unique_ptr<std::thread> inputLoopDec_;
    std::unique_ptr<std::thread> outputLoopDec_;
    struct OH_AVCodecAsyncCallback cbDec_;
    int64_t timeStampDec_ = 0;
    struct OH_AVCodec* aenc_;
    void InputFuncEnc();
    void OutputFuncEnc();
    int32_t WriteToFile();
    std::atomic<bool> isEncRunning_ = false;
    std::unique_ptr<std::thread> inputLoopEnc_;
    std::unique_ptr<std::thread> outputLoopEnc_;
    struct OH_AVCodecAsyncCallback cbEnc_;
    int64_t timeStampEnc_ = 0;
    std::string outDir_ = "/data/media/out.aac";
    const char* INP_FILE;
    const char* OUT_FILE;
    uint32_t* ES;
    uint32_t ES_LENGTH = 0;
};
}
}
#endif // AUDIODECENC_NDK_SAMPLE_H