80 lines
2.6 KiB
C++
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 */
|