Adding some comments.

This commit is contained in:
Themaister 2011-01-04 23:55:29 +01:00
parent a9938a408d
commit 0e82a1a3ec
2 changed files with 23 additions and 6 deletions

View File

@ -57,12 +57,14 @@ struct ffemu
struct ffemu_params params; struct ffemu_params params;
}; };
// Currently hardcoded atm. :)
static int map_audio_codec(ffemu_audio_codec codec) static int map_audio_codec(ffemu_audio_codec codec)
{ {
(void)codec; (void)codec;
return CODEC_ID_FLAC; return CODEC_ID_VORBIS;
} }
// Currently hardcoded atm. :)
static int map_video_codec(ffemu_video_codec codec) static int map_video_codec(ffemu_video_codec codec)
{ {
(void)codec; (void)codec;
@ -78,6 +80,8 @@ static int init_audio(struct audio_info *audio, struct ffemu_params *param)
audio->codec = avcodec_alloc_context(); audio->codec = avcodec_alloc_context();
avcodec_get_context_defaults(audio->codec); avcodec_get_context_defaults(audio->codec);
// Hardcode this atm.
audio->codec->global_quality = 100000; audio->codec->global_quality = 100000;
audio->codec->flags |= CODEC_FLAG_QSCALE; audio->codec->flags |= CODEC_FLAG_QSCALE;
audio->codec->sample_rate = param->samplerate; audio->codec->sample_rate = param->samplerate;
@ -100,6 +104,7 @@ static int init_audio(struct audio_info *audio, struct ffemu_params *param)
return 0; return 0;
} }
// Hardcode.
static void init_x264_param(AVCodecContext *c) static void init_x264_param(AVCodecContext *c)
{ {
c->coder_type = 1; // coder = 1 c->coder_type = 1; // coder = 1
@ -141,6 +146,7 @@ static int init_video(struct video_info *video, struct ffemu_params *param)
video->codec->height = param->out_height; video->codec->height = param->out_height;
video->codec->time_base = (AVRational) {param->fps.den, param->fps.num}; video->codec->time_base = (AVRational) {param->fps.den, param->fps.num};
video->codec->crf = 25; video->codec->crf = 25;
// Might have to change this later to account for RGB codecs.
video->codec->pix_fmt = PIX_FMT_YUV420P; video->codec->pix_fmt = PIX_FMT_YUV420P;
///// Is this element in all recent ffmpeg versions? ///// Is this element in all recent ffmpeg versions?
video->codec->thread_count = 4; video->codec->thread_count = 4;
@ -151,6 +157,7 @@ static int init_video(struct video_info *video, struct ffemu_params *param)
if (avcodec_open(video->codec, codec) != 0) if (avcodec_open(video->codec, codec) != 0)
return -1; return -1;
// Allocate a big buffer :p ffmpeg API doesn't seem to give us some clues how big this buffer should be.
video->outbuf_size = 1000000; video->outbuf_size = 1000000;
video->outbuf = av_malloc(video->outbuf_size); video->outbuf = av_malloc(video->outbuf_size);
@ -264,12 +271,14 @@ void ffemu_free(ffemu_t *handle)
} }
} }
// Need to make this thread based, but hey.
int ffemu_push_video(ffemu_t *handle, const struct ffemu_video_data *data) int ffemu_push_video(ffemu_t *handle, const struct ffemu_video_data *data)
{ {
if (!handle->video.enabled) if (!handle->video.enabled)
return -1; return -1;
// This is deprecated, can't find a replacement... :( // This is deprecated, can't find a replacement... :(
// Hardcode pixel format for now (SNES)
struct SwsContext *conv_ctx = sws_getContext(data->width, data->height, PIX_FMT_RGB555LE, struct SwsContext *conv_ctx = sws_getContext(data->width, data->height, PIX_FMT_RGB555LE,
handle->params.out_width, handle->params.out_height, PIX_FMT_YUV420P, handle->params.rescaler == FFEMU_RESCALER_LANCZOS ? SWS_LANCZOS : SWS_POINT, handle->params.out_width, handle->params.out_height, PIX_FMT_YUV420P, handle->params.rescaler == FFEMU_RESCALER_LANCZOS ? SWS_LANCZOS : SWS_POINT,
NULL, NULL, NULL); NULL, NULL, NULL);
@ -283,6 +292,9 @@ int ffemu_push_video(ffemu_t *handle, const struct ffemu_video_data *data)
int outsize = avcodec_encode_video(handle->video.codec, handle->video.outbuf, handle->video.outbuf_size, handle->video.conv_frame); int outsize = avcodec_encode_video(handle->video.codec, handle->video.outbuf, handle->video.outbuf_size, handle->video.conv_frame);
if (outsize < 0)
return -1;
sws_freeContext(conv_ctx); sws_freeContext(conv_ctx);
AVPacket pkt; AVPacket pkt;
@ -333,8 +345,10 @@ int ffemu_push_audio(ffemu_t *handle, const struct ffemu_audio_data *data)
if (handle->audio.frames_in_buffer == (size_t)handle->audio.codec->frame_size) if (handle->audio.frames_in_buffer == (size_t)handle->audio.codec->frame_size)
{ {
size_t out_size = avcodec_encode_audio(handle->audio.codec, handle->audio.outbuf, handle->audio.outbuf_size, handle->audio.buffer); int out_size = avcodec_encode_audio(handle->audio.codec, handle->audio.outbuf, handle->audio.outbuf_size, handle->audio.buffer);
//fwrite(handle->audio.outbuf, 1, out_size, handle->audio.file); if (out_size < 0)
return -1;
pkt.size = out_size; pkt.size = out_size;
if (handle->audio.codec->coded_frame && handle->audio.codec->coded_frame->pts != AV_NOPTS_VALUE) if (handle->audio.codec->coded_frame && handle->audio.codec->coded_frame->pts != AV_NOPTS_VALUE)
{ {
@ -361,7 +375,7 @@ int ffemu_push_audio(ffemu_t *handle, const struct ffemu_audio_data *data)
int ffemu_finalize(ffemu_t *handle) int ffemu_finalize(ffemu_t *handle)
{ {
// Push out delayed frames. // Push out delayed frames. (MPEG codecs)
if (handle->video.enabled) if (handle->video.enabled)
{ {
AVPacket pkt; AVPacket pkt;
@ -390,6 +404,7 @@ int ffemu_finalize(ffemu_t *handle)
} while (out_size > 0); } while (out_size > 0);
} }
// Write final data.
av_write_trailer(handle->muxer.ctx); av_write_trailer(handle->muxer.ctx);
return 0; return 0;

View File

@ -88,7 +88,7 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height)
///////////// /////////////
struct ffemu_video_data ffemu_data = { struct ffemu_video_data ffemu_data = {
.data = data, .data = data,
.pitch = 2048, .pitch = height == 448 || height == 478 ? 1024 : 2048,
.width = width, .width = width,
.height = height .height = height
}; };
@ -358,6 +358,8 @@ int main(int argc, char *argv[])
load_save_file(g_extern.savefile_name_srm, SNES_MEMORY_CARTRIDGE_RAM); load_save_file(g_extern.savefile_name_srm, SNES_MEMORY_CARTRIDGE_RAM);
load_save_file(savefile_name_rtc, SNES_MEMORY_CARTRIDGE_RTC); load_save_file(savefile_name_rtc, SNES_MEMORY_CARTRIDGE_RTC);
struct ffemu_rational ntsc_fps = {60000, 1001};
struct ffemu_rational pal_fps = {50000, 1001};
//////// ////////
struct ffemu_params params = { struct ffemu_params params = {
.vcodec = FFEMU_VIDEO_H264, .vcodec = FFEMU_VIDEO_H264,
@ -368,7 +370,7 @@ int main(int argc, char *argv[])
.channels = 2, .channels = 2,
.samplerate = 32040, .samplerate = 32040,
.filename = "/tmp/ssnes.mkv", .filename = "/tmp/ssnes.mkv",
.fps = {60000, 1001}, .fps = snes_get_region() == SNES_REGION_NTSC ? ntsc_fps : pal_fps,
.aspect_ratio = 4.0/3 .aspect_ratio = 4.0/3
}; };
g_extern.rec = ffemu_new(&params); g_extern.rec = ffemu_new(&params);