1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-03 17:37:18 +00:00
OpenMW/apps/openmw/mwsound/ffmpeg_decoder.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

90 lines
2.2 KiB
C++
Raw Normal View History

2012-03-17 06:59:21 +00:00
#ifndef GAME_SOUND_FFMPEG_DECODER_H
#define GAME_SOUND_FFMPEG_DECODER_H
#include <cstdint>
2021-05-02 08:59:22 +00:00
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4244)
#endif
2012-03-17 06:59:21 +00:00
extern "C"
{
2012-12-01 19:53:28 +00:00
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/channel_layout.h>
// From version 54.56 binkaudio encoding format changed from S16 to FLTP. See:
// https://gitorious.org/ffmpeg/ffmpeg/commit/7bfd1766d1c18f07b0a2dd042418a874d49ea60d
// https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=15&t=872
#include <libswresample/swresample.h>
2012-03-17 06:59:21 +00:00
}
2021-05-02 08:59:22 +00:00
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
#include <components/files/istreamptr.hpp>
2015-04-13 20:48:37 +00:00
#include <string>
2012-03-17 06:59:21 +00:00
#include "sound_decoder.hpp"
namespace MWSound
{
class FFmpeg_Decoder final : public Sound_Decoder
2012-03-17 06:59:21 +00:00
{
2012-03-20 23:45:01 +00:00
AVFormatContext* mFormatCtx;
AVCodecContext* mCodecCtx;
AVStream** mStream;
AVPacket mPacket;
AVFrame* mFrame;
int mFrameSize;
int mFramePos;
2012-03-20 23:45:01 +00:00
double mNextPts;
2012-03-20 23:45:01 +00:00
SwrContext* mSwr;
enum AVSampleFormat mOutputSampleFormat;
int64_t mOutputChannelLayout;
uint8_t* mDataBuf;
uint8_t** mFrameData;
int mDataBufLen;
bool getNextPacket();
2012-03-20 23:45:01 +00:00
2015-04-13 20:48:37 +00:00
Files::IStreamPtr mDataStream;
2012-03-20 23:45:01 +00:00
static int readPacket(void* user_data, uint8_t* buf, int buf_size);
static int writePacket(void* user_data, uint8_t* buf, int buf_size);
static int64_t seek(void* user_data, int64_t offset, int whence);
bool getAVAudioData();
size_t readAVAudioData(void* data, size_t length);
void open(const std::string& fname) override;
void close() override;
2012-03-17 06:59:21 +00:00
std::string getName() override;
void getInfo(int* samplerate, ChannelConfig* chans, SampleType* type) override;
size_t read(char* buffer, size_t bytes) override;
void readAll(std::vector<char>& output) override;
size_t getSampleOffset() override;
FFmpeg_Decoder& operator=(const FFmpeg_Decoder& rhs);
FFmpeg_Decoder(const FFmpeg_Decoder& rhs);
2012-03-20 21:13:58 +00:00
public:
2021-01-08 21:18:37 +00:00
explicit FFmpeg_Decoder(const VFS::Manager* vfs);
2012-03-17 06:59:21 +00:00
virtual ~FFmpeg_Decoder();
friend class SoundManager;
};
2012-10-17 16:03:02 +00:00
}
2012-03-17 06:59:21 +00:00
#endif