diff --git a/record/ffemu.c b/record/ffemu.c index 27aec22e8f..74b0ae3bd4 100644 --- a/record/ffemu.c +++ b/record/ffemu.c @@ -163,11 +163,10 @@ static bool init_video(struct video_info *video, struct ffemu_params *param) video->outbuf_size = 1 << 23; video->outbuf = av_malloc(video->outbuf_size); - // Just to make sure we can handle the biggest frames. - int size = avpicture_get_size(PIX_FMT_RGB32, param->fb_width, param->fb_height); + size_t size = avpicture_get_size(PIX_FMT_RGB32, param->out_width, param->out_height); video->conv_frame_buf = av_malloc(size); video->conv_frame = avcodec_alloc_frame(); - avpicture_fill((AVPicture*)video->conv_frame, video->conv_frame_buf, PIX_FMT_RGB32, param->fb_width, param->fb_height); + avpicture_fill((AVPicture*)video->conv_frame, video->conv_frame_buf, PIX_FMT_RGB32, param->out_width, param->out_height); return true; } @@ -382,8 +381,16 @@ int ffemu_push_video(ffemu_t *handle, const struct ffemu_video_data *data) } slock_lock(handle->lock); - fifo_write(handle->attr_fifo, data, sizeof(*data)); - fifo_write(handle->video_fifo, data->data, data->pitch * data->height); + + // Tightly pack our frame to conserve memory. libsnes tends to use a very large pitch. + struct ffemu_video_data attr_data = *data; + attr_data.pitch = attr_data.width * handle->video.pix_size; + fifo_write(handle->attr_fifo, &attr_data, sizeof(attr_data)); + + unsigned offset = 0; + for (unsigned y = 0; y < data->height; y++, offset += data->pitch) + fifo_write(handle->video_fifo, (const uint8_t*)data->data + offset, attr_data.pitch); + slock_unlock(handle->lock); scond_signal(handle->cond); @@ -434,7 +441,7 @@ static int ffemu_push_video_thread(ffemu_t *handle, const struct ffemu_video_dat int linesize = data->pitch; sws_scale(handle->video.sws_ctx, (const uint8_t* const*)&data->data, &linesize, 0, - handle->video.codec->height, handle->video.conv_frame->data, handle->video.conv_frame->linesize); + data->height, handle->video.conv_frame->data, handle->video.conv_frame->linesize); handle->video.conv_frame->pts = handle->video.frame_cnt; handle->video.conv_frame->display_picture_number = handle->video.frame_cnt; diff --git a/ssnes.c b/ssnes.c index 653f767342..01fa8073a6 100644 --- a/ssnes.c +++ b/ssnes.c @@ -404,7 +404,7 @@ static void print_help(void) #ifdef HAVE_FFMPEG puts("\t-r/--record: Path to record video file.\n\t\tUsing .mkv extension is recommended, and codecs used are FFV1/FLAC."); - puts("\t--size: Overrides output video size when recording with FFmpeg (format: width:height)."); + puts("\t--size: Overrides output video size when recording with FFmpeg (format: widthxheight)."); #endif puts("\t-v/--verbose: Verbose logging."); puts("\t-U/--ups: Specifies path for UPS patch that will be applied to ROM."); @@ -720,7 +720,7 @@ static void parse_input(int argc, char *argv[]) errno = 0; char *ptr; g_extern.record_width = strtoul(optarg, &ptr, 0); - if ((*ptr != ':') || errno) + if ((*ptr != 'x') || errno) { SSNES_ERR("Wrong format for --size.\n"); print_help(); @@ -879,7 +879,7 @@ static void init_recording(void) struct ffemu_params params = { .out_width = 256, .out_height = 224, - .fb_width = 1024, + .fb_width = 512, .fb_height = 512, .channels = 2, .samplerate = 32000, @@ -908,7 +908,7 @@ static void init_recording(void) unsigned max_width = 512; unsigned max_height = 512; g_extern.filter.psize(&max_width, &max_height); - params.fb_width = g_extern.filter.pitch >> 2; + params.fb_width = next_pow2(max_width); params.fb_height = next_pow2(max_height); }