From patchwork Sun Feb 2 22:23:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 17673 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C97E444A6E2 for ; Mon, 3 Feb 2020 00:31:19 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B03C2687FD1; Mon, 3 Feb 2020 00:31:19 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8E109687FD1 for ; Mon, 3 Feb 2020 00:31:12 +0200 (EET) Received: by mail-qk1-f193.google.com with SMTP id w25so12453673qki.3 for ; Sun, 02 Feb 2020 14:31:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=8Dv6tFZotc16pqfAsXg5/bJcGkLAeM6tekBiHtmjdyI=; b=sPH0ac2vJhToPL8DOmKB7lWP+rRxzPVOC3vF4fu9GPKOnYgVD/M8CqpK2LxuAzUiQ9 iFMEC06HuGC5G5jeOH/zogthc+ByHjXFG7NcQ7JvQIB+uLlO1D9qzC60dFTnFCq8OFbm jq79QF1b+Neghej0IGq8FKi5vuEjaOFK+P3mBdD4d9VloARrhK5zgkEykGR4DqCAf0jR dZkmAk7A7zzyQQDpcXZMq2iXO1oynUJODdv8Eiw78U+/kW8O/XxL2lGNS9sowBLMU0gn uNcFQ4cEaTtPKNC1R+2RuURIyVfxke3h+Hs0r2GIbnduxacobcGSWhHat7xDVTTq7qUz 7+xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=8Dv6tFZotc16pqfAsXg5/bJcGkLAeM6tekBiHtmjdyI=; b=npUeW7fGlCl/P/OnhrCGZgTpr167TV4mGqG+hd8rIm5RH5ZY8h5MWK4tHVC24nUnTA lGFCq6AIb3ZfITUCuKAMPX4TplSkRY+Hq+y7XWOgG9SFJ9nmUHmukQLqxOBRxyVBX4HB sCEgxn+MnrDpJ+JmiJgMZih91zlwf6X1RFz3F8VNtqKQvbMZhMgWDw0Prfe57fDIJHrD kZrroSV9YoP+j19UefZydb7rdFMaw0o/JY7yszTN7a+iRGeKwr36s7jLaOsIDhtEpVXw RRkOo/O8aOBtmJLxyOCxD4EXSDs4LFcetelbrAyYVqkxxUwy+mNXC0qaYucHKpNaM5jI +36g== X-Gm-Message-State: APjAAAUtP4QK/hIK8JnsDw0naMdJ5rvhAqb8LB98vReW+Mo+yQjAifh3 ZOTC6iYjCBkIig/eKRdQqKKVSRWO X-Google-Smtp-Source: APXvYqwWnz1OO5rm+AKFvWGoGOHDGt77VwVvrDa6wBWnLDUeQLnaQ0VXj7qbAZj/W+dYjApYmT0SpQ== X-Received: by 2002:a05:620a:22f3:: with SMTP id p19mr4738812qki.200.1580682241539; Sun, 02 Feb 2020 14:24:01 -0800 (PST) Received: from localhost.localdomain ([191.83.214.69]) by smtp.gmail.com with ESMTPSA id z26sm8913184qtj.12.2020.02.02.14.24.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2020 14:24:01 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 2 Feb 2020 19:23:05 -0300 Message-Id: <20200202222307.10074-1-jamrial@gmail.com> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec: add an AVCodecContext field to signal types of packet, frame, and coded stream side data to export X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Deprecate flags2's export_mvs and add a replacement for it in export_side_data. Signed-off-by: James Almer --- TODO: Version bump and APIChanges entry. libavcodec/avcodec.h | 24 +++++++++++++++++++++++- libavcodec/mpegpicture.c | 2 +- libavcodec/mpegutils.c | 2 +- libavcodec/options_table.h | 4 +++- libavcodec/snowdec.c | 2 +- libavcodec/utils.c | 7 +++++++ libavcodec/version.h | 3 +++ 7 files changed, 39 insertions(+), 5 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 0e7ca1db4d..edd22f3cbe 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -956,10 +956,14 @@ typedef struct RcOverride{ * Show all frames before the first keyframe */ #define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) + +#if FF_API_FLAGS2_EXPORT_MVS /** - * Export motion vectors through frame side data + * Export motion vectors through frame side data. DEPRECATED!!!! */ #define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +#endif + /** * Do not skip samples and export skip information as frame side data */ @@ -1098,6 +1102,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. @@ -3395,6 +3407,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..ec17b20078 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -75,9 +75,11 @@ static const AVOption avcodec_options[] = { {"local_header", "place global headers at every keyframe instead of in extradata", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_LOCAL_HEADER }, INT_MIN, INT_MAX, V|E, "flags2"}, {"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_mvs", "export motion vectors through frame side data (Deprecated, see export_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, V|A|E|D|S, "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/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 c685b9c9d7..357e7d1db6 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -947,6 +947,13 @@ 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 FF_API_FLAGS2_EXPORT_MVS + if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) { + av_log(avctx, AV_LOG_WARNING, + "flags2 export_mvs is deprecated. Use export_side_data mvs instead\n"); + avctx->export_side_data |= AV_CODEC_EXPORT_DATA_MVS; + } +#endif 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 2fba26e8d0..aa6c6ae030 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -135,6 +135,9 @@ #ifndef FF_API_UNSANITIZED_BITRATES #define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_FLAGS2_EXPORT_MVS +#define FF_API_FLAGS2_EXPORT_MVS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #endif /* AVCODEC_VERSION_H */