[Cin] Cannot render above 60FPS
Andrew Randrianasulu
randrianasulu at gmail.com
Mon Jun 14 19:41:02 CEST 2021
See updated patch.
I tried few more fps choices - some work, but say 72/144 fps still do not
work with mpeg2 .. :/
On Monday, June 14, 2021, Andrew Randrianasulu <randrianasulu at gmail.com>
wrote:
> Ah, no - 23.97 and 59.94 fps/mpeg2 were broken!
>
> But with attached patch the seems to work again, as well as 100 fps
> mp4/x264 encoding (also tried mov)
>
> Can you test as much as possible various (long!) films / videos for desync
> problem?
>
> I also can try and add few more fps choices in this menu...
>
> On Monday, June 14, 2021, Andrew Randrianasulu <randrianasulu at gmail.com>
> wrote:
>
>>
>>
>> On Monday, June 14, 2021, gorge rankin via Cin <
>> cin at lists.cinelerra-gg.org> wrote:
>>
>>> Hello,
>>>
>>> I cannot seem to figure out how to render video over 60FPS.
>>>
>>
>>
>> Yes, i can confirm this bug.. Just set project/timeline to 100 fps and
>> got this..
>> After inspecting cinelerram/ffmpeg.C I tried few things, but working one
>> was just replacing this check_framerate function with std. function from
>> libavcodec:
>>
>> https://ffmpeg.org/doxygen/3.2/group__lavu__math__rational.h
>> tml#ga7dfd5ba1eb1edf5845ac32b338de9e76
>>
>> AVRational FFMPEG::to_sample_aspect_ratio(Asset *asset)
>> @@ -2917,7 +2919,8 @@ int FFMPEG::open_encoder(const char *type, const
>> char *spec)
>> int mask_h = (1<<desc->log2_chroma_h)-1;
>> ctx->height = (vid->height+mask_h) & ~mask_h;
>> ctx->sample_aspect_ratio =
>> to_sample_aspect_ratio(asset);
>> - AVRational frame_rate = check_frame_rate(codec->supported_framerates,
>> vid->frame_rate);
>> + //AVRational frame_rate = check_frame_rate(codec->supported_framerates,
>> vid->frame_rate);
>> + AVRational frame_rate = av_d2q(vid->frame_rate, 1000);
>> if( !frame_rate.num || !frame_rate.den ) {
>> eprintf(_("check_frame_rate failed
>> %s\n"), filename);
>> ret = 1;
>> I tested 29.97 encoding and 100 and 1000 fps encoding - they come out
>> correctly, according to ffprobe/mediainfo.
>>
>> Not sure why such strange convolved method of checking framerate was
>> choosen... Only mpeg1/2 in ffmpeg-4.4 set those .supported->framerates
>> arrays.. (grep supported_framerates libavcodec/*.c)
>>
>>
>> $ grep supported_framerates thirdparty/ffmpeg-4.4/libavcodec/*.c
>> thirdparty/ffmpeg-4.4/libavcodec/mpeg12enc.c: .supported_framerates =
>> ff_mpeg12_frame_rate_tab + 1,
>> thirdparty/ffmpeg-4.4/libavcodec/mpeg12enc.c: .supported_framerates =
>> ff_mpeg2_frame_rate_tab,
>> $
>>
>> In theory this fix should also 'fix' high-fps proxies with mpeg2
>> (non-standart stream, but only ffmpeg supposed to read it..) Just checked
>> ffmpeg/mpeg type and it works....
>>
>>
>>
>>
>>> I can do 60 FPS and below with no issue. Everything is rock solid
>>> stable and very performant.
>>>
>>> I am using Cin gg latest on Ubuntu.
>>>
>>> My source video is 2560x1440 at 90FPS.
>>>
>>> What I've been doing:
>>> - start new project
>>> - Settings -> Format, manually type 90.000 in "Frame Rate". Ensure that
>>> 2560 and 1440 are in Width and Height accordingly. Then I click apply,
>>> then click OK.
>>> - load my file through resources. right click on thumb of my video in
>>> resources, and choose "match all".
>>>
>>> Then when I render my project with "File Format" of "FFMPEG" and "type"
>>> of "mp4" I get these error message windows/errors:
>>>
>>> One error window with:
>>> ------------
>>> "Couldn't open /path/to/outfile.mp4"
>>> ------------
>>>
>>> and another window titled "Cinelerra: Messages" with this in it:
>>> --------------
>>> int FFMPEG:open_encoder(const char*, const char*):
>>> check_frame_rate failed /path/to/outfile.mp4
>>> ---------
>>>
>>>
>>> Am I doing something wrong?
>>>
>>> Thank you in advance.
>>>
>>>
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20210614/73e72ea1/attachment.htm>
-------------- next part --------------
diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index 96a5c385..f53bda8a 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -1856,12 +1856,15 @@ int FFMPEG::check_sample_rate(AVCodec *codec, int sample_rate)
return 0;
}
+// check_frame_rate and std_frame_rate needed for 23.976
+// and 59.94 fps mpeg2
static inline AVRational std_frame_rate(int i)
{
static const int m1 = 1001*12, m2 = 1000*12;
static const int freqs[] = {
40*m1, 48*m1, 50*m1, 60*m1, 80*m1,120*m1, 240*m1,
- 24*m2, 30*m2, 60*m2, 12*m2, 15*m2, 48*m2, 0,
+ 24*m2, 30*m2, 60*m2, 12*m2, 15*m2, 48*m2, 90*m2,
+ 100*m2, 120*m2, 144*m2, 72*m2, 0,
};
int freq = i<30*12 ? (i+1)*1001 : freqs[i-30*12];
return (AVRational) { freq, 1001*12 };
@@ -1877,6 +1880,7 @@ AVRational FFMPEG::check_frame_rate(const AVRational *p, double frame_rate)
if( err >= max_err ) continue;
max_err = err;
best_rate = rate;
+ //printf("framerate: %d\n", rate.num / rate.den);
}
return max_err < 0.0001 ? best_rate : (AVRational) { 0, 0 };
}
@@ -2917,7 +2921,12 @@ int FFMPEG::open_encoder(const char *type, const char *spec)
int mask_h = (1<<desc->log2_chroma_h)-1;
ctx->height = (vid->height+mask_h) & ~mask_h;
ctx->sample_aspect_ratio = to_sample_aspect_ratio(asset);
- AVRational frame_rate = check_frame_rate(codec->supported_framerates, vid->frame_rate);
+ AVRational frame_rate;
+ if (ctx->codec->id == AV_CODEC_ID_MPEG1VIDEO ||
+ ctx->codec->id == AV_CODEC_ID_MPEG2VIDEO)
+ frame_rate = check_frame_rate(codec->supported_framerates, vid->frame_rate);
+ else
+ frame_rate = av_d2q(vid->frame_rate, INT_MAX);
if( !frame_rate.num || !frame_rate.den ) {
eprintf(_("check_frame_rate failed %s\n"), filename);
ret = 1;
More information about the Cin
mailing list