mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 04:49:39 -10:00
68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "globalincs/vmallocator.h"
|
|
#include "globalincs/pstypes.h"
|
|
#include "cfile/cfile.h"
|
|
|
|
#include "FFmpeg.h"
|
|
#include "FFmpegHeaders.h"
|
|
|
|
#include <memory>
|
|
|
|
namespace libs {
|
|
namespace ffmpeg {
|
|
|
|
/**
|
|
* @brief Stores a vector of bytes and an access position to treat it as file
|
|
*
|
|
*
|
|
*/
|
|
|
|
struct MemFileCursor {
|
|
const SCP_vector<uint8_t> snddata;
|
|
SCP_vector<uint8_t>::size_type cursor_pos;
|
|
|
|
MemFileCursor(const uint8_t* snddata, size_t snd_len);
|
|
MemFileCursor();
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief Contains a FFmpeg context
|
|
*
|
|
* This should be used for making sure a FFmpeg context is always deallocated even if an exception is throws.
|
|
* createContext can be used for opening a specific file for FFmpeg decoding
|
|
*/
|
|
|
|
|
|
class FFmpegContext {
|
|
private:
|
|
AVFormatContext* m_ctx;
|
|
CFILE* m_file;
|
|
|
|
MemFileCursor m_memsound;
|
|
|
|
FFmpegContext(CFILE* file);
|
|
FFmpegContext(const uint8_t* snddata, size_t snd_len);
|
|
|
|
void prepare(void *opaque,
|
|
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
|
|
int64_t (*seek)(void *opaque, int64_t offset, int whence));
|
|
public:
|
|
~FFmpegContext();
|
|
|
|
FFmpegContext(const FFmpegContext&) = delete;
|
|
FFmpegContext& operator=(const FFmpegContext&) = delete;
|
|
|
|
inline AVFormatContext* ctx() { return m_ctx; }
|
|
|
|
static std::unique_ptr<FFmpegContext> createContext(CFILE* mediaFile);
|
|
|
|
static std::unique_ptr<FFmpegContext> createContextMem(const uint8_t* snddata, size_t snd_len);
|
|
|
|
static std::unique_ptr<FFmpegContext> createContext(const SCP_string& path, int dir_type);
|
|
};
|
|
|
|
}
|
|
}
|