diff options
author | James Almer <jamrial@gmail.com> | 2020-02-02 18:44:41 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2020-02-22 23:19:07 -0300 |
commit | c6666894914ba8be1193ed81e9b6b737c68c29b6 (patch) | |
tree | 5ade4736c2bf0dd32eed59156a78a162c05522fa | |
parent | 5dda6c173f8c8d169f934731e31d34c1fe5da75a (diff) | |
download | ffmpeg-c6666894914ba8be1193ed81e9b6b737c68c29b6.tar.gz |
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@gmail.com>
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | doc/codecs.texi | 9 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 18 | ||||
-rw-r--r-- | libavcodec/mpegpicture.c | 2 | ||||
-rw-r--r-- | libavcodec/mpegutils.c | 2 | ||||
-rw-r--r-- | libavcodec/options_table.h | 2 | ||||
-rw-r--r-- | libavcodec/pthread_frame.c | 1 | ||||
-rw-r--r-- | libavcodec/snowdec.c | 2 | ||||
-rw-r--r-- | libavcodec/utils.c | 3 | ||||
-rw-r--r-- | libavcodec/version.h | 2 | ||||
-rw-r--r-- | tests/ref/fate/api-mjpeg-codec-param | 2 | ||||
-rw-r--r-- | 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 +@item export_side_data @var{flags} (@emph{decoding/encoding,audio,video,subtitles}) + +Possible values: +@table @samp +@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}. +@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 |