[FFmpeg-devel] [PATCH] avutil: add API for mb types.
Michael Niedermayer
michael at niedermayer.cc
Sun Nov 12 17:59:47 EET 2017
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;
+
+ /**
+ * 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.
+ * u32le number of blocks.
+ * u32le size in bytes of each block.
+ * block array.
+ * @endcode
+ */
+ AV_FRAME_DATA_BLOCK_TYPE,
};
enum AVActiveFormatDescription {
--
2.15.0
More information about the ffmpeg-devel
mailing list