visualboyadvance-m/src/common/ffmpeg.h

80 lines
2.6 KiB
C++

#ifndef WX_FFMPEG_H
#define WX_FFMPEG_H
// simplified interface for recording audio and/or video from emulator
// unlike the rest of the wx code, this has no wx dependency at all, and
// could be used by other front ends as well.
// this only supports selecting output format via file name extensions;
// maybe some future version will support specifying a format. wx-2.9
// has an extra widget for the file selector, but 2.8 doesn't.
// the only missing piece that I couldn't figure out how to do generically
// is the code to find the available formats & associated extensions for
// the file dialog.
#include "../common/Types.h"
// return codes
// probably ought to put in own namespace, but this is good enough
enum MediaRet {
MRET_OK, // no errors
MRET_ERR_NOMEM, // error allocating buffers or structures
MRET_ERR_NOCODEC, // error opening codec
MRET_ERR_FERR, // error writing output file
MRET_ERR_RECORDING, // attempt to start recording when already doing it
MRET_ERR_FMTGUESS, // can't guess format from file name
MRET_ERR_BUFSIZE // buffer overflow (fatal)
};
class MediaRecorder
{
public:
MediaRecorder();
virtual ~MediaRecorder();
// start audio+video (also video-only codecs)
MediaRet Record(const char *fname, int width, int height, int depth);
// start audio only
MediaRet Record(const char *fname);
// stop both
void Stop();
bool IsRecording() { return oc != NULL; }
// add a frame of video; width+height+depth already given
// assumes a 1-pixel border on top & right
// always assumes being passed 1/60th of a second of video
MediaRet AddFrame(const u8 *vid);
// add a frame of audio; uses current sample rate to know length
// always assumes being passed 1/60th of a second of audio.
MediaRet AddFrame(const u16 *aud);
private:
static bool did_init;
// these are to avoid polluting things with avcodec includes
#ifndef priv_AVFormatContext
#define priv_AVFormatContext void
#define priv_AVStream void
#define priv_AVOutputFormat void
#define priv_AVFrame void
#define priv_SwsContext void
#define priv_PixelFormat int
#endif
priv_AVFormatContext *oc;
priv_AVStream *vid_st, *aud_st;
u8 *audio_buf, *video_buf;
u16 *audio_buf2;
int frame_len, sample_len, in_audio_buf2;
int linesize, pixsize;
priv_PixelFormat pixfmt;
priv_AVFrame *pic, *convpic;
priv_SwsContext *converter;
MediaRet setup_sound_stream(const char *fname, priv_AVOutputFormat *fmt);
MediaRet setup_video_stream(const char *fname, int w, int h, int d);
MediaRet finish_setup(const char *fname);
};
#endif /* WX_FFMPEG_H */