1
0
mirror of https://github.com/libretro/RetroArch synced 2024-07-03 00:38:44 +00:00

Start preparing internal ffmpeg core mechanisms

This commit is contained in:
twinaphex 2015-06-21 00:03:27 +02:00
parent 6f1bc69fc7
commit d3f0954418
9 changed files with 1693 additions and 8 deletions

View File

@ -797,9 +797,10 @@ endif
# Record
ifeq ($(HAVE_FFMPEG), 1)
OBJ += record/drivers/ffmpeg.o
LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS) $(FFMPEG_LIBS)
DEFINES += $(AVCODEC_CFLAGS) $(AVFORMAT_CFLAGS) $(AVUTIL_CFLAGS) $(SWSCALE_CFLAGS)
OBJ += record/drivers/ffmpeg.o \
cores/ffmpeg_core.o
LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS) $(SWRESAMPLE_LIBS) $(FFMPEG_LIBS)
DEFINES += $(AVCODEC_CFLAGS) $(AVFORMAT_CFLAGS) $(AVUTIL_CFLAGS) $(SWSCALE_CFLAGS) $(SWRESAMPLE_CFLAGS)
DEFINES += -DHAVE_FFMPEG -Iffmpeg
endif

View File

@ -75,6 +75,7 @@ AVCODEC_LIBS := -lavcodec
AVUTIL_LIBS := -lavutil
SWSCALE_LIBS := -lswscale
AVFORMAT_LIBS := -lavformat
SWRESAMPLE_LIBS := -lswresample
FFMPEG_LIBS := -lws2_32 -lz
endif

1575
cores/ffmpeg_core.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -15,8 +15,8 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DYNAMIC_DUMMY_H__
#define DYNAMIC_DUMMY_H__
#ifndef INTERNAL_CORES_H__
#define INTERNAL_CORES_H__
#include <boolean.h>
#include "../libretro.h"
@ -72,5 +72,60 @@ void *libretro_dummy_retro_get_memory_data(unsigned id);
size_t libretro_dummy_retro_get_memory_size(unsigned id);
#ifdef HAVE_FFMPEG
void libretro_ffmpeg_retro_init(void);
void libretro_ffmpeg_retro_deinit(void);
unsigned libretro_ffmpeg_retro_api_version(void);
void libretro_ffmpeg_retro_get_system_info(struct retro_system_info *info);
void libretro_ffmpeg_retro_get_system_av_info(struct retro_system_av_info *info);
void libretro_ffmpeg_retro_set_environment(retro_environment_t cb);
void libretro_ffmpeg_retro_set_video_refresh(retro_video_refresh_t cb);
void libretro_ffmpeg_retro_set_audio_sample(retro_audio_sample_t cb);
void libretro_ffmpeg_retro_set_audio_sample_batch(retro_audio_sample_batch_t cb);
void libretro_ffmpeg_retro_set_input_poll(retro_input_poll_t cb);
void libretro_ffmpeg_retro_set_input_state(retro_input_state_t cb);
void libretro_ffmpeg_retro_set_controller_port_device(unsigned port, unsigned device);
void libretro_ffmpeg_retro_reset(void);
void libretro_ffmpeg_retro_run(void);
size_t libretro_ffmpeg_retro_serialize_size(void);
bool libretro_ffmpeg_retro_serialize(void *data, size_t size);
bool libretro_ffmpeg_retro_unserialize(const void *data, size_t size);
void libretro_ffmpeg_retro_cheat_reset(void);
void libretro_ffmpeg_retro_cheat_set(unsigned index, bool enabled, const char *code);
bool libretro_ffmpeg_retro_load_game(const struct retro_game_info *game);
bool libretro_ffmpeg_retro_load_game_special(unsigned game_type,
const struct retro_game_info *info, size_t num_info);
void libretro_ffmpeg_retro_unload_game(void);
unsigned libretro_ffmpeg_retro_get_region(void);
void *libretro_ffmpeg_retro_get_memory_data(unsigned id);
size_t libretro_ffmpeg_retro_get_memory_size(unsigned id);
#endif
#endif

View File

