[FFmpeg-devel] [PATCH 1/1] avutil/frame: Document the possibility of negative line sizes

Michael Niedermayer michael at niedermayer.cc
Tue Oct 12 14:01:04 EEST 2021


On Thu, Sep 30, 2021 at 03:30:54AM +0000, Soft Works wrote:
> Signed-off-by: softworkz <softworkz at hotmail.com>
> ---
>  libavutil/frame.h | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index ff2540a20f..f07e690410 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -304,7 +304,8 @@ typedef struct AVFrame {
>  #define AV_NUM_DATA_POINTERS 8
>      /**
>       * pointer to the picture/channel planes.
> -     * This might be different from the first allocated byte
> +     * This might be different from the first allocated byte. For video,
> +     * it could even point to the end of the image data.
>       *
>       * Some decoders access areas outside 0,0 - width,height, please
>       * see avcodec_align_dimensions2(). Some filters and swscale can read
> @@ -313,11 +314,16 @@ typedef struct AVFrame {
>       *
>       * NOTE: Except for hwaccel formats, pointers not needed by the format
>       * MUST be set to NULL.
> +     *
> +     * @attention In case of video, the data[] pointers can point to the
> +     * end of image data in order to reverse line order, when used in
> +     * combination with negative values in the linesize[] array.
>       */
>      uint8_t *data[AV_NUM_DATA_POINTERS];
>  
>      /**
> -     * For video, size in bytes of each picture line.
> +     * For video, a positive or negative value, the ABS() value of which is indicating
> +     * the size in bytes of each picture line.

from an API point of view linesize really can be anything as long as
1. alignment at the start is legal
2. width*pixelsize is within the array for height times linesize

linesize definitly can be multiple actual lines both positive and negative
so as to acccess even and odd fields of a frame
negative for fliping
but there is more
linesize could be 0 for a more compact representation of a read only
constant color frame.
someone might even point out that one can compress gradients with 
|linesize|<width
so i dont think the ABS() claim here is guranteed to work in every case

i dont think any actual code uses |linesize|<width && linesiez != 0, 
iam not so sure about the linesize = 0 case being used nowhere

[...]

thx

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Observe your enemies, for they first find out your faults. -- Antisthenes
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20211012/6d799ded/attachment.sig>


More information about the ffmpeg-devel mailing list