From cdcbedc65b942e006775fb105363a82b6eb2f91e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 23 Jul 2020 21:55:05 -0700 Subject: [PATCH] FFmpeg: Backport and improve some API from medusa --- src/feature/ffmpeg/ffmpeg-encoder.c | 15 +++++++++++++-- src/feature/ffmpeg/ffmpeg-encoder.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/feature/ffmpeg/ffmpeg-encoder.c b/src/feature/ffmpeg/ffmpeg-encoder.c index 04501c901..948822b26 100644 --- a/src/feature/ffmpeg/ffmpeg-encoder.c +++ b/src/feature/ffmpeg/ffmpeg-encoder.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -92,6 +93,7 @@ void FFmpegEncoderInit(struct FFmpegEncoder* encoder) { encoder->source = NULL; encoder->sink = NULL; encoder->sinkFrame = NULL; + FFmpegEncoderSetInputFrameRate(encoder, VIDEO_TOTAL_LENGTH, GBA_ARM7TDMI_FREQUENCY); int i; for (i = 0; i < FFMPEG_FILTERS_MAX; ++i) { @@ -363,8 +365,8 @@ bool FFmpegEncoderOpen(struct FFmpegEncoder* encoder, const char* outfile) { encoder->video->bit_rate = encoder->videoBitrate; encoder->video->width = encoder->width; encoder->video->height = encoder->height; - encoder->video->time_base = (AVRational) { VIDEO_TOTAL_LENGTH * encoder->frameskip, GBA_ARM7TDMI_FREQUENCY }; - encoder->video->framerate = (AVRational) { GBA_ARM7TDMI_FREQUENCY, VIDEO_TOTAL_LENGTH * encoder->frameskip }; + encoder->video->time_base = (AVRational) { encoder->frameCycles * encoder->frameskip, encoder->cycles }; + encoder->video->framerate = (AVRational) { encoder->cycles, encoder->frameCycles * encoder->frameskip }; encoder->videoStream->time_base = encoder->video->time_base; encoder->videoStream->avg_frame_rate = encoder->video->framerate; encoder->video->pix_fmt = encoder->pixFormat; @@ -821,3 +823,12 @@ static void _ffmpegSetVideoDimensions(struct mAVStream* stream, unsigned width, encoder->videoFrame->width, encoder->videoFrame->height, encoder->videoFrame->format, SWS_POINT, 0, 0, 0); } + +void FFmpegEncoderSetInputFrameRate(struct FFmpegEncoder* encoder, int numerator, int denominator) { + reduceFraction(&numerator, &denominator); + encoder->frameCycles = numerator; + encoder->cycles = denominator; + if (encoder->video) { + encoder->video->framerate = (AVRational) { denominator, numerator * encoder->frameskip }; + } +} \ No newline at end of file diff --git a/src/feature/ffmpeg/ffmpeg-encoder.h b/src/feature/ffmpeg/ffmpeg-encoder.h index 9c2366277..746e8c46e 100644 --- a/src/feature/ffmpeg/ffmpeg-encoder.h +++ b/src/feature/ffmpeg/ffmpeg-encoder.h @@ -78,6 +78,8 @@ struct FFmpegEncoder { int height; int iwidth; int iheight; + int frameCycles; + int cycles; int frameskip; int skipResidue; bool loop; @@ -97,6 +99,7 @@ bool FFmpegEncoderSetAudio(struct FFmpegEncoder*, const char* acodec, unsigned a bool FFmpegEncoderSetVideo(struct FFmpegEncoder*, const char* vcodec, unsigned vbr, int frameskip); bool FFmpegEncoderSetContainer(struct FFmpegEncoder*, const char* container); void FFmpegEncoderSetDimensions(struct FFmpegEncoder*, int width, int height); +void FFmpegEncoderSetInputFrameRate(struct FFmpegEncoder*, int numerator, int denominator); void FFmpegEncoderSetLooping(struct FFmpegEncoder*, bool loop); bool FFmpegEncoderVerifyContainer(struct FFmpegEncoder*); bool FFmpegEncoderOpen(struct FFmpegEncoder*, const char* outfile);