[FFmpeg-devel] [PATCH] avutil: add API for mb types.

Rostislav Pehlivanov atomnuker at gmail.com
Sun Nov 12 18:21:15 EET 2017


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.



> +    /**
> +     * 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.



> +     * u32le number of blocks.
> +     * u32le size in bytes of each block.
> +     * block array.
> +     * @endcode
> +     */
> +    AV_FRAME_DATA_BLOCK_TYPE,
>  };
>
>  enum AVActiveFormatDescription {
> --
> 2.15.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list