Create abstract interface for FFemu.

This commit is contained in:
Themaister 2014-05-04 11:47:55 +02:00
parent b7e1628963
commit 804626e20d
6 changed files with 1367 additions and 1290 deletions

View File

@ -327,7 +327,7 @@ ifeq ($(HAVE_ZLIB), 1)
endif
ifeq ($(HAVE_FFMPEG), 1)
OBJ += record/ffemu.o
OBJ += record/ffemu.o record/ffmpeg.o
LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS)
DEFINES += $(AVCODEC_CFLAGS) $(AVFORMAT_CFLAGS) $(AVUTIL_CFLAGS) $(SWSCALE_CFLAGS) -DHAVE_RECORD
endif

View File

@ -589,7 +589,9 @@ struct global
// FFmpeg record.
#ifdef HAVE_RECORD
ffemu_t *rec;
const ffemu_backend_t *rec_driver;
void *rec;
char record_path[PATH_MAX];
char record_config[PATH_MAX];
bool recording;

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,7 @@
#include <stdint.h>
#include <stddef.h>
#include "../boolean.h"
#ifdef __cplusplus
extern "C" {
@ -78,14 +79,20 @@ struct ffemu_audio_data
size_t frames;
};
typedef struct ffemu ffemu_t;
typedef struct ffemu_backend
{
void *(*init)(const struct ffemu_params *params);
void (*free)(void *data);
bool (*push_video)(void *data, const struct ffemu_video_data *video_data);
bool (*push_audio)(void *data, const struct ffemu_audio_data *audio_data);
bool (*finalize)(void *data);
const char *ident;
} ffemu_backend_t;
void *ffemu_new(const struct ffemu_params *params);
void ffemu_free(void *data);
extern const ffemu_backend_t ffemu_ffmpeg;
bool ffemu_push_video(void *data, const struct ffemu_video_data *video_data);
bool ffemu_push_audio(void *data, const struct ffemu_audio_data *audio_data);
bool ffemu_finalize(void *data);
const ffemu_backend_t *ffemu_find_backend(const char *ident);
bool ffemu_init_first(const ffemu_backend_t **backend, void **data, const struct ffemu_params *params);
#ifdef __cplusplus
}

1323
record/ffmpeg.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -265,7 +265,7 @@ static void recording_dump_frame(const void *data, unsigned width, unsigned heig
ffemu_data.is_dupe = !data;
}
ffemu_push_video(g_extern.rec, &ffemu_data);
g_extern.rec_driver->push_video(g_extern.rec, &ffemu_data);
}
#endif
@ -369,7 +369,7 @@ static bool audio_flush(const int16_t *data, size_t samples)
ffemu_data.data = data;
ffemu_data.frames = samples / 2;
ffemu_push_audio(g_extern.rec, &ffemu_data);
g_extern.rec_driver->push_audio(g_extern.rec, &ffemu_data);
}
#endif
@ -1392,8 +1392,7 @@ void rarch_init_recording(void)
params.fb_width, params.fb_height,
(unsigned)params.pix_fmt);
g_extern.rec = ffemu_new(&params);
if (!g_extern.rec)
if (!ffemu_init_first(&g_extern.rec_driver, &g_extern.rec, &params))
{
RARCH_ERR("Failed to start FFmpeg recording.\n");
g_extern.recording = false;
@ -1405,12 +1404,14 @@ void rarch_init_recording(void)
void rarch_deinit_recording(void)
{
if (!g_extern.recording)
if (!g_extern.rec || !g_extern.rec_driver)
return;
ffemu_finalize(g_extern.rec);
ffemu_free(g_extern.rec);
g_extern.rec_driver->finalize(g_extern.rec);
g_extern.rec_driver->free(g_extern.rec);
g_extern.rec = NULL;
g_extern.rec_driver = NULL;
free(g_extern.record_gpu_buffer);
g_extern.record_gpu_buffer = NULL;