[FFmpeg-cvslog] avcodec: add an AVCodecContext field to signal types of packet, frame, and coded stream side data to export

James Almer git at videolan.org
Sun Feb 23 05:11:49 EET 2020


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Sun Feb  2 18:44:41 2020 -0300| [c6666894914ba8be1193ed81e9b6b737c68c29b6] | committer: James Almer

avcodec: add an AVCodecContext field to signal types of packet, frame, and coded stream side data to export

Add an initial mvs flag to is, analog to the export_mvs flags2 one.

Signed-off-by: James Almer <jamrial at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c6666894914ba8be1193ed81e9b6b737c68c29b6
---

 doc/APIchanges                       |  3 +++
 doc/codecs.texi                      |  9 +++++++++
 libavcodec/avcodec.h                 | 18 ++++++++++++++++++
 libavcodec/mpegpicture.c             |  2 +-
 libavcodec/mpegutils.c               |  2 +-
 libavcodec/options_table.h           |  2 ++
 libavcodec/pthread_frame.c           |  1 +
 libavcodec/snowdec.c                 |  2 +-
 libavcodec/utils.c                   |  3 +++
 libavcodec/version.h                 |  2 +-
 tests/ref/fate/api-mjpeg-codec-param |  2 ++
 tests/ref/fate/api-png-codec-param   |  2 ++
 12 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 761f37f2d2..aba4f5fd7a 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2020-02-21 - xxxxxxxxxx - lavc 58.73.100 - avcodec.h
+  Add AVCodecContext.export_side_data and AV_CODEC_EXPORT_DATA_MVS.
+
 2020-02-13 - xxxxxxxxxx - lavu 56.41.100 - tx.h
   Add AV_TX_INT32_FFT and AV_TX_INT32_MDCT
 
diff --git a/doc/codecs.texi b/doc/codecs.texi
index 15e55cca39..62090b3d51 100644
--- a/doc/codecs.texi
+++ b/doc/codecs.texi
@@ -788,6 +788,15 @@ Do not skip samples and export skip information as frame side data.
 Do not reset ASS ReadOrder field on flush.
 @end table
 
+ at item export_side_data @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+
+Possible values:
+ at table @samp
+ at item mvs
+Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
+for codecs that support it. See also @file{doc/examples/export_mvs.c}.
+ at end table
+
 @item error @var{integer} (@emph{encoding,video})
 
 @item qns @var{integer} (@emph{encoding,video})
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index fc6b71ce90..ba0fdd3493 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1103,6 +1103,14 @@ typedef struct RcOverride{
  */
 #define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)
 
+/* Exported side data.
+   These flags can be passed in AVCodecContext.export_side_data before initialization.
+*/
+/**
+ * Export motion vectors through frame side data
+ */
+#define AV_CODEC_EXPORT_DATA_MVS         (1 << 0)
+
 /**
  * Pan Scan area.
  * This specifies the area which should be displayed.
@@ -3400,6 +3408,16 @@ typedef struct AVCodecContext {
      * - encoding: set by user
      */
     int64_t max_samples;
+
+    /**
+     * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of
+     * metadata exported in frame, packet, or coded stream side data by
+     * decoders and encoders.
+     *
+     * - decoding: set by user
+     * - encoding: set by user
+     */
+    int export_side_data;
 } AVCodecContext;
 
 #if FF_API_CODEC_GET_SET
diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c
index ecbd77d50e..5fce25ec6e 100644
--- a/libavcodec/mpegpicture.c
+++ b/libavcodec/mpegpicture.c
@@ -211,7 +211,7 @@ static int alloc_picture_tables(AVCodecContext *avctx, Picture *pic, int encodin
 #if FF_API_DEBUG_MV
         avctx->debug_mv ||
 #endif
-        (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS)) {
+        (avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) {
         int mv_size        = 2 * (b8_array_size + 4) * sizeof(int16_t);
         int ref_index_size = 4 * mb_array_size;
 
diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c
index 3f94540616..c0ee3aae85 100644
--- a/libavcodec/mpegutils.c
+++ b/libavcodec/mpegutils.c
@@ -105,7 +105,7 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
                          int *low_delay,
                          int mb_width, int mb_height, int mb_stride, int quarter_sample)
 {
-    if ((avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) && mbtype_table && motion_val[0]) {
+    if ((avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) && mbtype_table && motion_val[0]) {
         const int shift = 1 + quarter_sample;
         const int scale = 1 << shift;
         const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index d4c0cdeb48..3f278d5c68 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -78,6 +78,8 @@ static const AVOption avcodec_options[] = {
 {"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"},
 {"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, A|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"},
+{"export_side_data", "Export metadata as side data", OFFSET(export_side_data), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, A|V|S|D|E, "export_side_data"},
+{"mvs", "export motion vectors through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_MVS}, INT_MIN, INT_MAX, V|D, "export_side_data"},
 {"time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, INT_MAX},
 {"g", "set the group of picture (GOP) size", OFFSET(gop_size), AV_OPT_TYPE_INT, {.i64 = 12 }, INT_MIN, INT_MAX, V|E},
 {"ar", "set audio sampling rate (in Hz)", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, A|D|E},
diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index 36ac0ac1e5..b5bd494474 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -334,6 +334,7 @@ static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
 
     dst->slice_flags = src->slice_flags;
     dst->flags2      = src->flags2;
+    dst->export_side_data = src->export_side_data;
 
     copy_fields(skip_loop_filter, subtitle_header);
 
diff --git a/libavcodec/snowdec.c b/libavcodec/snowdec.c
index 59bd24e881..519e377a11 100644
--- a/libavcodec/snowdec.c
+++ b/libavcodec/snowdec.c
@@ -502,7 +502,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
               );
 
     av_assert0(!s->avmv);
-    if (s->avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
+    if (s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) {
         s->avmv = av_malloc_array(s->b_width * s->b_height, sizeof(AVMotionVector) << (s->block_max_depth*2));
     }
     s->avmv_index = 0;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index dba2022478..c4dc136d3c 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -947,6 +947,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
         && avctx->codec_descriptor->type == AVMEDIA_TYPE_VIDEO)
         av_log(avctx, AV_LOG_WARNING,
                "gray decoding requested but not enabled at configuration time\n");
+    if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
+        avctx->export_side_data |= AV_CODEC_EXPORT_DATA_MVS;
+    }
 
     if (   avctx->codec->init && (!(avctx->active_thread_type&FF_THREAD_FRAME)
         || avci->frame_thread_encoder)) {
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 91e36675ca..c2b5864e5f 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  58
-#define LIBAVCODEC_VERSION_MINOR  72
+#define LIBAVCODEC_VERSION_MINOR  73
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
diff --git a/tests/ref/fate/api-mjpeg-codec-param b/tests/ref/fate/api-mjpeg-codec-param
index e55cef0eb9..82e3313aa9 100644
--- a/tests/ref/fate/api-mjpeg-codec-param
+++ b/tests/ref/fate/api-mjpeg-codec-param
@@ -4,6 +4,7 @@ stream=0, decode=0
     bt=4000000
     flags=0x00000000
     flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -146,6 +147,7 @@ stream=0, decode=1
     bt=4000000
     flags=0x00000000
     flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
diff --git a/tests/ref/fate/api-png-codec-param b/tests/ref/fate/api-png-codec-param
index c04c8cc7c1..7adaa5260d 100644
--- a/tests/ref/fate/api-png-codec-param
+++ b/tests/ref/fate/api-png-codec-param
@@ -4,6 +4,7 @@ stream=0, decode=0
     bt=4000000
     flags=0x00000000
     flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -146,6 +147,7 @@ stream=0, decode=1
     bt=4000000
     flags=0x00000000
     flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0



More information about the ffmpeg-cvslog mailing list