/*
 * 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.
 */

#include <string>
#include "gtest/gtest.h"
#include "AVMuxerDemo.h"
#include "avcodec_errors.h"

using namespace std;
using namespace testing::ext;
using namespace OHOS;
using namespace OHOS::MediaAVCodec;
using namespace OHOS::Media;

namespace {
    class InnerAVMuxerParamCheckTest : public testing::Test {
    public:
        static void SetUpTestCase();
        static void TearDownTestCase();
        void SetUp() override;
        void TearDown() override;
    };

    void InnerAVMuxerParamCheckTest::SetUpTestCase() {}
    void InnerAVMuxerParamCheckTest::TearDownTestCase() {}
    void InnerAVMuxerParamCheckTest::SetUp() {}
    void InnerAVMuxerParamCheckTest::TearDown() {}
    const std::string HEVC_LIB_PATH = std::string(AV_CODEC_PATH) + "/libav_codec_hevc_parser.z.so";
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_001
 * @tc.name      : InnerCreate - fd check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_001, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = -1;
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_NO_MEMORY, ret);
    muxerDemo->InnerDestroy();

    fd = muxerDemo->InnerGetFdByMode(format);
    ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);
    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_002
 * @tc.name      : InnerCreate - format check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_002, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);
    muxerDemo->InnerDestroy();

    format = Plugins::OutputFormat::M4A;
    fd = muxerDemo->InnerGetFdByMode(format);
    ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();

    format = Plugins::OutputFormat::DEFAULT;
    fd = muxerDemo->InnerGetFdByMode(format);
    ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}

/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_003
 * @tc.name      : InnerSetRotation - rotation check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_003, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    std::cout<<"fd "<< fd << endl;
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    int32_t rotation;

    rotation = 0;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    rotation = 90;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    rotation = 180;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    rotation = 270;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    rotation = -90;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, ret);

    rotation = 45;
    ret = muxerDemo->InnerSetRotation(rotation);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, ret);

    muxerDemo->InnerDestroy();

    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_004
 * @tc.name      : InnerAddTrack - (MediaDescriptionKey::MD_KEY_CODEC_MIME) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_004, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    std::cout<<"fd "<< fd << endl;

    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_MPEG);
    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_FLAC);
    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(AVCS_ERR_UNSUPPORT_FILE_TYPE, trackId);

    audioParams->Set<Tag::MIME_TYPE>("aaaaaa");
    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(AVCS_ERR_UNSUPPORT_FILE_TYPE, trackId);

    muxerDemo->InnerDestroy();

    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_005
 * @tc.name      : InnerAddTrack - (MediaDescriptionKey::MD_KEY_CHANNEL_COUNT) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_005, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(-1);
    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_006
 * @tc.name      : InnerAddTrack - (MediaDescriptionKey::MD_KEY_SAMPLE_RATE) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_006, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(-1);
    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}

/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_007
 * @tc.name      : InnerAddTrack - video (MediaDescriptionKey::MD_KEY_CODEC_MIME) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_007, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
    videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    videoParams->Set<Tag::VIDEO_WIDTH>(352);
    videoParams->Set<Tag::VIDEO_HEIGHT>(288);

    int32_t trackId;
    int trackIndex = 0;

    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_AVC);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_JPG);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_PNG);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_BMP);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_008
 * @tc.name      : InnerAddTrack - video (MediaDescriptionKey::MD_KEY_WIDTH) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_008, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
    videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    videoParams->Set<Tag::VIDEO_WIDTH>(352);
    videoParams->Set<Tag::VIDEO_HEIGHT>(288);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::VIDEO_WIDTH>(-1);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_009
 * @tc.name      : InnerAddTrack - video (MediaDescriptionKey::MD_KEY_HEIGHT) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_009, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
    videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    videoParams->Set<Tag::VIDEO_WIDTH>(352);
    videoParams->Set<Tag::VIDEO_HEIGHT>(288);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::VIDEO_HEIGHT>(-1);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_010
 * @tc.name      : InnerAddTrack - (any key) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_010, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    audioParams->SetData("aaaaa", "bbbbb");

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_011
 * @tc.name      : InnerWriteSample - info.trackIndex check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_011, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);


    ret = muxerDemo->InnerStart();
    ASSERT_EQ(AVCS_ERR_OK, ret);

    uint8_t data[100];
    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));

    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    trackIndex = -1;
    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_INVALID_VAL, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_012
 * @tc.name      : InnerWriteSample - info.presentationTimeUs check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_012, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;

    ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, ret);
    std::cout << "trackIndex: " << trackIndex << std::endl;
    ret = muxerDemo->InnerStart();
    ASSERT_EQ(AVCS_ERR_OK, ret);

    uint8_t data[100];
    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));

    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    avMemBuffer->pts_ = -1;
    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_013
 * @tc.name      : InnerWriteSample - info.size check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_013, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    ret = muxerDemo->InnerStart();
    ASSERT_EQ(AVCS_ERR_OK, ret);

    uint8_t data[100];
    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));

    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    avMemBuffer->memory_->SetSize(-1);
    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}
