From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id BE27243D59 for ; Tue, 9 Aug 2022 10:53:34 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 13EE568B7F8; Tue, 9 Aug 2022 13:53:31 +0300 (EEST) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073082.outbound.protection.outlook.com [40.92.73.82]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1B97068B726 for ; Tue, 9 Aug 2022 13:53:25 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bVE+wScrN2+HzZU/nrU8oplDAo8WEdMGKvFWmpdGt/33xWjXNclcE0SwIv53FHgfRcDZnOtzvKH7PgAofb+RBcmxHRX69ftK7mf8YIkGmbFKQ9skWh9Nyeaa0troykPB7Q3R1Xh1LzmAyBSn+LAupTwJ/HkQ72dmo9SSUsRFnOTLwSfuV7UUkeA3175IaKjmJkoUjCAX0O/z/3gA8PjiAsIzvYqWW0DsroUCrNbMpHOwwDizWn4TmBwO4h4T6BJB/y4CClWemCUgH8rzoGAHtvuyJV4HcU9eqmLl9vdnAkGD98IKeM8uskOoDGno4yY7KIuHWfWP37DoP8b5ml3IuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=L9yHwext86u9BjdDHRRW2ZjAZMLG+cnaZ1l4Pgmw4+w=; b=M9ZeiUg38Irl9dJstpngLWJDr6LHOMCI/gnzQtvCHuYzvxO7dir7BdEvWOr7YsoiR/jO96Elw/qnTrkW3oq8fLXE5j7fOVZSx5xV9/fZfeXU4qIuXZoyKsHZBTWF9CpQxrJzDtj55LTPHATV7sdge1+ysZkpIIZtWwmlujx/Q4x2Bjnt8rJjg5WkSo4OkU9XN1pMboMTNyawTVHM354PX9G7Ie6ZXOGN+pBVFjVbCmIFVR+YAkaj56y+yipeIldslk2MBupfCDdyvCm2QR+q9lnCMWtsLHVsXGoBI9ROydrKXuwJjb8HMqurQN3VhkIPqU+ULBS14GUR0fYSN4GjUA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L9yHwext86u9BjdDHRRW2ZjAZMLG+cnaZ1l4Pgmw4+w=; b=VhFU4AjmiCvrZzxJH99YRKuO19Fh5HEnEgvhHAug4ov5x1PWJIOJJu/CoY+ttbvFSuyk0XO1z6Va7D7k8oWb6WpzjF7VazrivSITh4XZw3gkH8UhLyTKFsmsKWd3AqcduVRKMDY5EhcLA33kkIgcXU3N/U09uh4jBYYWOCiuKKravgq/WsSN/lGLRiGVaLf3eqxz5QQCeRo8mYK/Z+aQtid9GY2+x0MlIE5fpZFkZ6oWjeJd7vLu/vK4dtd0PNYkRMuOuKVlUUh2y4N7pjMd9HWM+9pEld4bUV5G6k0SBV9E/B6I3OaePByvK7sJjE2ymqHlRP/irxVZ6DP5V4GWow== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by AM0PR01MB3891.eurprd01.prod.exchangelabs.com (2603:10a6:208:b5::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.16; Tue, 9 Aug 2022 10:53:22 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5504.020; Tue, 9 Aug 2022 10:53:22 +0000 Message-ID: Date: Tue, 9 Aug 2022 12:53:20 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [Su2/Ks8+WYNBm6BlvaE62Wx370boJIS+] X-ClientProxiedBy: ZR0P278CA0110.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:20::7) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <220d53e2-9861-de09-5600-92bb07ace388@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 15b08b01-a997-4ecb-cdf5-08da79f560d0 X-MS-TrafficTypeDiagnostic: AM0PR01MB3891:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NQUlPLgucyMZpzuH5RAsSVRHfl8R4D1Zv0HQQHwY9KGXBiPE9c07GVHVWlQ1tLU4gO5+iHzhM6Hn8FfSsJgqF8M8rrkXUyhV2GsrqF50eO58IawDFO/riTSHD9MY0R/Z1j6HhrFH4aIIx08XR521vgyMXEQOrSB25iPTKNiIm+Ta9WAFYSOtF0Igvb2xCBQngKo6XN/Rr5R35hNWW/W+IqCVEucaffSSb6gXu135GqpwhrTs3BwGOSlVpoKT2BneK3HS48xdb9ewAEYRwKGP+ljdmwxKygiOFUPsEjHZtRl9NSn8G/AEODbj5q2WtmKhOwhQ83Q14ws5muZDQMG1IYfZ8YobLhXe4OGWekYgmNhI3sR+cAWhAB/oqMOrRL72MZQmywYYxHhbmvdlPJgJN1ylFJVk9/2jlvYMDU2SuUQtO5ZL84qQ+7f1+XvK3pALxKDpBcxQsPEvfpLGP0CsK1ln3V9N7sgvgGpnL6lkxEsxt2mL4Er15PnVuzj2sWimHiRanR37hHZdyVsVDSXWwCy52un52l83qvyWopnLEr0lFFV744M9kDUYt8iV9sPY5i4vZ/74YbZVcpq9EZ5kbazJKESzNWuiugUx9jNe/79QcYe7lo0CWkt8jHqvTxoCTmxDS8sRJN8QReNR2Tkv46+nQGUEf2w7j/J9Or4/0tzcULjs0MIJzCY1a2EKlQRm X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NFZPWE01WDJsM1FPSC9aTk01Q2dtRlIvNmxiVG5TbUREQmk5MHpna2swaFFI?= =?utf-8?B?THVyYXdPWDN2UStxb0xXM2FXdTBVWW95NVNGbTJuUGU4QU93RkJ2b2dJTlpr?= =?utf-8?B?YUc1VE94b0pEVlZuUTI0ZXdzTXN4QStTay9ieXRRVHFKR2ZiYVluZ05kMXh4?= =?utf-8?B?Q0VmaHRKU3d2eURBY05Qa1Erb0NIV0NTdmM4NndyR3FrcWpzOWJPYWowTFlE?= =?utf-8?B?VnZicTV4c3lMMXpOSzU3RlgrN3UrRi9PdElPa1NDaXNKSlY2UEQ5cExPeUxU?= =?utf-8?B?NS9sK2NuOWRuaGVvSW5xUDMyZ3l6TnpIeHpSMGdVMnhrSEtvVjVqU3YvZEc5?= =?utf-8?B?cWhuSWRXU2VuMjBwYWVqbHpCRC90emp0blBoYTdIRk1NK1ZxelNKOWY1WnFU?= =?utf-8?B?OTdqK2ozVDN0YmMxTjY3L3QzZVVaaE9kUFdnVGlMb01wNjBmbC9ldUE4ZENY?= =?utf-8?B?K0poZ1dFZE9ZT2RRRVlvaE55UURsMnZFZXdYbzdQd1VMUk1RbEZxdzcrWmRH?= =?utf-8?B?Q0YxYkZZYzZ3ejNRdXBMeUlCMnhPSWZZdDFHZEtEM2VCdExHK0xacElBeHRo?= =?utf-8?B?eDVYbGh4anQ0Q2VYZ2d0di9DWlNvaTVBa0ZFcGxSQnAxWGVFREU3QWlIL1Rk?= =?utf-8?B?aXVCeFQrb2RvQWE4U0M1K3A4R2t3ZHNIU3I0K29CU29DbGxWZXlGdmxMa011?= =?utf-8?B?c1pzY1FkTVZlVk4yNlYwRS9KZld4R3hrR0RDZGdvQ0Y3MkF0dGF3dWt2QWZJ?= =?utf-8?B?TmdzbEx1QjdSM2RQRXVvZ0MzcHBTYVJCaGZDQjRNekwvSWl5WTBDRG4xSERi?= =?utf-8?B?Q0JTeE9hR0JERnFuK0hZOFJMT04zV3o1VEJHT1A2M2Q3M2krVkwrQzhFSDlM?= =?utf-8?B?bXJyTWhLMWNUUE5WWWFiSDNyM0k4K0lTUHluWjBSUzJlS2NSK3JnRWFSVDNh?= =?utf-8?B?RStMazdxSVlmTW5wd2QxZUZvVDdoWWcvakhSSXVreVVoZkhoaW1jcjFDeHBD?= =?utf-8?B?Wkh4c3BRMHN2WUovWndOVXhadmIyV1BwWGRGZllGNGhIYjBmeWZPQ3hydG5o?= =?utf-8?B?MWtQK1pMd3c4OGd2bFovMFAvaFZ2b2FLUTR2QW9FalVkS21lN25rYTVDWTdZ?= =?utf-8?B?YVlCVEtpdkE5MmxtT1N6dDJBNzhvWXVBME00djk3ajdld1pEVjdBTmIyYkdr?= =?utf-8?B?SXZSOU84Rnl3NlFIWHZCQkZFUzUzUnIyanJleFRReGJGY0N3SmNBZEdpdHla?= =?utf-8?B?SUhadlYrcHQ3eEl0enNXTzJFa2lobHFZclRncHMvelBIRXQyNkRJK05mZ1dY?= =?utf-8?B?encwSkU2bmJMeE1kblFic0Yyc1I2OEZpV1hRc2dRendoNWkxSVJ2SGE0aW5k?= =?utf-8?B?a1NjMktSYkwyTHNvemRITVNWcTYyeWN0UjZ6bkVHR1UyYkhncno4WFZ1VFgr?= =?utf-8?B?M1I0RmFoYlRNM21HOHo3NGpvTm55V3hXNWZzOTRQQURCUUtxcWVVSkJ1QmJK?= =?utf-8?B?ek5SR0czWG9henVNK3ZhcVU1aTRCNDZ5bjl1R0lwclRkamJtMGJKZ0ZpUzg2?= =?utf-8?B?QXBoQzJ0N3puZStEM2hWZHFkemdEOE91UlNzaUdnM1h4UmxpVGtBcnlHdHBq?= =?utf-8?B?WWRBTTYvb2U2Z3J0bFY0MUVEd3g2U3I0UjByMlJrb1I2eU84RGhRcStsU1ZX?= =?utf-8?B?QktCaUJqcncrKzhHVXRLR0VnZ3FGSHFDT244OE9MaEFUVWtuRjcxSXAyenFL?= =?utf-8?Q?ZvwKRjNBwv8iSugChw=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 15b08b01-a997-4ecb-cdf5-08da79f560d0 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2022 10:53:22.8185 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR01MB3891 Subject: Re: [FFmpeg-devel] [PATCH] avcodec/mpegpicture: Move mb_var, mc_mb_var and mb_mean to MpegEncCtx X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Andreas Rheinhardt: > These tables are only used by encoders and only for the current picture; > ergo they need not be put into the picture at all, but rather into > the encoder's context. They also don't need to be refcounted, > because there is only one owner. > > In contrast to this, the earlier code refcounts them which > incurs unnecessary overhead. These references are not unreferenced > in ff_mpeg_unref_picture() (they are kept in order to have something > like a buffer pool), so that several buffers are kept at the same > time, although only one is needed, thereby wasting memory. > > The code also propagates references to other pictures not part of > the pictures array (namely the copy of the current/next/last picture > in the MpegEncContext which get references of their own). These > references are not unreferenced in ff_mpeg_unref_picture() (the > buffers are probably kept in order to have something like a pool), > yet if the current picture is a B-frame, it gets unreferenced > at the end of ff_mpv_encode_picture() and its slot in the picture > array will therefore be reused the next time; but the copy of the > current picture also still has its references and therefore > these buffers will be made duplicated in order to make them writable > in the next call to ff_mpv_encode_picture(). This is of course > unnecessary. > > Finally, ff_find_unused_picture() is supposed to just return > any unused picture and the code is supposed to work with it; > yet for the vsynth*-mpeg4-adap tests the result depends upon > the content of these buffers; given that this patchset > changes the content of these buffers (the initial content is now > the state of these buffers after encoding the last frame; > before this patch the buffers used came from the last picture > that occupied the same slot in the picture array) their ref-files > needed to be changed. This points to a bug somewhere (if one removes > the initialization, one gets uninitialized reads in > adaptive_quantization in ratecontrol.c). > > Signed-off-by: Andreas Rheinhardt > --- > The decoder-part of the vsynth*-h263-obmc tests also has problems > with returning random pictures in ff_find_unused_picture(). > Probably a bug in preview_obmc() or so. Anyway, next thing is to > add proper buffer-pools for these buffers to remove the > needs_realloc-hack. > > libavcodec/motion_est.c | 14 ++++++------ > libavcodec/mpegpicture.c | 30 ++----------------------- > libavcodec/mpegpicture.h | 9 -------- > libavcodec/mpegvideo.h | 6 +++++ > libavcodec/mpegvideo_enc.c | 17 ++++++++++---- > libavcodec/ratecontrol.c | 7 +++--- > libavcodec/svq1enc.c | 6 ++--- > tests/ref/seek/vsynth_lena-mpeg4-adap | 28 +++++++++++------------ > tests/ref/vsynth/vsynth1-mpeg4-adap | 8 +++---- > tests/ref/vsynth/vsynth2-mpeg4-adap | 8 +++---- > tests/ref/vsynth/vsynth3-mpeg4-adap | 8 +++---- > tests/ref/vsynth/vsynth_lena-mpeg4-adap | 8 +++---- > 12 files changed, 64 insertions(+), 85 deletions(-) > > diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c > index 29ab41dc8c..d17ffe42b4 100644 > --- a/libavcodec/motion_est.c > +++ b/libavcodec/motion_est.c > @@ -895,7 +895,6 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, > int P[10][2]; > const int shift= 1+s->quarter_sample; > int mb_type=0; > - Picture * const pic= &s->current_picture; > > init_ref(c, s->new_picture->data, s->last_picture.f->data, NULL, 16*mb_x, 16*mb_y, 0); > > @@ -917,8 +916,8 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, > varc = s->mpvencdsp.pix_norm1(pix, s->linesize) - > (((unsigned) sum * sum) >> 8) + 500; > > - pic->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; > - pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8; > + s->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; > + s->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8; > c->mb_var_sum_temp += (varc+128)>>8; > > if (s->motion_est != FF_ME_ZERO) { > @@ -965,7 +964,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, > > vard = s->mecc.sse[0](NULL, pix, ppix, s->linesize, 16); > > - pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; > + s->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; > c->mc_mb_var_sum_temp += (vard+128)>>8; > > if (c->avctx->mb_decision > FF_MB_DECISION_SIMPLE) { > @@ -1509,7 +1508,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, > > score= ((unsigned)(score*score + 128*256))>>16; > c->mc_mb_var_sum_temp += score; > - s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE > + s->mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE > s->mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_DIRECT0; > > return; > @@ -1574,7 +1573,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, > > score= ((unsigned)(score*score + 128*256))>>16; > c->mc_mb_var_sum_temp += score; > - s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE > + s->mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE > } > > if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ > @@ -1629,7 +1628,8 @@ int ff_get_best_fcode(MpegEncContext * s, const int16_t (*mv_table)[2], int type > continue; > > for(j=0; j - if(s->pict_type==AV_PICTURE_TYPE_B || s->current_picture.mc_mb_var[xy] < s->current_picture.mb_var[xy]) > + if (s->pict_type == AV_PICTURE_TYPE_B || > + s->mc_mb_var[xy] < s->mb_var[xy]) > score[j]-= 170; > } > } > diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c > index aaa1df0bd8..f32f8d061b 100644 > --- a/libavcodec/mpegpicture.c > +++ b/libavcodec/mpegpicture.c > @@ -37,9 +37,6 @@ static void av_noinline free_picture_tables(Picture *pic) > pic->alloc_mb_width = > pic->alloc_mb_height = 0; > > - av_buffer_unref(&pic->mb_var_buf); > - av_buffer_unref(&pic->mc_mb_var_buf); > - av_buffer_unref(&pic->mb_mean_buf); > av_buffer_unref(&pic->mbskip_table_buf); > av_buffer_unref(&pic->qscale_table_buf); > av_buffer_unref(&pic->mb_type_buf); > @@ -60,9 +57,6 @@ do {\ > return ret;\ > } while (0) > > - MAKE_WRITABLE(mb_var_buf); > - MAKE_WRITABLE(mc_mb_var_buf); > - MAKE_WRITABLE(mb_mean_buf); > MAKE_WRITABLE(mbskip_table_buf); > MAKE_WRITABLE(qscale_table_buf); > MAKE_WRITABLE(mb_type_buf); > @@ -218,14 +212,6 @@ static int alloc_picture_tables(AVCodecContext *avctx, Picture *pic, int encodin > if (!pic->mbskip_table_buf || !pic->qscale_table_buf || !pic->mb_type_buf) > return AVERROR(ENOMEM); > > - if (encoding) { > - pic->mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); > - pic->mc_mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); > - pic->mb_mean_buf = av_buffer_allocz(mb_array_size); > - if (!pic->mb_var_buf || !pic->mc_mb_var_buf || !pic->mb_mean_buf) > - return AVERROR(ENOMEM); > - } > - > if (out_format == FMT_H263 || encoding || > (avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) { > int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t); > @@ -285,12 +271,6 @@ int ff_alloc_picture(AVCodecContext *avctx, Picture *pic, MotionEstContext *me, > if (ret < 0) > goto fail; > > - if (encoding) { > - pic->mb_var = (uint16_t*)pic->mb_var_buf->data; > - pic->mc_mb_var = (uint16_t*)pic->mc_mb_var_buf->data; > - pic->mb_mean = pic->mb_mean_buf->data; > - } > - > pic->mbskip_table = pic->mbskip_table_buf->data; > pic->qscale_table = pic->qscale_table_buf->data + 2 * mb_stride + 1; > pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * mb_stride + 1; > @@ -316,7 +296,7 @@ fail: > */ > void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *pic) > { > - int off = offsetof(Picture, mb_mean) + sizeof(pic->mb_mean); > + int off = offsetof(Picture, hwaccel_priv_buf) + sizeof(pic->hwaccel_priv_buf); > > pic->tf.f = pic->f; > /* WM Image / Screen codecs allocate internal buffers with different > @@ -340,10 +320,7 @@ int ff_update_picture_tables(Picture *dst, const Picture *src) > { > int i, ret; > > - ret = av_buffer_replace(&dst->mb_var_buf, src->mb_var_buf); > - ret |= av_buffer_replace(&dst->mc_mb_var_buf, src->mc_mb_var_buf); > - ret |= av_buffer_replace(&dst->mb_mean_buf, src->mb_mean_buf); > - ret |= av_buffer_replace(&dst->mbskip_table_buf, src->mbskip_table_buf); > + ret = av_buffer_replace(&dst->mbskip_table_buf, src->mbskip_table_buf); > ret |= av_buffer_replace(&dst->qscale_table_buf, src->qscale_table_buf); > ret |= av_buffer_replace(&dst->mb_type_buf, src->mb_type_buf); > for (i = 0; i < 2; i++) { > @@ -356,9 +333,6 @@ int ff_update_picture_tables(Picture *dst, const Picture *src) > return ret; > } > > - dst->mb_var = src->mb_var; > - dst->mc_mb_var = src->mc_mb_var; > - dst->mb_mean = src->mb_mean; > dst->mbskip_table = src->mbskip_table; > dst->qscale_table = src->qscale_table; > dst->mb_type = src->mb_type; > diff --git a/libavcodec/mpegpicture.h b/libavcodec/mpegpicture.h > index 0671bbae8e..62589595d0 100644 > --- a/libavcodec/mpegpicture.h > +++ b/libavcodec/mpegpicture.h > @@ -62,19 +62,10 @@ typedef struct Picture { > AVBufferRef *ref_index_buf[2]; > int8_t *ref_index[2]; > > - AVBufferRef *mb_var_buf; > - uint16_t *mb_var; ///< Table for MB variances > - > - AVBufferRef *mc_mb_var_buf; > - uint16_t *mc_mb_var; ///< Table for motion compensated MB variances > - > int alloc_mb_width; ///< mb_width used to allocate tables > int alloc_mb_height; ///< mb_height used to allocate tables > int alloc_mb_stride; ///< mb_stride used to allocate tables > > - AVBufferRef *mb_mean_buf; > - uint8_t *mb_mean; ///< Table for MB luminance > - > AVBufferRef *hwaccel_priv_buf; > void *hwaccel_picture_private; ///< Hardware accelerator private data > > diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h > index b1b2727535..47619c1976 100644 > --- a/libavcodec/mpegvideo.h > +++ b/libavcodec/mpegvideo.h > @@ -235,6 +235,12 @@ typedef struct MpegEncContext { > int16_t (*b_field_mv_table[2][2][2])[2];///< MV table (4MV per MB) interlaced B-frame encoding > uint8_t (*p_field_select_table[2]); ///< Only the first element is allocated > uint8_t (*b_field_select_table[2][2]); ///< Only the first element is allocated > + > + /* The following three arrays are encoder-only */ > + uint16_t *mb_var; ///< Table for MB variances > + uint16_t *mc_mb_var; ///< Table for motion compensated MB variances > + uint8_t *mb_mean; ///< Table for MB luminance > + > int motion_est; ///< ME algorithm > int me_penalty_compensation; > int me_pre; ///< prepass for motion estimation > diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c > index 0ca004ee39..a34fb66eac 100644 > --- a/libavcodec/mpegvideo_enc.c > +++ b/libavcodec/mpegvideo_enc.c > @@ -313,6 +313,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) > MpegEncContext *s = avctx->priv_data; > AVCPBProperties *cpb_props; > int i, ret; > + int mb_array_size; > > mpv_encode_defaults(s); > > @@ -823,6 +824,12 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) > !FF_ALLOCZ_TYPED_ARRAY(s->reordered_input_picture, MAX_PICTURE_COUNT)) > return AVERROR(ENOMEM); > > + mb_array_size = s->mb_stride * s->mb_height; > + if (!FF_ALLOCZ_TYPED_ARRAY(s->mc_mb_var, mb_array_size) || > + !FF_ALLOCZ_TYPED_ARRAY(s->mb_var, mb_array_size) || > + !(s->mb_mean = av_mallocz(mb_array_size))) > + return AVERROR(ENOMEM); > + > if (s->noise_reduction) { > if (!FF_ALLOCZ_TYPED_ARRAY(s->dct_offset, 2)) > return AVERROR(ENOMEM); > @@ -949,6 +956,9 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) > av_freep(&s->input_picture); > av_freep(&s->reordered_input_picture); > av_freep(&s->dct_offset); > + av_freep(&s->mb_var); > + av_freep(&s->mc_mb_var); > + av_freep(&s->mb_mean); > > return 0; > } > @@ -2235,8 +2245,7 @@ static av_always_inline void encode_mb_internal(MpegEncContext *s, > } > } > /* pre quantization */ > - if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] < > - 2 * s->qscale * s->qscale) { > + if (s->mc_mb_var[s->mb_stride * mb_y + mb_x] < 2 * s->qscale * s->qscale) { > // FIXME optimize > if (s->mecc.sad[1](NULL, ptr_y, dest_y, wrap_y, 8) < 20 * s->qscale) > skip_dct[0] = 1; > @@ -2648,8 +2657,8 @@ static int mb_var_thread(AVCodecContext *c, void *arg){ > varc = (s->mpvencdsp.pix_norm1(pix, s->linesize) - > (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8; > > - s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc; > - s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; > + s->mb_var [s->mb_stride * mb_y + mb_x] = varc; > + s->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; > s->me.mb_var_sum_temp += varc; > } > } > diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c > index a7614d75e2..53930f147b 100644 > --- a/libavcodec/ratecontrol.c > +++ b/libavcodec/ratecontrol.c > @@ -751,15 +751,14 @@ static void adaptive_quantization(MpegEncContext *s, double q) > float *bits_tab = s->bits_tab; > const int qmin = s->avctx->mb_lmin; > const int qmax = s->avctx->mb_lmax; > - Picture *const pic = &s->current_picture; > const int mb_width = s->mb_width; > const int mb_height = s->mb_height; > > for (i = 0; i < s->mb_num; i++) { > const int mb_xy = s->mb_index2xy[i]; > - float temp_cplx = sqrt(pic->mc_mb_var[mb_xy]); // FIXME merge in pow() > - float spat_cplx = sqrt(pic->mb_var[mb_xy]); > - const int lumi = pic->mb_mean[mb_xy]; > + float temp_cplx = sqrt(s->mc_mb_var[mb_xy]); // FIXME merge in pow() > + float spat_cplx = sqrt(s->mb_var[mb_xy]); > + const int lumi = s->mb_mean[mb_xy]; > float bits, cplx, factor; > int mb_x = mb_xy % s->mb_stride; > int mb_y = mb_xy / s->mb_stride; > diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c > index e5216a99cd..36bc214d76 100644 > --- a/libavcodec/svq1enc.c > +++ b/libavcodec/svq1enc.c > @@ -313,9 +313,9 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, > s->m.mb_type = s->mb_type; > > // dummies, to avoid segfaults > - s->m.current_picture.mb_mean = (uint8_t *)s->dummy; > - s->m.current_picture.mb_var = (uint16_t *)s->dummy; > - s->m.current_picture.mc_mb_var = (uint16_t *)s->dummy; > + s->m.mb_mean = (uint8_t *)s->dummy; > + s->m.mb_var = (uint16_t *)s->dummy; > + s->m.mc_mb_var = (uint16_t *)s->dummy; > s->m.current_picture.mb_type = s->dummy; > > s->m.current_picture.motion_val[0] = s->motion_val8[plane] + 2; > diff --git a/tests/ref/seek/vsynth_lena-mpeg4-adap b/tests/ref/seek/vsynth_lena-mpeg4-adap > index 0611ee4511..fe841ef973 100644 > --- a/tests/ref/seek/vsynth_lena-mpeg4-adap > +++ b/tests/ref/seek/vsynth_lena-mpeg4-adap > @@ -2,45 +2,45 @@ ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st:-1 flags:0 ts:-1.000000 > ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st:-1 flags:1 ts: 1.894167 > -ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 174446 size: 16883 > +ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176 > ret: 0 st: 0 flags:0 ts: 0.800000 > -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 98220 size: 17063 > +ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178 > ret:-1 st: 0 flags:1 ts:-0.320000 > ret:-1 st:-1 flags:0 ts: 2.576668 > ret: 0 st:-1 flags:1 ts: 1.470835 > -ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 135582 size: 17525 > +ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018 > ret: 0 st: 0 flags:0 ts: 0.360000 > -ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 59446 size: 17261 > +ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35800 size: 17261 > ret:-1 st: 0 flags:1 ts:-0.760000 > ret:-1 st:-1 flags:0 ts: 2.153336 > ret: 0 st:-1 flags:1 ts: 1.047503 > -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 98220 size: 17063 > +ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178 > ret: 0 st: 0 flags:0 ts:-0.040000 > ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st: 0 flags:1 ts: 2.840000 > -ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 174446 size: 16883 > +ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176 > ret: 0 st:-1 flags:0 ts: 1.730004 > -ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 174446 size: 16883 > +ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176 > ret: 0 st:-1 flags:1 ts: 0.624171 > -ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 59446 size: 17261 > +ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35800 size: 17261 > ret: 0 st: 0 flags:0 ts:-0.480000 > ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st: 0 flags:1 ts: 2.400000 > -ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 174446 size: 16883 > +ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176 > ret: 0 st:-1 flags:0 ts: 1.306672 > -ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 135582 size: 17525 > +ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018 > ret: 0 st:-1 flags:1 ts: 0.200839 > ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st: 0 flags:0 ts:-0.920000 > ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855 > ret: 0 st: 0 flags:1 ts: 2.000000 > -ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 174446 size: 16883 > +ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176 > ret: 0 st:-1 flags:0 ts: 0.883340 > -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 98220 size: 17063 > +ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178 > ret:-1 st:-1 flags:1 ts:-0.222493 > ret:-1 st: 0 flags:0 ts: 2.680000 > ret: 0 st: 0 flags:1 ts: 1.560000 > -ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 135582 size: 17525 > +ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018 > ret: 0 st:-1 flags:0 ts: 0.460008 > -ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 98220 size: 17063 > +ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178 > ret:-1 st:-1 flags:1 ts:-0.645825 > diff --git a/tests/ref/vsynth/vsynth1-mpeg4-adap b/tests/ref/vsynth/vsynth1-mpeg4-adap > index e6bd6a59bd..67705f0f43 100644 > --- a/tests/ref/vsynth/vsynth1-mpeg4-adap > +++ b/tests/ref/vsynth/vsynth1-mpeg4-adap > @@ -1,4 +1,4 @@ > -f120f0bf976bb510c5b5305fe7d8159a *tests/data/fate/vsynth1-mpeg4-adap.avi > -403436 tests/data/fate/vsynth1-mpeg4-adap.avi > -fad0b9dc08fe4a95b297af1a7411c1e9 *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo > -stddev: 14.05 PSNR: 25.17 MAXDIFF: 184 bytes: 7603200/ 7603200 > +0f1cbbdc3f9b91f2d9ac3d1fc2cf7d4e *tests/data/fate/vsynth1-mpeg4-adap.avi > +325518 tests/data/fate/vsynth1-mpeg4-adap.avi > +1e6c596f9f491fbf15920ef1bace7fb8 *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo > +stddev: 14.12 PSNR: 25.13 MAXDIFF: 184 bytes: 7603200/ 7603200 > diff --git a/tests/ref/vsynth/vsynth2-mpeg4-adap b/tests/ref/vsynth/vsynth2-mpeg4-adap > index a3223f6363..35b2b6aac9 100644 > --- a/tests/ref/vsynth/vsynth2-mpeg4-adap > +++ b/tests/ref/vsynth/vsynth2-mpeg4-adap > @@ -1,4 +1,4 @@ > -4bff98da2342836476da817428594403 *tests/data/fate/vsynth2-mpeg4-adap.avi > -213508 tests/data/fate/vsynth2-mpeg4-adap.avi > -0c709f2b81f4593eaa29490332c2cb39 *tests/data/fate/vsynth2-mpeg4-adap.out.rawvideo > -stddev: 4.87 PSNR: 34.36 MAXDIFF: 86 bytes: 7603200/ 7603200 > +06a397fe43dab7b6cf56870410fbbbaf *tests/data/fate/vsynth2-mpeg4-adap.avi > +203000 tests/data/fate/vsynth2-mpeg4-adap.avi > +686565d42d8ba5aea790824b04fa0a18 *tests/data/fate/vsynth2-mpeg4-adap.out.rawvideo > +stddev: 4.55 PSNR: 34.95 MAXDIFF: 84 bytes: 7603200/ 7603200 > diff --git a/tests/ref/vsynth/vsynth3-mpeg4-adap b/tests/ref/vsynth/vsynth3-mpeg4-adap > index 0942f83015..6386f13466 100644 > --- a/tests/ref/vsynth/vsynth3-mpeg4-adap > +++ b/tests/ref/vsynth/vsynth3-mpeg4-adap > @@ -1,4 +1,4 @@ > -c16e5c2436ca9953517eadba562768e9 *tests/data/fate/vsynth3-mpeg4-adap.avi > -43706 tests/data/fate/vsynth3-mpeg4-adap.avi > -b42b614e19e7c4859fca1af6d4e36eae *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo > -stddev: 5.48 PSNR: 33.34 MAXDIFF: 53 bytes: 86700/ 86700 > +6b2f641f2e68b11b992fd6ba1ed66a21 *tests/data/fate/vsynth3-mpeg4-adap.avi > +41012 tests/data/fate/vsynth3-mpeg4-adap.avi > +3483a2032cb02c3a37f5e43b128e59ed *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo > +stddev: 5.79 PSNR: 32.87 MAXDIFF: 49 bytes: 86700/ 86700 > diff --git a/tests/ref/vsynth/vsynth_lena-mpeg4-adap b/tests/ref/vsynth/vsynth_lena-mpeg4-adap > index 10af80b397..91edafe9b0 100644 > --- a/tests/ref/vsynth/vsynth_lena-mpeg4-adap > +++ b/tests/ref/vsynth/vsynth_lena-mpeg4-adap > @@ -1,4 +1,4 @@ > -c6108621b1202d32dac68b1944c5b8c2 *tests/data/fate/vsynth_lena-mpeg4-adap.avi > -198500 tests/data/fate/vsynth_lena-mpeg4-adap.avi > -87b6dbe98d276137fceaae2fa672eced *tests/data/fate/vsynth_lena-mpeg4-adap.out.rawvideo > -stddev: 3.75 PSNR: 36.65 MAXDIFF: 71 bytes: 7603200/ 7603200 > +633da125f46391eef33bb031cd728f4b *tests/data/fate/vsynth_lena-mpeg4-adap.avi > +187598 tests/data/fate/vsynth_lena-mpeg4-adap.avi > +21312bfcb28c40299fb27a5b03477f8c *tests/data/fate/vsynth_lena-mpeg4-adap.out.rawvideo > +stddev: 3.63 PSNR: 36.92 MAXDIFF: 71 bytes: 7603200/ 7603200 Will apply this tonight unless there are objections. - Andreas _______________________________________________ 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".