Aug 9, 2019, 22:54 by geo...@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 <jua...@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. _______________________________________________ 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".