From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 26/41] avcodec/mpegvideo: Move input_picture list to MPVMainEncContext
Date: Sun, 30 Jan 2022 07:27:34 +0100
Message-ID: <AM7PR03MB6660A216EA888AA6335F3A2C8F249@AM7PR03MB6660.eurprd03.prod.outlook.com> (raw)
In-Reply-To: <AM7PR03MB666068B09E9D0014E1CC65DD8F249@AM7PR03MB6660.eurprd03.prod.outlook.com>
Also avoid an allocation while doing so.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/mpegvideo.h | 1 -
libavcodec/mpegvideo_enc.c | 60 ++++++++++++++++++--------------------
libavcodec/mpegvideoenc.h | 2 ++
3 files changed, 31 insertions(+), 32 deletions(-)
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index a334acb3aa..98810ea231 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -118,7 +118,6 @@ typedef struct MPVContext {
ptrdiff_t linesize; ///< line size, in bytes, may be different from width
ptrdiff_t uvlinesize; ///< line size, for chroma in bytes, may be different from width
Picture *picture; ///< main picture buffer
- Picture **input_picture; ///< next pictures on display order for encoding
Picture **reordered_input_picture; ///< pointer to the next pictures in coded order for encoding
/** bit output */
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 9b05b44d36..1cf194dcaf 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -825,7 +825,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
!FF_ALLOCZ_TYPED_ARRAY(s->q_intra_matrix16, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_chroma_intra_matrix16, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_inter_matrix16, 32) ||
- !FF_ALLOCZ_TYPED_ARRAY(s->input_picture, MAX_PICTURE_COUNT) ||
!FF_ALLOCZ_TYPED_ARRAY(s->reordered_input_picture, MAX_PICTURE_COUNT))
return AVERROR(ENOMEM);
@@ -952,7 +951,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
av_freep(&s->q_inter_matrix);
av_freep(&s->q_intra_matrix16);
av_freep(&s->q_inter_matrix16);
- av_freep(&s->input_picture);
av_freep(&s->reordered_input_picture);
av_freep(&s->dct_offset);
@@ -1137,9 +1135,9 @@ static int load_input_picture(MPVMainEncContext *m, const AVFrame *pic_arg)
pic->f->pts = pts; // we set this here to avoid modifying pic_arg
} else {
/* Flushing: When we have not received enough input frames,
- * ensure s->input_picture[0] contains the first picture */
+ * ensure m->input_picture[0] contains the first picture */
for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
- if (s->input_picture[flush_offset])
+ if (m->input_picture[flush_offset])
break;
if (flush_offset <= 1)
@@ -1150,9 +1148,9 @@ static int load_input_picture(MPVMainEncContext *m, const AVFrame *pic_arg)
/* shift buffer entries */
for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
- s->input_picture[i - flush_offset] = s->input_picture[i];
+ m->input_picture[i - flush_offset] = m->input_picture[i];
- s->input_picture[encoding_delay] = (Picture*) pic;
+ m->input_picture[encoding_delay] = (Picture*) pic;
return 0;
}
@@ -1249,11 +1247,11 @@ static int estimate_best_b_count(MPVMainEncContext *m)
FF_LAMBDA_SHIFT;
for (i = 0; i < s->max_b_frames + 2; i++) {
- Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
+ Picture pre_input, *pre_input_ptr = i ? m->input_picture[i - 1] :
s->next_picture_ptr;
uint8_t *data[4];
- if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
+ if (pre_input_ptr && (!i || m->input_picture[i - 1])) {
pre_input = *pre_input_ptr;
memcpy(data, pre_input_ptr->f->data, sizeof(data));
@@ -1285,7 +1283,7 @@ static int estimate_best_b_count(MPVMainEncContext *m)
AVCodecContext *c;
int64_t rd = 0;
- if (!s->input_picture[j])
+ if (!m->input_picture[j])
break;
c = avcodec_alloc_context3(NULL);
@@ -1377,13 +1375,13 @@ static int select_input_picture(MPVMainEncContext *m)
s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
/* set next picture type & ordering */
- if (!s->reordered_input_picture[0] && s->input_picture[0]) {
+ if (!s->reordered_input_picture[0] && m->input_picture[0]) {
if (s->frame_skip_threshold || s->frame_skip_factor) {
if (m->picture_in_gop_number < m->gop_size &&
s->next_picture_ptr &&
- skip_check(m, s->input_picture[0], s->next_picture_ptr)) {
+ skip_check(m, m->input_picture[0], s->next_picture_ptr)) {
// FIXME check that the gop check above is +-1 correct
- av_frame_unref(s->input_picture[0]->f);
+ av_frame_unref(m->input_picture[0]->f);
ff_vbv_update(m, 0);
@@ -1393,7 +1391,7 @@ static int select_input_picture(MPVMainEncContext *m)
if (/*s->picture_in_gop_number >= s->gop_size ||*/
!s->next_picture_ptr || s->intra_only) {
- s->reordered_input_picture[0] = s->input_picture[0];
+ s->reordered_input_picture[0] = m->input_picture[0];
s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
s->reordered_input_picture[0]->f->coded_picture_number =
s->coded_picture_number++;
@@ -1402,38 +1400,38 @@ static int select_input_picture(MPVMainEncContext *m)
if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
for (i = 0; i < s->max_b_frames + 1; i++) {
- int pict_num = s->input_picture[0]->f->display_picture_number + i;
+ int pict_num = m->input_picture[0]->f->display_picture_number + i;
if (pict_num >= m->rc_context.num_entries)
break;
- if (!s->input_picture[i]) {
+ if (!m->input_picture[i]) {
m->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
break;
}
- s->input_picture[i]->f->pict_type =
+ m->input_picture[i]->f->pict_type =
m->rc_context.entry[pict_num].new_pict_type;
}
}
if (m->b_frame_strategy == 0) {
b_frames = s->max_b_frames;
- while (b_frames && !s->input_picture[b_frames])
+ while (b_frames && !m->input_picture[b_frames])
b_frames--;
} else if (m->b_frame_strategy == 1) {
for (i = 1; i < s->max_b_frames + 1; i++) {
- if (s->input_picture[i] &&
- s->input_picture[i]->b_frame_score == 0) {
- s->input_picture[i]->b_frame_score =
+ if (m->input_picture[i] &&
+ m->input_picture[i]->b_frame_score == 0) {
+ m->input_picture[i]->b_frame_score =
get_intra_count(s,
- s->input_picture[i ]->f->data[0],
- s->input_picture[i - 1]->f->data[0],
+ m->input_picture[i ]->f->data[0],
+ m->input_picture[i - 1]->f->data[0],
s->linesize) + 1;
}
}
for (i = 0; i < s->max_b_frames + 1; i++) {
- if (!s->input_picture[i] ||
- s->input_picture[i]->b_frame_score - 1 >
+ if (!m->input_picture[i] ||
+ m->input_picture[i]->b_frame_score - 1 >
s->mb_num / m->b_sensitivity)
break;
}
@@ -1442,7 +1440,7 @@ static int select_input_picture(MPVMainEncContext *m)
/* reset scores */
for (i = 0; i < b_frames + 1; i++) {
- s->input_picture[i]->b_frame_score = 0;
+ m->input_picture[i]->b_frame_score = 0;
}
} else if (m->b_frame_strategy == 2) {
b_frames = estimate_best_b_count(m);
@@ -1453,11 +1451,11 @@ static int select_input_picture(MPVMainEncContext *m)
emms_c();
for (i = b_frames - 1; i >= 0; i--) {
- int type = s->input_picture[i]->f->pict_type;
+ int type = m->input_picture[i]->f->pict_type;
if (type && type != AV_PICTURE_TYPE_B)
b_frames = i;
}
- if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
+ if (m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
b_frames == s->max_b_frames) {
av_log(s->avctx, AV_LOG_ERROR,
"warning, too many B-frames in a row\n");
@@ -1470,21 +1468,21 @@ static int select_input_picture(MPVMainEncContext *m)
} else {
if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
b_frames = 0;
- s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
+ m->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
}
}
if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
- s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
+ m->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
b_frames--;
- s->reordered_input_picture[0] = s->input_picture[b_frames];
+ s->reordered_input_picture[0] = m->input_picture[b_frames];
if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
s->reordered_input_picture[0]->f->coded_picture_number =
s->coded_picture_number++;
for (i = 0; i < b_frames; i++) {
- s->reordered_input_picture[i + 1] = s->input_picture[i];
+ s->reordered_input_picture[i + 1] = m->input_picture[i];
s->reordered_input_picture[i + 1]->f->pict_type =
AV_PICTURE_TYPE_B;
s->reordered_input_picture[i + 1]->f->coded_picture_number =
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index 227701b3e3..a06e208be8 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -37,6 +37,8 @@ typedef MPVContext MPVEncContext;
typedef struct MPVMainEncContext {
MPVMainContext common;
+ Picture *input_picture[MAX_PICTURE_COUNT]; ///< next pictures in display order
+
int me_penalty_compensation;
int me_pre; ///< prepass for motion estimation
--
2.32.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-01-30 6:32 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-30 6:08 [FFmpeg-devel] [PATCH 01/41] avcodec/mpegvideo_enc: Allow slices only for slice-thread-able codecs Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 02/41] avcodec/mjpegenc: Remove nonsense assert Andreas Rheinhardt
2022-01-30 13:15 ` Michael Niedermayer
2022-01-30 17:07 ` Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 03/41] avcodec/mjpegenc: Fix files with slices > 1, but threads == 1 Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 04/41] avcodec/mpegvideo: Enable private contexts Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 05/41] avcodec/h261: Separate decode and encode contexts Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 06/41] avcodec/h261enc: Pass PutBitContext directly in h261_encode_motion() Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 07/41] avcodec/idctdsp: Constify the permutation parameter of ff_init_scantable Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 08/41] avcodec/wmv2: Move initializing abt_scantables to the decoder Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 09/41] avcodec/wmv2: Split Wmv2Context into decoder and encoder context Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 10/41] avcodec/msmpeg4.h: Move encoder-only stuff to a new header Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 11/41] avcodec/msmpegenc: Add MSMPEG4EncContext and move ac_stats to it Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 12/41] avcodec/h263.h: Move encoder-only stuff to a new header h263enc.h Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 13/41] avcodec/mpegvideo: Move encoder-only stuff to a new header Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 14/41] avcodec/avcodec: Avoid MpegEncContext in AVHWAccel.decode_mb Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 15/41] avcodec/speedhqenc: Add SpeedHQEncContext and move slice_start to it Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 16/41] avcodec/mpegvideo: Use typedefs for MPV(Main)?(Dec|Enc)?Context Andreas Rheinhardt
2022-01-30 11:40 ` Michael Niedermayer
2022-01-30 23:05 ` Andreas Rheinhardt
2022-01-31 15:37 ` Michael Niedermayer
2022-01-30 11:43 ` Michael Niedermayer
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 17/41] avcodec/mpegvideo_enc: Don't find encoder by ID Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 18/41] avcodec/mpegvideoenc: Add proper MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 19/41] avcodec/mpegvideoenc: Move tmp bframes to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 20/41] avcodec/mpegvideoenc: Move ratecontrol " Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 21/41] avcodec/mpegvideo: Move me_pre and me_penalty_compensation to enc-ctx Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 22/41] avcodec/mpegvideo: Move gop_size to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 23/41] avcodec/mpegvideo_enc: Don't set picture_in_gop_number for slice threads Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 24/41] avcodec/mpegvideo: Move picture_in_gop_number to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 25/41] avcodec/mpegvideo: Move pts and dts fields " Andreas Rheinhardt
2022-01-30 6:27 ` Andreas Rheinhardt [this message]
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 27/41] avcodec/mpegvideo: Remove write-only [fb]_code Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 28/41] avcodec/mpegvideo: Move last-pic information to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 29/41] avcodec/mpegvideo: Move header_bits " Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 30/41] avcodec/mpegvideo_enc: Remove unused function parameters Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 31/41] avcodec/mpegvideo_enc: Remove unused parameter from encode_mb_hq() Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 32/41] avcodec/mpegvideo: Move vbv_delay to Mpeg1Context Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 33/41] avcodec/mpegvideo: Move brd_scale to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 34/41] avcodec/mpegvideo: Move ratecontrol parameters " Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 35/41] avcodec/mpegvideo: Allocate encoder-only tables in mpegvideo_enc.c Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 36/41] avcodec/mpegvideo: Move encoder-only base-arrays to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 37/41] avcodec/mpegvideo_enc: Initialize non-JPEG q-matrices only once Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 38/41] avcodec/mpegvideo_enc: Avoid allocations for q_int(er|ra)_matrix tables Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 39/41] avcodec/mpegvideo: Move scenechange_threshold to MPVMainEncContext Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 40/41] avcodec/mpegvideo: Move dummy dst for depr. opts " Andreas Rheinhardt
2022-01-30 6:27 ` [FFmpeg-devel] [PATCH 41/41] avcodec/mpegvideo: Move frame_skip_(exp|cmp) " Andreas Rheinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AM7PR03MB6660A216EA888AA6335F3A2C8F249@AM7PR03MB6660.eurprd03.prod.outlook.com \
--to=andreas.rheinhardt@outlook.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git