[FFmpeg-devel] [PATCH 2/7] decode: add a method for attaching lavc-internal data to frames

wm4 nfxjfg at googlemail.com
Wed Oct 4 12:34:18 EEST 2017

On Wed, 4 Oct 2017 11:22:37 +0200
Michael Niedermayer <michael at niedermayer.cc> wrote:

> On Wed, Oct 04, 2017 at 09:12:29AM +0200, wm4 wrote:
> > On Tue, 3 Oct 2017 21:40:58 +0200
> > Michael Niedermayer <michael at niedermayer.cc> wrote:
> >   
> > > On Tue, Oct 03, 2017 at 03:15:13PM +0200, wm4 wrote:  
> > > > From: Anton Khirnov <anton at khirnov.net>
> > > >     
> > >   
> > > > Use the AVFrame.opaque_ref field. The original user's opaque_ref is
> > > > wrapped in the lavc struct and then unwrapped before the frame is
> > > > returned to the caller.    
> > > 
> > > this is a ugly hack
> > > 
> > > one and the same field should not be used to hold both the
> > > users opaque_ref as well as a structure which is itself not a user
> > > opaque_ref  
> > 
> > While the AVFrame is within libavcodec, it's libavcodec's frame, not
> > the user's. Thus your claim doesn't make too much sense. libavcodec
> > fully controls the meaning for its own AVFrames' opaque_ref, but
> > reconstruct the user's value when returning it.  
> i disagree

Well, you're wrong anyway.

> such hacks should not be added, we do have enough hacks already

It's not a hack.

> AVFrames are not really seperated into isolated classes
> There arent "the users AVFrames" vs. "the internal AVFrames"

Oh yes, there is the concept of an "owner" of an AVFrame, and the owner
of the AVFrame decides what opaque_ref means. It's quite literally for
free use by the owner of the reference.

That the code goes through some acrobatics to preserve opaque_ref as
passed in by get_buffer is just a feature.

> its fragile to create and maintain such seperation with interfaces
> that all wrap and unwrap the opaque_ref. Any mistake being a potential
> security issue and or crash

This is done strictly when returning a valid AVFrame, so there is no
room for mistakes.

> Its MUCH more robust and also easier to understand to use a sperate
> field

No, it's not. If you fail to do call post_process() on returned
AVFrames (which is done by the same code which exchanges opaque_ref)
you have bugs that violate the API or crash anyway.

> more so, opaque_ref is used in only 5 lines in the whole codebase,
> so there is not much code to consider when using a different solution

We shouldn't add such special fields, we have enough hacks already. Is
that your only suggestion how to do this? Because it's a bad one.

More information about the ffmpeg-devel mailing list