[FFmpeg-devel] [RFC] Type descriptors
Jim DeLaHunt
list+ffmpeg-dev at jdlh.com
Thu Dec 31 22:15:45 EET 2020
On Thu Dec 31 15:35:38 EET 2020, Nicolas George <george at nsup.org> wrote:
> …For each simple type, including enumerations like AVColorRange and flat
> structures like AVReplayGain, have a set of standardized functions for
> common operations, including probably:
>
> - printing;
> - serializing to string;
> - parsing from string;
> …
> These functions will have a standardized name and prototype. They will be
> grouped in structures that describe a type entirely.
>
> Note: this project requires a good unified string API.
This relates to one of FFmpeg's imperfections: it writes human-readable
text to stdout and stderr in an unpredictable and inconsistent encoding.
It should be 100% consistently encoded. I suggest it should be Unicode
in UTF-8 code form.
One of the places where FFmpeg's inconsistent encoding caused me a
problem was when I was operating on a Quicktime video. FFmpeg (or
perhaps FFprobe) printed a 4-byte Quicktime tag literally to stdout. The
tag's byte sequence was not valid UTF-8. It messed up the output. That
tag, being arbitrary binary data, should have been escaped or printed in
hex or otherwise represented in valid UTF-8.
I suggest that the type descriptor[1] and Unified string / stream API[2]
proposals offer a good opportunity to define two separate data types:
string of text, and stream of bytes. Define encode functions to
transform text into bytes, and decode functions to transform bytes into
text. The Python language str, bytes, and codecs architecture[3] is a
pretty good model.
I suggest that FFmpeg define that strings of text always be stored as
UTF-8 code units. An argument could be made for defining strings of text
as being in any encoding, as long as every single string instance be
clearly labelled with its text encoding. (Specifying that all text is in
UTF-8 achieves clear labelling with no code.) I suggest requiring that
only validly-encoded data shall be permitted in text strings.
FFmpeg code often operates on byte-granularity binary data. These should
be defined as data types which are different than "string", because they
are not text.
FFmpeg generates human-readable output to stdout, to stderr, and to
logs. I suggest that all this output be required to be text strings,
preferably always in UTF-8. Any arbitrary binary data written to
human-readable output must be encoded or escaped somehow, so that it is
represented as valid text.
[1] https://ffmpeg.org/pipermail/ffmpeg-devel/2020-December/274170.html
[2] https://ffmpeg.org/pipermail/ffmpeg-devel/2020-December/274169.html
[3] https://docs.python.org/3/howto/unicode.html
This is an ambitious project. Good luck with it!
--Jim DeLaHunt, Vancouver, Canada
More information about the ffmpeg-devel
mailing list