all repos — mgba @ 3f75078174dd7cd7f696b59c3e43bd2842c6359c

mGBA Game Boy Advance Emulator

src/feature/ffmpeg/ffmpeg-encoder.h (view raw)

  1/* Copyright (c) 2013-2015 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#ifndef FFMPEG_ENCODER
  7#define FFMPEG_ENCODER
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/internal/gba/gba.h>
 14
 15#include <libavformat/avformat.h>
 16#include <libavcodec/version.h>
 17
 18// Version 57.16 in FFmpeg
 19#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 100)
 20#define FFMPEG_USE_PACKETS
 21#endif
 22
 23// Version 57.15 in libav
 24#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 35, 0)
 25#define FFMPEG_USE_NEW_BSF
 26#endif
 27
 28// Version 57.14 in libav
 29#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 0)
 30#define FFMPEG_USE_CODECPAR
 31#endif
 32
 33#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 8, 0)
 34#define FFMPEG_USE_PACKET_UNREF
 35#endif
 36
 37#define FFMPEG_FILTERS_MAX 4
 38
 39struct FFmpegEncoder {
 40	struct mAVStream d;
 41	struct AVFormatContext* context;
 42
 43	unsigned audioBitrate;
 44	const char* audioCodec;
 45
 46	unsigned videoBitrate;
 47	const char* videoCodec;
 48
 49	const char* containerFormat;
 50
 51	struct AVCodecContext* audio;
 52	enum AVSampleFormat sampleFormat;
 53	int sampleRate;
 54	uint16_t* audioBuffer;
 55	size_t audioBufferSize;
 56	uint16_t* postaudioBuffer;
 57	size_t postaudioBufferSize;
 58	AVFrame* audioFrame;
 59	size_t currentAudioSample;
 60	int64_t currentAudioFrame;
 61#ifdef USE_LIBAVRESAMPLE
 62	struct AVAudioResampleContext* resampleContext;
 63#else
 64	struct SwrContext* resampleContext;
 65#endif
 66#ifdef FFMPEG_USE_NEW_BSF
 67	struct AVBSFContext* absf; // Needed for AAC in MP4
 68#else
 69	struct AVBitStreamFilterContext* absf; // Needed for AAC in MP4
 70#endif
 71	struct AVStream* audioStream;
 72
 73	struct AVCodecContext* video;
 74	enum AVPixelFormat pixFormat;
 75	enum AVPixelFormat ipixFormat;
 76	struct AVFrame* videoFrame;
 77	int width;
 78	int height;
 79	int iwidth;
 80	int iheight;
 81	int frameskip;
 82	int skipResidue;
 83	bool loop;
 84	int64_t currentVideoFrame;
 85	struct SwsContext* scaleContext;
 86	struct AVStream* videoStream;
 87
 88	struct AVFilterGraph* graph;
 89	struct AVFilterContext* source;
 90	struct AVFilterContext* sink;
 91	struct AVFilterContext* filters[FFMPEG_FILTERS_MAX];
 92	struct AVFrame* sinkFrame;
 93};
 94
 95void FFmpegEncoderInit(struct FFmpegEncoder*);
 96bool FFmpegEncoderSetAudio(struct FFmpegEncoder*, const char* acodec, unsigned abr);
 97bool FFmpegEncoderSetVideo(struct FFmpegEncoder*, const char* vcodec, unsigned vbr, int frameskip);
 98bool FFmpegEncoderSetContainer(struct FFmpegEncoder*, const char* container);
 99void FFmpegEncoderSetDimensions(struct FFmpegEncoder*, int width, int height);
100void FFmpegEncoderSetLooping(struct FFmpegEncoder*, bool loop);
101bool FFmpegEncoderVerifyContainer(struct FFmpegEncoder*);
102bool FFmpegEncoderOpen(struct FFmpegEncoder*, const char* outfile);
103void FFmpegEncoderClose(struct FFmpegEncoder*);
104bool FFmpegEncoderIsOpen(struct FFmpegEncoder*);
105
106CXX_GUARD_END
107
108#endif