On 8/22/2021 4:49 PM, Jesse Obic wrote:
I'm looking at implementing https://trac.ffmpeg.org/ticket/4448
<https://trac.ffmpeg.org/ticket/4448>, and I understand what I need to
do but I'm on the fence about how I should go about doing it.
For the OGG container, cover art is embedded into the file by adding a
METADATA_BLOCK_PICTURE tag in the vorbis comment section. The data of
this tag is a base64 representation of the FLAC embedded image data
structure, which includes the data of the image itself.
I looked at how vorbis comments are currently written, and it's lead me
to `ff_vorbiscomment_write`. It takes in an AVDictionary for metadata,
and an array of AVChapters for chapter writing. This is where I get a
bit concerned.
I see two options as to how I could handle this:
1. Place the METADATA_BLOCK_PICTURE tag in the metadata AVDictionary.
This would be the easiest functionality wise, however it feels like a
bad idea in my gut because the dictionary would be housing a value that
is 1.33 * the size of the image(s) being embedded. So for example, if
you wished to embed a 12 MB image it would require a 16MB malloc which
doesn't feel right.
Would allocating 16M really be a lot, given typically there wouldn't be
many of them?
2. Change ff_vorbiscomment_write to take in an array of AVStream /
AVPacket to write it directly to the output IO stream
As far as I know this would classify as an API/ABI change. However it
would mean that I don't have to allocate such a huge array upfront, and
can encode smaller chunks at a time as I write them to the output stream.
To mitigate it, it could be created as a new function with the
additional parameters, and the old function pointing towards the new one
instead. I'm not entirely sure how APIs / ABIs are exposed and consumed
in C, so I'm not sure if this will fix the issue.
What if.. LOB value reference support was added to AVDictionary, via a
av_dict_set_lob() function and AVDictionaryEntry->lob field. And anytime
av_dict_get() is called without a AV_DICT_NO_RESOLVE flag, it would
simply do a lazy resolve if it lob != NULL and fill in value field (if
not already resolved, of course). This would allow a LOB aware callers
to stream it when it is a LOB (use 'value' when not NULL). It should
even be API/ABI change safe (unless making AVDictionaryEntry bigger
counts as a break).
Anyway.. just a third option.
Oh, and on a side note: av_dict_get() should _probably_ be changed to
return a const AVDictionaryEntry * at some point, since it is internal
and really should never be modified by the caller.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".