@ -29,7 +29,7 @@
#include <boolean.h>
#include "libretro_private.h"
#include "cores/dynamic_dummy.h"
#include "cores/internal_cores.h"
#include "retroarch.h"
#include "runloop.h"
#include "configuration.h"
@ -60,6 +60,10 @@ static dylib_t lib_handle;
#define SYM_DUMMY(x) p##x = libretro_dummy_##x
#ifdef HAVE_FFMPEG
#define SYM_FFMPEG(x) p##x = libretro_ffmpeg_##x
#endif
void (*pretro_init)(void);
void (*pretro_deinit)(void);
@ -400,6 +404,43 @@ static void load_symbols(enum rarch_core_type type)
SYM_DUMMY(retro_get_memory_data);
SYM_DUMMY(retro_get_memory_size);
break;
#ifdef HAVE_FFMPEG
case CORE_TYPE_FFMPEG:
SYM_FFMPEG(retro_init);
SYM_FFMPEG(retro_deinit);
SYM_FFMPEG(retro_api_version);
SYM_FFMPEG(retro_get_system_info);
SYM_FFMPEG(retro_get_system_av_info);
SYM_FFMPEG(retro_set_environment);
SYM_FFMPEG(retro_set_video_refresh);
SYM_FFMPEG(retro_set_audio_sample);
SYM_FFMPEG(retro_set_audio_sample_batch);
SYM_FFMPEG(retro_set_input_poll);
SYM_FFMPEG(retro_set_input_state);
SYM_FFMPEG(retro_set_controller_port_device);
SYM_FFMPEG(retro_reset);
SYM_FFMPEG(retro_run);
SYM_FFMPEG(retro_serialize_size);
SYM_FFMPEG(retro_serialize);
SYM_FFMPEG(retro_unserialize);
SYM_FFMPEG(retro_cheat_reset);
SYM_FFMPEG(retro_cheat_set);
SYM_FFMPEG(retro_load_game);
SYM_FFMPEG(retro_load_game_special);
SYM_FFMPEG(retro_unload_game);
SYM_FFMPEG(retro_get_region);
SYM_FFMPEG(retro_get_memory_data);
SYM_FFMPEG(retro_get_memory_size);
break;
#endif
}
}

View File

@ -30,6 +30,9 @@ enum rarch_core_type
{
CORE_TYPE_PLAIN = 0,
CORE_TYPE_DUMMY,
#ifdef HAVE_FFMPEG
CORE_TYPE_FFMPEG,
#endif
};
#ifdef __cplusplus

View File

@ -42,6 +42,8 @@ typedef struct fifo_buffer fifo_buffer_t;
fifo_buffer_t *fifo_new(size_t size);
void fifo_clear(fifo_buffer_t *buffer);
void fifo_write(fifo_buffer_t *buffer, const void *in_buf, size_t size);
void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t size);

View File

@ -44,6 +44,12 @@ fifo_buffer_t *fifo_new(size_t size)
return buf;
}
void fifo_clear(fifo_buffer_t *buffer)
{
buffer->first = 0;
buffer->end = 0;
}
void fifo_free(fifo_buffer_t *buffer)
{
if (!buffer)

View File

@ -279,12 +279,13 @@ if [ "$HAVE_THREADS" != 'no' ]; then
if [ "$HAVE_FFMPEG" != 'no' ]; then
check_pkgconf AVCODEC libavcodec 54
check_pkgconf AVFORMAT libavformat 54
check_pkgconf SWRESAMPLE libswresample
check_pkgconf AVUTIL libavutil 51
check_pkgconf SWSCALE libswscale 2.1
check_header AV_CHANNEL_LAYOUT libavutil/channel_layout.h
HAVE_FFMPEG='yes'
if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then
if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_SWRESAMPLE" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then
HAVE_FFMPEG='no'
echo "Notice: FFmpeg recording disabled due to missing or unsuitable packages."
fi
@ -391,6 +392,6 @@ add_define_make OS "$OS"
# Creates config.mk and config.h.
add_define_make GLOBAL_CONFIG_DIR "$GLOBAL_CONFIG_DIR"
VARS="RGUI LAKKA GLUI XMB ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO CORETEXT PULSE SDL SDL2 D3D9 DINPUT LIBUSB XINPUT DSOUND XAUDIO OPENGL EXYNOS DISPMANX SUNXI OMAP GLES GLES3 VG EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG LIBXML2 ZLIB DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE FREETYPE XKBCOMMON XVIDEO X11 XEXT XF86VM XINERAMA WAYLAND MALI_FBDEV VIVANTE_FBDEV NETWORKING NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO STRL STRCASESTR MMAP PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 FFMPEG_AVCODEC_ENCODE_VIDEO2 BSV_MOVIE VIDEOCORE NEON FLOATHARD FLOATSOFTFP UDEV V4L2 AV_CHANNEL_LAYOUT 7ZIP PARPORT COCOA AVFOUNDATION CORELOCATION IOHIDMANAGER LIBRETRODB"
VARS="RGUI LAKKA GLUI XMB ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO CORETEXT PULSE SDL SDL2 D3D9 DINPUT LIBUSB XINPUT DSOUND XAUDIO OPENGL EXYNOS DISPMANX SUNXI OMAP GLES GLES3 VG EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG LIBXML2 ZLIB DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE FREETYPE XKBCOMMON XVIDEO X11 XEXT XF86VM XINERAMA WAYLAND MALI_FBDEV VIVANTE_FBDEV NETWORKING NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO STRL STRCASESTR MMAP PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 SWRESAMPLE FFMPEG_AVCODEC_ENCODE_VIDEO2 BSV_MOVIE VIDEOCORE NEON FLOATHARD FLOATSOFTFP UDEV V4L2 AV_CHANNEL_LAYOUT 7ZIP PARPORT COCOA AVFOUNDATION CORELOCATION IOHIDMANAGER LIBRETRODB"
create_config_make config.mk $VARS
create_config_header config.h $VARS