diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/cdrip/EncoderFFmpeg.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/cdrip/EncoderFFmpeg.h')
-rw-r--r-- | xbmc/cdrip/EncoderFFmpeg.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/xbmc/cdrip/EncoderFFmpeg.h b/xbmc/cdrip/EncoderFFmpeg.h new file mode 100644 index 0000000..39112ba --- /dev/null +++ b/xbmc/cdrip/EncoderFFmpeg.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "Encoder.h" + +extern "C" +{ +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libswresample/swresample.h> +} + +namespace KODI +{ +namespace CDRIP +{ + +class CEncoderFFmpeg : public CEncoder +{ +public: + CEncoderFFmpeg() = default; + ~CEncoderFFmpeg() override = default; + + bool Init() override; + ssize_t Encode(uint8_t* pbtStream, size_t nNumBytesRead) override; + bool Close() override; + +private: + static int avio_write_callback(void* opaque, uint8_t* buf, int buf_size); + static int64_t avio_seek_callback(void* opaque, int64_t offset, int whence); + + void SetTag(const std::string& tag, const std::string& value); + bool WriteFrame(); + AVSampleFormat GetInputFormat(int inBitsPerSample); + std::string FFmpegErrorToString(int err); + + AVFormatContext* m_formatCtx{nullptr}; + AVCodecContext* m_codecCtx{nullptr}; + SwrContext* m_swrCtx{nullptr}; + AVStream* m_stream{nullptr}; + AVSampleFormat m_inFormat; + AVSampleFormat m_outFormat; + + /* From libavformat/avio.h: + * The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this + * blocksize. + * For others a typical size is a cache page, e.g. 4kb. + */ + static constexpr size_t BUFFER_SIZE = 4096; + uint8_t* m_bcBuffer{nullptr}; + + unsigned int m_neededFrames{0}; + size_t m_neededBytes{0}; + uint8_t* m_buffer{nullptr}; + size_t m_bufferSize{0}; + AVFrame* m_bufferFrame{nullptr}; + uint8_t* m_resampledBuffer{nullptr}; + size_t m_resampledBufferSize{0}; + AVFrame* m_resampledFrame{nullptr}; + bool m_needConversion{false}; + int64_t m_samplesCount{0}; + int64_t m_samplesCountMultiply{1000}; +}; + +} /* namespace CDRIP */ +} /* namespace KODI */ |