[FFmpeg-devel] [PATCH] libavutil: AVEncodeInfo data structures

Lynne dev at lynne.ee
Sat Aug 10 01:10:28 EEST 2019


Aug 9, 2019, 22:54 by george at nsup.org:

> Juan De León (12019-08-09):
>
>> AVEncodeInfoFrame data structure to store as AVFrameSideData of type
>> AV_FRAME_DATA_ENCODE_INFO.
>> The structure stores quantization index for each plane, DC/AC deltas
>> for luma and chroma planes, and an array of AVEncodeInfoBlock type
>> denoting position, size, and delta quantizer for each block in the
>> frame.
>> Can be extended to support extraction of other block information.
>>
>> Signed-off-by: Juan De León <juandl at google.com>
>> ---
>>  libavutil/Makefile      |  2 +
>>  libavutil/encode_info.c | 68 +++++++++++++++++++++++++++++++
>>  libavutil/encode_info.h | 90 +++++++++++++++++++++++++++++++++++++++++
>>  libavutil/frame.c       |  1 +
>>  libavutil/frame.h       |  7 ++++
>>  5 files changed, 168 insertions(+)
>>  create mode 100644 libavutil/encode_info.c
>>  create mode 100644 libavutil/encode_info.h
>>
>> diff --git a/libavutil/Makefile b/libavutil/Makefile
>> index 57e6e3d7e8..37cfb099e9 100644
>> --- a/libavutil/Makefile
>> +++ b/libavutil/Makefile
>> @@ -24,6 +24,7 @@ HEADERS = adler32.h                                                     \
>>  dict.h                                                        \
>>  display.h                                                     \
>>  downmix_info.h                                                \
>> +          encode_info.h                                                 \
>>  encryption_info.h                                             \
>>  error.h                                                       \
>>  eval.h                                                        \
>> @@ -111,6 +112,7 @@ OBJS = adler32.o                                                        \
>>  dict.o                                                           \
>>  display.o                                                        \
>>  downmix_info.o                                                   \
>> +       encode_info.o                                                    \
>>  encryption_info.o                                                \
>>  error.o                                                          \
>>  eval.o                                                           \
>> diff --git a/libavutil/encode_info.c b/libavutil/encode_info.c
>> new file mode 100644
>> index 0000000000..6d832b2e36
>> --- /dev/null
>> +++ b/libavutil/encode_info.c
>> @@ -0,0 +1,68 @@
>> +/*
>> + * This file is part of FFmpeg.
>> + *
>> + * FFmpeg is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * FFmpeg is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with FFmpeg; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> + */
>> +
>> +#include "libavutil/encode_info.h"
>> +#include "libavutil/mem.h"
>> +
>> +static int init_encode_info_data(AVEncodeInfoFrame *ptr, int nb_blocks) {
>> +    ptr->nb_blocks = nb_blocks;
>> +    ptr->dc_q = ptr->ac_q = -1;
>> +    ptr->dc_chroma_q = ptr->ac_chroma_q = -1;
>> +
>> +    for(int i=0;i<AV_NUM_DATA_POINTERS;i++)
>> +        ptr->plane_q[i] = -1;
>> +
>> +    return 0;
>> +}
>> +
>> +AVEncodeInfoFrame *av_encode_info_alloc(int nb_blocks)
>> +{
>> +    AVEncodeInfoFrame *ptr;
>> +    //AVEncodeInfoFrame already allocates size for one element of AVEncodeInfoBlock
>> +    size_t size = sizeof(AVEncodeInfoFrame) + sizeof(AVEncodeInfoBlock)*FFMIN(nb_blocks-1, 0);
>> +
>> +    if (nb_blocks < 0 || size >= INT_MAX)
>> +        return NULL;
>> +
>> +    ptr = av_mallocz(size);
>> +    if (!ptr)
>> +        return NULL;
>> +
>> +    init_encode_info_data(ptr, nb_blocks);
>> +
>> +    return ptr;
>> +}
>> +
>> +AVEncodeInfoFrame *av_encode_info_create_side_data(AVFrame *frame, int nb_blocks)
>> +{
>> +    size_t size = sizeof(AVEncodeInfoFrame) + sizeof(AVEncodeInfoBlock)*FFMIN(nb_blocks-1, 0);
>> +
>> +    if (nb_blocks < 0 || size >= INT_MAX)
>> +        return NULL;
>> +
>> +    AVFrameSideData *sd = av_frame_new_side_data(frame,
>> +                                                 AV_FRAME_DATA_ENCODE_INFO,
>> +                                                 size);
>> +    if (!sd)
>> +        return NULL;
>> +
>> +    memset(sd->data, 0, size);
>> +    init_encode_info_data((AVEncodeInfoFrame*)sd->data, nb_blocks);
>> +
>> +    return (AVEncodeInfoFrame*)sd->data;
>> +}
>> diff --git a/libavutil/encode_info.h b/libavutil/encode_info.h
>> new file mode 100644
>> index 0000000000..f4175b43c9
>> --- /dev/null
>> +++ b/libavutil/encode_info.h
>> @@ -0,0 +1,90 @@
>> +/*
>> + * This file is part of FFmpeg.
>> + *
>> + * FFmpeg is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * FFmpeg is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with FFmpeg; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> + */
>> +
>> +#ifndef AVUTIL_ENCODE_INFO_H
>> +#define AVUTIL_ENCODE_INFO_H
>> +
>> +#include "libavutil/frame.h"
>> +
>> +/**
>> + * Data structure for extracting block data stored in an array in AVEncodeInfoFrame
>> + */
>> +typedef struct AVEncodeInfoBlock{
>> +    /**
>> +     * Distance in luma pixels from the top-left corner of the visible frame
>> +     * to the top-left corner of the block.
>> +     * Can be negative if top/right padding is present on the coded frame.
>> +     */
>> +    int src_x, src_y;
>> +    /**
>> +     * Width and height of the block in luma pixels
>> +     */
>> +    int w, h;
>> +    /**
>> +     * Delta quantization index for the block
>> +     */
>> +    int delta_q;
>> +
>>
>> +    uint8_t reserved[128];
>>
>
> What are these (this one and the one below) reserved fields for?
>

For future extensions without breaking the API. Things like block type, prediction type, motion vectors, references, etc.


More information about the ffmpeg-devel mailing list