mirror of
https://github.com/libretro/RetroArch
synced 2025-02-01 00:32:46 +00:00
Check recording based on g_extern.rec and not g_extern.recording.
Fixes some segfaults where g_extern.recording and g_extern.rec mismatch. Makes it possible to record without loading content directly from CLI.
This commit is contained in:
parent
fdf97f386e
commit
53bc4c08ed
2
driver.c
2
driver.c
@ -493,7 +493,7 @@ bool driver_update_system_av_info(const struct retro_system_av_info *info)
|
|||||||
// Cannot continue recording with different parameters.
|
// Cannot continue recording with different parameters.
|
||||||
// Take the easiest route out and just restart the recording.
|
// Take the easiest route out and just restart the recording.
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
if (g_extern.recording)
|
if (g_extern.rec)
|
||||||
{
|
{
|
||||||
static const char *msg = "Restarting FFmpeg recording due to driver reinit.";
|
static const char *msg = "Restarting FFmpeg recording due to driver reinit.";
|
||||||
msg_queue_push(g_extern.msg_queue, msg, 2, 180);
|
msg_queue_push(g_extern.msg_queue, msg, 2, 180);
|
||||||
|
@ -758,7 +758,7 @@ bool rarch_environment_cb(unsigned cmd, void *data)
|
|||||||
const struct retro_audio_callback *info = (const struct retro_audio_callback*)data;
|
const struct retro_audio_callback *info = (const struct retro_audio_callback*)data;
|
||||||
|
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
if (g_extern.recording) // A/V sync is a must.
|
if (g_extern.rec) // A/V sync is a must.
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
1
gfx/gl.c
1
gfx/gl.c
@ -1965,6 +1965,7 @@ static void gl_init_pbo_readback(void *data)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
gl_t *gl = (gl_t*)data;
|
gl_t *gl = (gl_t*)data;
|
||||||
// Only bother with this if we're doing FFmpeg GPU recording.
|
// Only bother with this if we're doing FFmpeg GPU recording.
|
||||||
|
// Check g_extern.recording and not g_extern.rec, because recording is not initialized yet.
|
||||||
gl->pbo_readback_enable = g_settings.video.gpu_record && g_extern.recording;
|
gl->pbo_readback_enable = g_settings.video.gpu_record && g_extern.recording;
|
||||||
if (!gl->pbo_readback_enable)
|
if (!gl->pbo_readback_enable)
|
||||||
return;
|
return;
|
||||||
|
26
retroarch.c
26
retroarch.c
@ -239,7 +239,6 @@ static void recording_dump_frame(const void *data, unsigned width, unsigned heig
|
|||||||
msg_queue_push(g_extern.msg_queue, msg, 1, 180);
|
msg_queue_push(g_extern.msg_queue, msg, 1, 180);
|
||||||
|
|
||||||
rarch_deinit_recording();
|
rarch_deinit_recording();
|
||||||
g_extern.recording = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,7 +298,7 @@ static void video_frame(const void *data, unsigned width, unsigned height, size_
|
|||||||
// Slightly messy code,
|
// Slightly messy code,
|
||||||
// but we really need to do processing before blocking on VSync for best possible scheduling.
|
// but we really need to do processing before blocking on VSync for best possible scheduling.
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
if (g_extern.recording && (!g_extern.filter.filter || !g_settings.video.post_filter_record || !data || g_extern.record_gpu_buffer))
|
if (g_extern.rec && (!g_extern.filter.filter || !g_settings.video.post_filter_record || !data || g_extern.record_gpu_buffer))
|
||||||
recording_dump_frame(data, width, height, pitch);
|
recording_dump_frame(data, width, height, pitch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -324,7 +323,7 @@ static void video_frame(const void *data, unsigned width, unsigned height, size_
|
|||||||
RARCH_PERFORMANCE_STOP(softfilter_process);
|
RARCH_PERFORMANCE_STOP(softfilter_process);
|
||||||
|
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
if (g_extern.recording && g_settings.video.post_filter_record)
|
if (g_extern.rec && g_settings.video.post_filter_record)
|
||||||
recording_dump_frame(g_extern.filter.buffer, owidth, oheight, opitch);
|
recording_dump_frame(g_extern.filter.buffer, owidth, oheight, opitch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -339,8 +338,8 @@ void rarch_render_cached_frame(void)
|
|||||||
{
|
{
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
// Cannot allow FFmpeg recording when pushing duped frames.
|
// Cannot allow FFmpeg recording when pushing duped frames.
|
||||||
bool recording = g_extern.recording;
|
void *recording = g_extern.rec;
|
||||||
g_extern.recording = false;
|
g_extern.rec = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const void *frame = g_extern.frame_cache.data;
|
const void *frame = g_extern.frame_cache.data;
|
||||||
@ -356,14 +355,14 @@ void rarch_render_cached_frame(void)
|
|||||||
g_extern.frame_cache.pitch);
|
g_extern.frame_cache.pitch);
|
||||||
|
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
g_extern.recording = recording;
|
g_extern.rec = recording;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool audio_flush(const int16_t *data, size_t samples)
|
static bool audio_flush(const int16_t *data, size_t samples)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
if (g_extern.recording)
|
if (g_extern.rec)
|
||||||
{
|
{
|
||||||
struct ffemu_audio_data ffemu_data = {0};
|
struct ffemu_audio_data ffemu_data = {0};
|
||||||
ffemu_data.data = data;
|
ffemu_data.data = data;
|
||||||
@ -1334,10 +1333,15 @@ void rarch_init_recording(void)
|
|||||||
if (!g_extern.recording)
|
if (!g_extern.recording)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (g_extern.libretro_dummy)
|
||||||
|
{
|
||||||
|
RARCH_WARN("Using libretro dummy core. Skipping recording.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_settings.video.gpu_record && g_extern.system.hw_render_callback.context_type)
|
if (!g_settings.video.gpu_record && g_extern.system.hw_render_callback.context_type)
|
||||||
{
|
{
|
||||||
RARCH_WARN("Libretro core is hardware rendered. Must use post-shaded FFmpeg recording as well.\n");
|
RARCH_WARN("Libretro core is hardware rendered. Must use post-shaded FFmpeg recording as well.\n");
|
||||||
g_extern.recording = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1367,7 +1371,6 @@ void rarch_init_recording(void)
|
|||||||
{
|
{
|
||||||
RARCH_ERR("Failed to get viewport information from video driver. "
|
RARCH_ERR("Failed to get viewport information from video driver. "
|
||||||
"Cannot start recording ...\n");
|
"Cannot start recording ...\n");
|
||||||
g_extern.recording = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1392,7 +1395,6 @@ void rarch_init_recording(void)
|
|||||||
if (!g_extern.record_gpu_buffer)
|
if (!g_extern.record_gpu_buffer)
|
||||||
{
|
{
|
||||||
RARCH_ERR("Failed to allocate GPU record buffer.\n");
|
RARCH_ERR("Failed to allocate GPU record buffer.\n");
|
||||||
g_extern.recording = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1430,8 +1432,6 @@ void rarch_init_recording(void)
|
|||||||
if (!ffemu_init_first(&g_extern.rec_driver, &g_extern.rec, ¶ms))
|
if (!ffemu_init_first(&g_extern.rec_driver, &g_extern.rec, ¶ms))
|
||||||
{
|
{
|
||||||
RARCH_ERR("Failed to start FFmpeg recording.\n");
|
RARCH_ERR("Failed to start FFmpeg recording.\n");
|
||||||
g_extern.recording = false;
|
|
||||||
|
|
||||||
free(g_extern.record_gpu_buffer);
|
free(g_extern.record_gpu_buffer);
|
||||||
g_extern.record_gpu_buffer = NULL;
|
g_extern.record_gpu_buffer = NULL;
|
||||||
}
|
}
|
||||||
@ -3030,7 +3030,7 @@ static inline void update_frame_time(void)
|
|||||||
|
|
||||||
bool is_locked_fps = g_extern.is_paused || driver.nonblock_state;
|
bool is_locked_fps = g_extern.is_paused || driver.nonblock_state;
|
||||||
#ifdef HAVE_RECORD
|
#ifdef HAVE_RECORD
|
||||||
is_locked_fps |= g_extern.recording;
|
is_locked_fps |= !!g_extern.rec;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!g_extern.system.frame_time_last || is_locked_fps)
|
if (!g_extern.system.frame_time_last || is_locked_fps)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user