[FFmpeg-devel] [PATCH] filter_design: document ownership and permissions.
Michael Niedermayer
michaelni at gmx.at
Sun Aug 12 16:18:46 CEST 2012
On Sun, Aug 12, 2012 at 02:00:03PM +0200, Nicolas George wrote:
>
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
> doc/filter_design.txt | 155 ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 154 insertions(+), 1 deletion(-)
>
>
> If what is stated below is considered correct, then the next task will be to
> ensure that all filters obey the rules (and I am fairly sure a lot of them
> do not).
>
>
> diff --git a/doc/filter_design.txt b/doc/filter_design.txt
> index 9e3eb3d..2754930 100644
> --- a/doc/filter_design.txt
> +++ b/doc/filter_design.txt
> @@ -33,7 +33,160 @@ Format negotiation
> Buffer references ownership and permissions
> ===========================================
>
> - TODO
> + Principle
> + ---------
> +
> + Audio and video data are voluminous; the buffer and buffer reference
> + mechanism is intended to avoid, as much as possible, expensive copies of
> + that data while still allowing the filters to produce correct results.
> +
> + The data is stored in buffers represented by AVFilterBuffer structures.
> + They must not be accessed directly, but through references stored in
> + AVFilterBufferRef structures. Several references can point to the
> + same buffer; the buffer is automatically deallocated once all
> + corresponding references have been destroyed.
> +
> + The characteristics of the data (resolution, sample rate, etc.) are
> + stored in the reference; different references for the same buffer can
> + show different characteristics. In particular, a video reference can
> + point to only a part of a video buffer.
> +
> + A reference is usually obtained as input to the start_frame or
> + filter_samples method or requested using the ff_get_video_buffer or
> + ff_get_audio_buffer functions. A new reference on an existing buffer can
> + be created with the avfilter_ref_buffer. A reference is destroyed using
> + the avfilter_unref_bufferp function.
> +
> + Reference ownership
> + -------------------
> +
> + At any time, a reference “belongs” to a particular piece of code,
> + usually a filter. With a few caveats that will be explained below, only
> + that piece of code is allowed to access it. It is also responsible for
> + destroying it, although this is sometimes done automatically (see the
> + section on link reference fields).
> +
> + Here are the (fairly obvious) rules for reference ownership:
> +
> + * A reference received by the start_frame or filter_samples method
> + belong to the corresponding filter.
> +
> + Special exception: for video references: it may be used internally for
> + automatic copying and must not be destroyed before end_frame; it can
> + be given away to ff_start_frame.
> +
> + * A reference passed to ff_start_frame or ff_filter_samples is given
> + away and must no longer be used.
> +
> + * A reference created with avfilter_ref_buffer belongs to the code that
> + created it.
> +
> + * A reference obtained with ff_get_video_buffer of ff_get_audio_buffer
> + belongs to the code that requested it.
> +
> + * A reference given as return value by the get_video_buffer or
> + get_audio_buffer method is given away and must no longer be used.
> +
> + Link reference fields
> + ---------------------
> +
> + The AVFilterLink structure has a few AVFilterBufferRef fields. Here are
> + the rules to handle them:
> +
> + * cur_buf is set before the start_frame and filter_samples methods to
> + the same reference given as argument to the methods and belongs to the
> + destination filter of the link. If it has not been cleared after
> + end_frame or filter_samples, libavfilter will automatically destroy
> + the reference; therefore, any filter that needs to keep the reference
> + for longer must set cur_buf to NULL.
> +
> + * out_buf belongs to the source filter of the link and can be used to
> + store a reference to the buffer that has been sent to the destination.
> + If it is not NULL after end_frame or filter_samples, libavfilter will
> + automatically destroy the reference.
> +
> + If a video input pad does not have a start_frame method, the default
> + method will allocate a buffer on the first output of the filter, store
> + the reference in out_buf and push a second reference to the output.
> +
> + * src_buf, cur_buf_copy and partial_buf are used by libavfilter
> + internally and must not be accessed by filters.
> +
> + Reference permissions
> + ---------------------
> +
> + The AVFilterBufferRef structure has a perms field that describes what
> + the code that owns the reference is allowed to do to the buffer data.
> + Different references for the same buffer can have different permissions.
> +
> + For video filters, the permissions only apply to the parts of the buffer
> + that have already been covered by the draw_slice method.
> +
> + The value is a binary OR of the following constants:
> +
> + * AV_PERM_READ: the owner can read the buffer data; this is essentially
> + always true and is there for self-documentation.
> +
> + * AV_PERM_WRITE: the owner can modify the buffer data.
> +
> + * AV_PERM_PRESERVE: the owner can rely on the fact that the buffer data
> + will not be modified by previous filters.
> +
> + * AV_PERM_REUSE: the owner can output the buffer several times, without
> + modifying the data in between.
> +
> + * AV_PERM_REUSE2: the owner can output the buffer several times an
> + modify the data in between (useless without the WRITE permissions).
> +
> + * AV_PERM_ALIGN: the owner can access the data using fast operations
> + that require data alignment.
> +
> + The READ, WRITE and PRESERVE permissions are about sharing the same
> + buffer between several filters to avoid expensive copies without them
> + doing conflicting changes on the data.
> +
> + The REUSE and REUSE2 permissions are about special memory for direct
> + rendering. For example a buffer directly allocated in video memory must
> + not modified once it is displayed on screen, or it will cause tearing;
> + it will therefore not have the REUSE2 permission.
> +
> + The ALIGN permission is about extracting part of the buffer, for
> + copy-less padding or cropping for example.
> +
> +
> + References received on input pads are guaranteed to have all the
> + permissions stated in the min_perms field and none of the permissions
> + stated in the rej_perms.
> +
> + References obtained by ff_get_video_buffer and ff_get_video_buffer are
> + guaranteed to have at least all the permissions requested as argument.
> +
> + References created by avfilter_ref_buffer have the same permissions as
> + the original reference minus the ones explicitly masked; the mask is
> + usually ~0 to keep the same permissions.
> +
> + Filters should remove permissions on reference they give to output
> + whenever necessary. It can be automatically done by setting the
> + rej_perms field on the output pad.
> +
> + Here are a few guidelines corresponding to common situations:
> +
> + * Filters that modify and forward their frame (like drawtext) need the
> + WRITE permission.
> +
> + * Filters that read their input to produce a new frame on output (like
> + scale) need the WRITE permission on input and WRITE permission on the
> + new buffer.
i think you meant, READ on input
except that it LGTM from a quick reading
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120812/6ba75b60/attachment.asc>
More information about the ffmpeg-devel
mailing list