summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/FFmpegImage.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/FFmpegImage.h')
-rw-r--r--xbmc/guilib/FFmpegImage.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/xbmc/guilib/FFmpegImage.h b/xbmc/guilib/FFmpegImage.h
new file mode 100644
index 0000000..0f7cee3
--- /dev/null
+++ b/xbmc/guilib/FFmpegImage.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012-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 "iimage.h"
+#include <memory>
+
+extern "C"
+{
+#include <libavutil/pixfmt.h>
+}
+
+class Frame
+{
+public:
+ friend class CFFmpegImage;
+
+ Frame() = default;
+ virtual ~Frame();
+
+ int GetPitch() const { return m_pitch; }
+
+ unsigned char* m_pImage = nullptr;
+ unsigned int m_delay = 0;
+
+private:
+ Frame(const Frame& src);
+
+ int m_pitch = 0;
+ unsigned int m_imageSize = 0;
+ unsigned int m_height = 0;
+ unsigned int m_width = 0;
+};
+
+
+struct MemBuffer
+{
+ uint8_t* data = nullptr;
+ size_t size = 0;
+ size_t pos = 0;
+};
+
+struct AVFrame;
+struct AVIOContext;
+struct AVFormatContext;
+struct AVCodecContext;
+struct AVPacket;
+
+class CFFmpegImage : public IImage
+{
+public:
+ explicit CFFmpegImage(const std::string& strMimeType);
+ ~CFFmpegImage() override;
+
+ bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize,
+ unsigned int width, unsigned int height) override;
+ bool Decode(unsigned char * const pixels, unsigned int width, unsigned int height,
+ unsigned int pitch, unsigned int format) override;
+ bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width,
+ unsigned int height, unsigned int format,
+ unsigned int pitch, const std::string& destFile,
+ unsigned char* &bufferout,
+ unsigned int &bufferoutSize) override;
+ void ReleaseThumbnailBuffer() override;
+
+ bool Initialize(unsigned char* buffer, size_t bufSize);
+
+ std::shared_ptr<Frame> ReadFrame();
+
+private:
+ static void FreeIOCtx(AVIOContext** ioctx);
+ AVFrame* ExtractFrame();
+ bool DecodeFrame(AVFrame* m_pFrame, unsigned int width, unsigned int height, unsigned int pitch, unsigned char * const pixels);
+ static int EncodeFFmpegFrame(AVCodecContext *avctx, AVPacket *pkt, int *got_packet, AVFrame *frame);
+ static int DecodeFFmpegFrame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt);
+ static AVPixelFormat ConvertFormats(AVFrame* frame);
+ std::string m_strMimeType;
+ void CleanupLocalOutputBuffer();
+
+
+ MemBuffer m_buf;
+
+ AVIOContext* m_ioctx = nullptr;
+ AVFormatContext* m_fctx = nullptr;
+ AVCodecContext* m_codec_ctx = nullptr;
+
+ AVFrame* m_pFrame;
+ uint8_t* m_outputBuffer;
+};