On Fri, Aug 9, 2019 at 7:52 PM James Almer <jamr...@gmail.com> wrote: > > On 8/9/2019 2:38 PM, Juan De León wrote: > > 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 struct 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 <jua...@google.com> > > --- > > fixed a typo in frame.h comment > > libavutil/Makefile | 2 + > > libavutil/encode_info.c | 67 +++++++++++++++++++++++++++++++ > > libavutil/encode_info.h | 87 +++++++++++++++++++++++++++++++++++++++++ > > libavutil/frame.c | 1 + > > libavutil/frame.h | 7 ++++ > > 5 files changed, 164 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..68c30af4d7 > > --- /dev/null > > +++ b/libavutil/encode_info.c > > @@ -0,0 +1,67 @@ > > +/* > > + * 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; > > + size_t size = sizeof(AVEncodeInfoFrame) + > > sizeof(AVEncodeInfoBlock)*nb_blocks; > > + > > + 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)*nb_blocks; > > + > > + 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..cbe8be2891 > > --- /dev/null > > +++ b/libavutil/encode_info.h > > @@ -0,0 +1,87 @@ > > +/* > > + * 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]; > > +} AVEncodeInfoBlock; > > + > > +/** > > + * Frame encoding info, used as AVFrameSideData > > + */ > > +typedef struct AVEncodeInfoFrame { > > + /** > > + * Number of blocks in the array > > + */ > > + int nb_blocks; > > + /** > > + * Base plane quantizer for the frame, set to -1 when value is > > unsupported > > + */ > > + int plane_q[AV_NUM_DATA_POINTERS]; > > + /** > > + * DC/AC quantizer index delta, set to -1 when value is value > > unsupported. > > + */ > > + int ac_q, dc_q; > > + /** > > + * DC/AC chroma quantizer index delta, set to -1 when value is value > > unsupported. > > + */ > > + int ac_chroma_q, dc_chroma_q; > > + > > + uint8_t reserved[256]; > > + > > + AVEncodeInfoBlock blocks[]; > > Flexible array members will break compatibility with C++ projects. >
If its the last element in the struct, just make it blocks[1] or something and document that dynamically allocated data follows in its place. This is common-place even in C++ compatible structs. I believe we even use it in some structs ourself. - Hendrik _______________________________________________ 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".