/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_014
 * @tc.name      : InnerWriteSample - info.offset check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_014, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    ret = muxerDemo->InnerStart();
    ASSERT_EQ(AVCS_ERR_OK, ret);

    uint8_t data[100];
    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));

    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    avMemBuffer->memory_->SetOffset(-1);
    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}


/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_015
 * @tc.name      : InnerWriteSample - info.flags check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_015, TestSize.Level2)
{
    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
    audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(48000);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
    ASSERT_EQ(0, trackId);

    ret = muxerDemo->InnerStart();
    ASSERT_EQ(AVCS_ERR_OK, ret);

    uint8_t data[100];
    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));

    avMemBuffer->flag_ = static_cast<uint32_t>(Plugins::AVBufferFlag::SYNC_FRAME);
    ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}

/**
 * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_016
 * @tc.name      : InnerAddTrack - video (MediaDescriptionKey::MD_KEY_COLOR_PRIMARIES) check
 * @tc.desc      : param check test
 */
HWTEST_F(InnerAVMuxerParamCheckTest, SUB_MULTIMEDIA_MEDIA_MUXER_PARAM_CHECK_016, TestSize.Level2)
{
    if (access(HEVC_LIB_PATH.c_str(), F_OK) != 0) {
        std::cout << "the hevc of mimetype is not supported" << std::endl;
        return;
    }

    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
    int32_t fd = muxerDemo->InnerGetFdByMode(format);
    int32_t ret = muxerDemo->InnerCreate(fd, format);
    ASSERT_EQ(AVCS_ERR_OK, ret);

    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
    std::vector<uint8_t> a(100);

    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_HEVC);
    videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(a);
    videoParams->Set<Tag::VIDEO_WIDTH>(352);
    videoParams->Set<Tag::VIDEO_HEIGHT>(288);
    videoParams->Set<Tag::VIDEO_FRAME_RATE>(60);
    videoParams->Set<Tag::VIDEO_DELAY>(2);
    videoParams->Set<Tag::VIDEO_COLOR_PRIMARIES>(Plugins::ColorPrimary::BT709);
    videoParams->Set<Tag::VIDEO_COLOR_TRC>(Plugins::TransferCharacteristic::BT709);
    videoParams->Set<Tag::VIDEO_COLOR_MATRIX_COEFF>(Plugins::MatrixCoefficient::BT709);
    videoParams->Set<Tag::VIDEO_COLOR_RANGE>(false);
    videoParams->Set<Tag::VIDEO_IS_HDR_VIVID>(true);

    videoParams->Set<Tag::MEDIA_CREATION_TIME>(nullptr);
    videoParams->SetData(nullptr, nullptr);
    videoParams->SetData(0, 0);

    int trackIndex = 0;
    int32_t trackId;

    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    videoParams->Set<Tag::VIDEO_COLOR_PRIMARIES>(static_cast<Plugins::ColorPrimary>(0));
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_NE(0, trackId);

    videoParams->Set<Tag::VIDEO_COLOR_PRIMARIES>(Plugins::ColorPrimary::BT709);
    videoParams->Set<Tag::VIDEO_COLOR_TRC>(static_cast<Plugins::TransferCharacteristic>(0));
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_NE(0, trackId);

    videoParams->Set<Tag::VIDEO_COLOR_TRC>(Plugins::TransferCharacteristic::BT709);
    videoParams->Set<Tag::VIDEO_COLOR_MATRIX_COEFF>(static_cast<Plugins::MatrixCoefficient>(3));
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_NE(0, trackId);

    videoParams->Set<Tag::VIDEO_COLOR_MATRIX_COEFF>(Plugins::MatrixCoefficient::BT709);
    videoParams->Set<Tag::VIDEO_IS_HDR_VIVID>(false);
    trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
    ASSERT_EQ(0, trackId);

    muxerDemo->InnerDestroy();
    delete muxerDemo;
}