1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2023-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#ifndef HISTREAMER_PLUGIN_CONVERT_H 16fa7767c5Sopenharmony_ci#define HISTREAMER_PLUGIN_CONVERT_H 17fa7767c5Sopenharmony_ci#undef memcpy_s 18fa7767c5Sopenharmony_ci#include <memory> 19fa7767c5Sopenharmony_ci#include <vector> 20fa7767c5Sopenharmony_ci#include "plugin/common/plugin_types.h" 21fa7767c5Sopenharmony_ci 22fa7767c5Sopenharmony_ci#ifdef __cplusplus 23fa7767c5Sopenharmony_ciextern "C" { 24fa7767c5Sopenharmony_ci#endif 25fa7767c5Sopenharmony_ci#include "libavcodec/avcodec.h" 26fa7767c5Sopenharmony_ci#include "libavutil/channel_layout.h" 27fa7767c5Sopenharmony_ci#include "libavutil/error.h" 28fa7767c5Sopenharmony_ci#include "libavutil/frame.h" 29fa7767c5Sopenharmony_ci#include "libavutil/imgutils.h" 30fa7767c5Sopenharmony_ci#include "libavutil/pixdesc.h" 31fa7767c5Sopenharmony_ci#include "libavutil/pixfmt.h" 32fa7767c5Sopenharmony_ci#include "libswresample/swresample.h" 33fa7767c5Sopenharmony_ci#include "libswscale/swscale.h" 34fa7767c5Sopenharmony_ci#ifdef __cplusplus 35fa7767c5Sopenharmony_ci}; 36fa7767c5Sopenharmony_ci#endif 37fa7767c5Sopenharmony_ci 38fa7767c5Sopenharmony_cinamespace OHOS { 39fa7767c5Sopenharmony_cinamespace Media { 40fa7767c5Sopenharmony_cinamespace Plugin { 41fa7767c5Sopenharmony_cinamespace Ffmpeg { 42fa7767c5Sopenharmony_cistruct ResamplePara { 43fa7767c5Sopenharmony_ci uint32_t channels {2}; // 2: STEREO 44fa7767c5Sopenharmony_ci uint32_t sampleRate {0}; 45fa7767c5Sopenharmony_ci uint32_t bitsPerSample {0}; 46fa7767c5Sopenharmony_ci int64_t channelLayout {0}; 47fa7767c5Sopenharmony_ci AVSampleFormat srcFfFmt {AV_SAMPLE_FMT_NONE}; 48fa7767c5Sopenharmony_ci uint32_t destSamplesPerFrame {0}; 49fa7767c5Sopenharmony_ci AVSampleFormat destFmt {AV_SAMPLE_FMT_S16}; 50fa7767c5Sopenharmony_ci}; 51fa7767c5Sopenharmony_ci 52fa7767c5Sopenharmony_ciclass Resample { 53fa7767c5Sopenharmony_cipublic: 54fa7767c5Sopenharmony_ci Status Init(const ResamplePara& resamplePara); 55fa7767c5Sopenharmony_ci Status Convert(const uint8_t* srcBuffer, const size_t srcLength, uint8_t*& destBuffer, size_t& destLength); 56fa7767c5Sopenharmony_ciprivate: 57fa7767c5Sopenharmony_ci ResamplePara resamplePara_ {}; 58fa7767c5Sopenharmony_ci#if defined(_WIN32) || !defined(OHOS_LITE) 59fa7767c5Sopenharmony_ci std::vector<uint8_t> resampleCache_ {}; 60fa7767c5Sopenharmony_ci std::vector<uint8_t*> resampleChannelAddr_ {}; 61fa7767c5Sopenharmony_ci std::shared_ptr<SwrContext> swrCtx_ {nullptr}; 62fa7767c5Sopenharmony_ci#endif 63fa7767c5Sopenharmony_ci}; 64fa7767c5Sopenharmony_ci 65fa7767c5Sopenharmony_ci#if defined(VIDEO_SUPPORT) 66fa7767c5Sopenharmony_cistruct ScalePara { 67fa7767c5Sopenharmony_ci int32_t srcWidth {0}; 68fa7767c5Sopenharmony_ci int32_t srcHeight {0}; 69fa7767c5Sopenharmony_ci AVPixelFormat srcFfFmt {AVPixelFormat::AV_PIX_FMT_NONE}; 70fa7767c5Sopenharmony_ci int32_t dstWidth {0}; 71fa7767c5Sopenharmony_ci int32_t dstHeight {0}; 72fa7767c5Sopenharmony_ci AVPixelFormat dstFfFmt {AVPixelFormat::AV_PIX_FMT_RGBA}; 73fa7767c5Sopenharmony_ci int32_t align {16}; 74fa7767c5Sopenharmony_ci}; 75fa7767c5Sopenharmony_ci 76fa7767c5Sopenharmony_cistruct Scale { 77fa7767c5Sopenharmony_cipublic: 78fa7767c5Sopenharmony_ci Status Init(const ScalePara& scalePara, uint8_t** dstData, int32_t* dstLineSize); 79fa7767c5Sopenharmony_ci Status Convert(uint8_t** srcData, const int32_t* srcLineSize, uint8_t** dstData, int32_t* dstLineSize); 80fa7767c5Sopenharmony_ciprivate: 81fa7767c5Sopenharmony_ci ScalePara scalePara_ {}; 82fa7767c5Sopenharmony_ci std::shared_ptr<SwsContext> swsCtx_ {nullptr}; 83fa7767c5Sopenharmony_ci}; 84fa7767c5Sopenharmony_ci#endif 85fa7767c5Sopenharmony_ci} // namespace Ffmpeg 86fa7767c5Sopenharmony_ci} // namespace Plugin 87fa7767c5Sopenharmony_ci} // namespace Media 88fa7767c5Sopenharmony_ci} // namespace OHOS 89fa7767c5Sopenharmony_ci#endif // HISTREAMER_PLUGIN_CONVERT_H 90