[FFmpeg-devel] [PATCH] avutil: add API for mb types.
Rostislav Pehlivanov
atomnuker at gmail.com
Sun Nov 12 18:27:34 EET 2017
On 12 November 2017 at 16:21, Rostislav Pehlivanov <atomnuker at gmail.com>
wrote:
>
>
> On 12 November 2017 at 15:59, Michael Niedermayer <michael at niedermayer.cc>
> wrote:
>
>> This is based on motion_type.h
>>
>> TODO: docs & split into a commit per lib
>> Signed-off-by: Michael Niedermayer <michael at 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.
More information about the ffmpeg-devel
mailing list