mirror of
https://github.com/libretro/RetroArch
synced 2024-12-27 15:29:23 +00:00
Create abstract interface for FFemu.
This commit is contained in:
parent
b7e1628963
commit
804626e20d
2
Makefile
2
Makefile
@ -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
|
||||
|
@ -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;
|
||||
|
1294
record/ffemu.c
1294
record/ffemu.c
File diff suppressed because it is too large
Load Diff
@ -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
1323
record/ffmpeg.c
Normal file
File diff suppressed because it is too large
Load Diff
15
retroarch.c
15
retroarch.c
@ -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(¶ms);
|
||||
if (!g_extern.rec)
|
||||
if (!ffemu_init_first(&g_extern.rec_driver, &g_extern.rec, ¶ms))
|
||||
{
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user