Some fixes to FFmpeg. Conserves RAM better.

This commit is contained in:
Themaister 2011-10-07 00:04:52 +02:00
parent 08ca1a54d3
commit d2bc4096de
2 changed files with 17 additions and 10 deletions

View File

@ -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;

View File

@ -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);
}