On 12 November 2017 at 16:21, Rostislav Pehlivanov <atomnu...@gmail.com> wrote:
> > > On 12 November 2017 at 15:59, Michael Niedermayer <mich...@niedermayer.cc> > wrote: > >> This is based on motion_type.h >> >> TODO: docs & split into a commit per lib >> Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> >> --- >> libavcodec/avcodec.h | 4 ++ >> libavcodec/options_table.h | 1 + >> libavutil/block_type.h | 107 ++++++++++++++++++++++++++++++ >> +++++++++++++++ >> libavutil/frame.h | 14 ++++++ >> 4 files changed, 126 insertions(+) >> create mode 100644 libavutil/block_type.h >> >> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h >> index 15ca871b59..1a49fa0a9a 100644 >> --- a/libavcodec/avcodec.h >> +++ b/libavcodec/avcodec.h >> @@ -923,6 +923,10 @@ typedef struct RcOverride{ >> * Show all frames before the first keyframe >> */ >> #define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) >> +/** >> + * Export block types through frame side data >> + */ >> +#define AV_CODEC_FLAG2_EXPORT_BLOCKS (1 << 27) >> /** >> * Export motion vectors through frame side data >> */ >> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h >> index d89f58d540..0b86b4d0fb 100644 >> --- a/libavcodec/options_table.h >> +++ b/libavcodec/options_table.h >> @@ -74,6 +74,7 @@ static const AVOption avcodec_options[] = { >> {"chunks", "Frame data might be split into multiple chunks", 0, >> AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_CHUNKS }, INT_MIN, INT_MAX, V|D, >> "flags2"}, >> {"showall", "Show all frames before the first keyframe", 0, >> AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_SHOW_ALL }, INT_MIN, INT_MAX, >> V|D, "flags2"}, >> {"export_mvs", "export motion vectors through frame side data", 0, >> AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_EXPORT_MVS}, INT_MIN, INT_MAX, >> V|D, "flags2"}, >> +{"export_blocks", "export block types through frame side data", 0, >> AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_EXPORT_BLOCKS}, INT_MIN, INT_MAX, >> V|D, "flags2"}, >> {"skip_manual", "do not skip samples and export skip information as >> frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = >> AV_CODEC_FLAG2_SKIP_MANUAL}, INT_MIN, INT_MAX, V|D, "flags2"}, >> {"ass_ro_flush_noop", "do not reset ASS ReadOrder field on flush", 0, >> AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_RO_FLUSH_NOOP}, INT_MIN, INT_MAX, >> S|D, "flags2"}, >> {"time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, >> 0, INT_MAX}, >> diff --git a/libavutil/block_type.h b/libavutil/block_type.h >> new file mode 100644 >> index 0000000000..3f53f1d082 >> --- /dev/null >> +++ b/libavutil/block_type.h >> @@ -0,0 +1,107 @@ >> +/* >> + * 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_BLOCK_TYPE_H >> +#define AVUTIL_BLOCK_TYPE_H >> + >> +#include <stdint.h> >> + >> + >> +typedef struct AVBlockType { >> + /** >> + * Block type. >> + * 1: Prediction (this can be spatial prediction or motion >> compensation for example) >> + * 2: Transform >> + * 3: Residual >> + * 4: Filter >> + * 5: Metadata >> + * >> + * Multiple Filter, Transform and prediction blocks are allowed, for >> example >> + * for bidirectional motion compensation. Multiple residuals are >> allowed, for >> + * example DC and AC residual. >> + */ >> + uint8_t type; >> + /** >> + * Bitmask that lists which planes (for example: >> Y:1,Cb:2,Cr:4,Alpha:8) >> + * this block applies to. >> + */ >> + uint8_t plane_mask; >> + /** >> + * The field (top:1, bottom:2) this block applies to. >> + */ >> + uint8_t field_mask; >> + uint8_t name[16]; >> + /** >> + * Left Top corner position. This can be outside of the vissible >> frame. >> + */ >> + int32_t x, y; >> + /** >> + * Width and height of the block. >> + */ >> + uint16_t w, h; >> + /** >> + * Number identifying the slice the Block is in. >> + */ >> + uint16_t slice_num; >> + /** >> + * Location in bits where the block related information is stored. >> can be -1 >> + */ >> + uint32_t block_index, block_bits; >> + >> + /** >> + * Main Direction, 0 is horizontal, 48 is vertical, >> + * values 0 to 95 follow clockwise direction. >> + * 255 means that the block has no direction. >> + * This represents the main direction of a transform, prediction or >> filter >> + */ >> + uint8_t direction; >> + >> + /** >> + * Quantization parameter, a value of 0x8000 means lossless, 0x7FFF >> means not applicable >> + * for MC prediction this is the precission of the motion vector. >> + */ >> + int16_t qp; >> + >> > > Make 0 lossless. > Actually make this the delta from the plane quantizer > > > >> + /** >> + * Where the prediction comes from; negative value when it comes >> + * from the past, positive value when it comes from the future. >> + * 0 For Intra. >> + */ >> + int32_t source; >> + /** >> + * Motion vector >> + * src_x = dst_x + motion_x / qp >> + * src_y = dst_y + motion_y / qp >> + */ >> + int32_t motion_x, motion_y; >> + >> + /** >> + * Extra flag information. >> + */ >> + uint64_t flags; >> +#define AV_BLOCK_TYPE_FLAG_INTERLACED 0x0000001 ///< Block is >> interlaced >> + >> +#define AV_BLOCK_TYPE_FLAG_LEAF 0x0001000 ///< Block is a >> leaf block, it is not further split >> +#define AV_BLOCK_TYPE_FLAG_ROOT 0x0002000 ///< Block is a >> root block, it is not contained in a larger block >> + >> +#define AV_BLOCK_TYPE_FLAG_CONCEALED 0x0010000 ///< Block has >> been replaced by error conclealment >> +#define AV_BLOCK_TYPE_FLAG_DAMAGED 0x0020000 ///< Block has >> been damaged >> + >> +} AVBlockType; >> + >> +#endif /* AVUTIL_BLOCK_TYPE_H */ >> diff --git a/libavutil/frame.h b/libavutil/frame.h >> index d54bd9a354..fa2edea5b1 100644 >> --- a/libavutil/frame.h >> +++ b/libavutil/frame.h >> @@ -141,6 +141,20 @@ enum AVFrameSideDataType { >> * metadata key entry "name". >> */ >> AV_FRAME_DATA_ICC_PROFILE, >> + /** >> + * Block data exported by some codecs (on demand through the >> export_blocks >> + * flag set in the libavcodec AVCodecContext flags2 option). >> + * The data is the AVBlockType struct defined in >> + * libavutil/block_type.h. >> + * >> + * @code >> + * 24 byte string identifying the codec. >> > > Codec ID, 4 byte and profile/flavour, 4 byte. > > And add 8 bytes, 2 for each plane, to signal the plane-quantizer. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel