What i am trying to do is to use a ffmpeg to encode files to a custom codec
inside a quicktime container, and i have been using the transcode example as
reference https://www.ffmpeg.org/doxygen/4.1/transcoding_8c-example.html
I am able to register the codec, read the packages, and write to the output
file as expected.
The only thing i am dwelling with at the moment is that some codecs (e.g.
ProRes) tend to drain the memory usage.
When transcoding a prores file, looking at the memory profile, i can see that
av_interleaved_write_frame() is not freeing the memory allocated during the
encoding function.
av_interleaved_write_frame() will start freeing memory just after a "Delay
between the first packet and last packet in the muxing queue is 10004900 >
10000000: forcing output" log, and from that point on memory usage during
encode_write_frame() will be steady. In both case, reaching or not the "forcing
output" point, all the memory will be freed correctly at the end of the
transcoding. The problem is that when using high resolution files (>4K) the
app, which is 32bit, will run out of memory before getting to the "forcing
output" point. I could notice this behavior with quicktime files only, when
using h265 for example, av_interleaved_write_frame() will always free the
memory.
So if i guess correctly i should find some setting in the muxer to limit memory
usage / number of frames in the queue. At the moment i am setting
"max_interleave_delta" in the output format context, and it is working fine. I
have compared the quicktime header of files exported with and without the
"max_interleave_delta", and the only difference i could spot is that the frame
chucks are smaller on the latter, besides of that the files are then playing
correctly.
But, is this a correct way to limit the muxer queue? or am i missing some other
flag to set in the format context?
This is a file i am testing with:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
'C:\Users\simone\Videos\bbb_sunflower_2160p_30fps_normal_9sec.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2019-03-20T13:29:43.000000Z
Duration: 00:00:09.67, start: 0.000000, bitrate: 431795 kb/s
Stream #0:0(eng), 10, 1/30: Video: prores, 1 reference frame (apch /
0x68637061), yuv422p10le(bt709, progressive), 3840x2160, 0/1, 429391 kb/s, SAR
1:1 DAR 16:9, 30 fps, 30 tbr, 30 tbn, 30 tbc (default)
Metadata:
creation_time : 2019-03-20T13:29:43.000000Z
handler_name : Apple Alias Data Handler
encoder : Apple ProRes 422 HQ
timecode : 00:00:00:00
Stream #0:1(eng), 0, 1/48000: Audio: pcm_s16le (sowt / 0x74776F73), 48000
Hz, stereo, s16, 1536 kb/s (default)
Metadata:
creation_time : 2019-03-20T13:29:43.000000Z
handler_name : Apple Alias Data Handler
timecode : 00:00:00:00
Stream #0:2(eng), 0, 1/30: Data: none (tmcd / 0x64636D74), 0/1, 0 kb/s
(default)
Metadata:
creation_time : 2019-03-20T13:29:43.000000Z
handler_name : Apple Alias Data Handler
timecode : 00:00:00:00
Output #0, mov, to
'C:\Users\simone\Videos\bbb_sunflower_2160p_30fps_normal_9sec_AiM.mov':
Codec 0x8024 is not in the full list.
Stream #0:0, 0, 1/30: Video: unknown_codec (aaimv), 1 reference frame (AIVM
/ 0x4D564941), argb, 3840x2160, 0/1, q=2-31, 200 kb/s, 30 tbn, 30 tbc
Metadata:
encoder : AIM
Stream #0:1, 0, 1/48000: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream #0:2, 0, 0/0: Unknown: none
Thanks,
Simone.
________________________________
From: Libav-user [[email protected]] on behalf of Anton Shekhovtsov
[[email protected]]
Sent: Wednesday, March 20, 2019 10:21 AM
To: This list is about using libavcodec, libavformat, libavutil, libavdevice
and libavfilter.
Subject: Re: [Libav-user] 32bit transcoding app running out of memory / setting
"max_interleave_delta"
ср, 20 мар. 2019 г. в 12:13, Carl Eugen Hoyos
<[email protected]<mailto:[email protected]>>:
2019-03-20 11:06 GMT+01:00, Simone Donadini
<[email protected]<mailto:[email protected]>>:
> we are developing a 32bit transcoder using ffmpeg based on the
> transcoding example
> https://www.ffmpeg.org/doxygen/4.1/transcoding_8c-example.html
> and we are encountering some problem with memory usage
> transcoding files with large resolutions.
Please run massif (or an equivalent tool) to find out where
the memory allocations happen: Everything else includes
guesswork that can easily be avoided.
Please provide "ffmpeg -i" output for both input and output
file so we at least know what you are trying to do.
Carl Eugen
_______________________________________________
Libav-user mailing list
[email protected]<mailto:[email protected]>
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected]<mailto:[email protected]> with
subject "unsubscribe".
"Delay between the first packet and last packet in the muxing queue is 10004900
> 10000000: forcing output"
I can be wrong but does this warning tell the packets are coming in wrong order?
If you mux multiple streams (a+v) you should preinterleave streams packets with
enough accuracy, otherwise ffmpeg must buffer everything and this is where
memory is wasted.
_______________________________________________
Libav-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".