From patchwork Tue Feb 1 13:06:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 34003 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp605977iov; Tue, 1 Feb 2022 05:14:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJwyHQiV9lcqTARExNM49TgUIT2Gphb5BFCkW0YkUnJCqQBwu0nrTW24ooIjcjpgEglqrdTq X-Received: by 2002:a17:906:7315:: with SMTP id di21mr21415963ejc.515.1643721242000; Tue, 01 Feb 2022 05:14:02 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 11si9138216eje.377.2022.02.01.05.14.01; Tue, 01 Feb 2022 05:14:01 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=f8s+hal6; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B26068B372; Tue, 1 Feb 2022 15:08:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2079.outbound.protection.outlook.com [40.92.89.79]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 658FD68B304 for ; Tue, 1 Feb 2022 15:08:00 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mLU66mN8UsYwIxlWQngKmrRiw0oNIxKQpPdeB+tadb/FcMgVcfRy2/hJJn9T4ypMkV6YW9CmCT7e4oa59Mrh3CyMLdfOvA6e4hTKedNIwyxpjG/dE5s1coMzuZG3Ih30VDZeEZIA+R8ySIyjJBEfu6xi7n8hCh9oewQkMwNDjTNwPwY0YQ1LMiGC3Y0/RZs6rnVonxU0N//192FFN76qvVH4b/EjB8bTypT7Wl9/4z4GTo5Cnfwujr90b6QHJFr/Pc+Fn+tvO6FmQnzfAvu0lgN/1NxmK1w4hm4L4BcYdMHiGopfVHvQidXJ3Djgd//x08nBDFD4xl1ajgZW4zhiIg== 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=Z7FnZJNkSygU97ULjTFRh2UdNzgiSRRGPC/wGe/Jmic=; b=UYP++A7QgAlKi8FHqoluIHTKSasokZCsxxITuEF1B1w3EdL9vH9nknT+bK+vHMquAp1SFpn3TdSMvMrTVNTqeOIAqEP4gzeQ7CzVgFlZxQlP4sd+taimsW/ChhD6wYvuaF4UDTzxkHtIxUTXmaTqCTAtVc1OH2X5SN9kQsdbkVD/4TKwUETh/KoS3tAM5blRSMyJL8Dnv3pKdaXefB1rcSU37uMW5tLwpWwE7EFZPKqX4v7cFUx12iMRPzTSLhW1YW7ACcY4kIIfPJyOUKw5AvP7qhMJYogukY4SQe8GmNMHAmO1sitae0qhx8xfGUw9o8rv3wGT7x8l9ctrLMiumw== 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=Z7FnZJNkSygU97ULjTFRh2UdNzgiSRRGPC/wGe/Jmic=; b=f8s+hal616EdJu7h1ZmRxEgPFP8GRkGwQ/YAQ19QuH/Nzs5gXOXf3C1m8wxxXmFTFAXzt7ujPvpo5tO/F2/5lta5P9sZvY9zAXtzhdX4gjFw/0Ir/esUkAryWee4+rVT7SL3xGSIulr2BUznw7D2VniDJ5IW8cHGzQb1ltxgRxmvD68xVy1Z2TGx0lvYuFT9Q16qUDJ9G420LadEdJvaNB454YbvrR0W+NGrKUszwhGVlp4xE18Lb4b7gN8zKNLyHyrX2cPyNzOA/fWtYpIEVV6BgHc4+vCc+3qOJHYr7dfqQmDrNbgHTqJ/CaJxuz3k4Jdzef/zlReuTsEgOBmQOg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM0PR03MB5700.eurprd03.prod.outlook.com (2603:10a6:208:16f::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.22; Tue, 1 Feb 2022 13:07:58 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.011; Tue, 1 Feb 2022 13:07:58 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 1 Feb 2022 14:06:27 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [Eo3s4xuTtX9cRC9iviw3gabh9CxdoIhT] X-ClientProxiedBy: AM6P195CA0092.EURP195.PROD.OUTLOOK.COM (2603:10a6:209:86::33) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220201130706.1420875-29-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3fa05e76-843b-481c-724f-08d9e583de3d X-MS-TrafficTypeDiagnostic: AM0PR03MB5700:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: w3PKuUrHhOfBIHKlQE69hOnTlu787gFKJDjiEqiXSYIj9NCx146FSIimk/pBPSYv4P6jwRvH7YofagH8DD6dTzvFodKkbj3F9E2OPvauR40z6W1Do8SkpUckGv1b++QqWkb6PgSuno6tKxehM26eVr9qb9IYXo7rcvZqSen44IbyBnLqvT1ywuxURm5ZCG8pOF1iA/gdp0J5XbwjXzjyQHdbIxEZQi4iA/rvSswh4oqagLtYqKrDzj/a4jl7HuJAl131osj7xzyldKaNe0bjS0kiWngIcT5uiA4E8h8n165TQKFJx9d21VzpUAgZt9IUKM29/5IydX6r6n6svd/PN8MFx3bwCX9iDCiS8/hALwqy99tVC0PyahC5bZjjj8qFgbsU0aTGqDRXzo3CBnMETCj2k85BoiP1wNZj+azviIMxheOMX+zx3Yorm/mz+Kw3DSJ9SgF36Fg5RZ4CAG02HTWrCc2UrMdIx2CKZAEAqO4IbcXDPf5dRR/Z7RYtbmyQhzOjL+/XBThau2wHGilDF3hUTgQqxSTuXiHnRWtiyt96KjHeKJvWVyUI/2lW00Fp X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: e4TkBvnVZJC7fqcGYOLXi1icDwv5S9u5qIMf2Rqy/y7fcqLxOVCcSm3KNgHfYCT4kkW83kj/XGAzAW1aUV10lUN72IWHGwdYSKPJnIWBDZ5DedHORbp0JIo78CETT6ZD/ehi8u3lmaDcIUt1jScFePGWo1Mg0HNzfBGyVuXNd8rl7lgnI+gyO+iAWSeodJoiTyzB/NwF/rdahxUfIuEk80+liVgqmQtJ14p0scF9wIAlp1zuJunD+GbFzLFoNeK8JplWe02zKPNt4WSwr2ukV7IBDp6Lp73a8WiwT2wy2Z7cBqmg2Nbv5O8Uu2QkaiMseex1fFJoG1UM/xm84ypYFrKSrwGVbyCx/W7V7BD66hs+KRwb3w82K7ZEGP+OO1dNYkdVn6RM+aWWL44t5HLU2PpC2vPG3h2vsjtfb83gPd+pg5aTvZgHWaYTeQGByWecrLDVx8N1ZNIag3ZyW9YnLHKta2TWU/os6yIddnKJn81sj/1jfJd1wE3WsQqdOGsSRgb2E9kBPfJMXiPoNBRen4bS3fq2KHQY7uSfOlV7I1iE8l5haYFPQfGkesRuYz22WGEVx8l8hYqbs8ft+e+2IjzwTKTcVd4L5pOlADLcRVUTvvyiI/yIV/QdYJqs+D1vFUHcH39lNM0RqjrtlafGgckYToaamruaSfRFQDEZ8jL0FmgcMQauMfNx5RCxlbQcTrjIF6OccAToES4eEzkCKlf39ChiaKWjwvNf3cRoad2v82jvvpSzroSxZ9lFszbOssoKNHR1df+NNkAn/QWpXBYfirVmBJOV1nQ/tfU/ShoGM/VOexaBEi7oIBl/CuOoyErksUpgPc47VNJMVIKrfCVy51fhUZ458/EFbCxSUXjLy1iyTlFw4B+a+zVOt/I1qEfUxhDIRQgXWVTSfGHnquMkCnk5X5Pw+ZdNCTZvJnVs7M61gR5g31lxWOH5x8UR9ctYLnU4NQaj+Xaf21FoPg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3fa05e76-843b-481c-724f-08d9e583de3d X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2022 13:07:58.2931 (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: AM0PR03MB5700 Subject: [FFmpeg-devel] [PATCH v2 30/69] avcodec/mpegvideoenc: Move ratecontrol to MPVMainEncContext 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EtCmgEtyvDBF Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo.h | 8 -------- libavcodec/mpegvideo_enc.c | 38 +++++++++++++++++++------------------- libavcodec/mpegvideoenc.h | 8 ++++++++ libavcodec/ratecontrol.c | 31 +++++++++++++++---------------- libavcodec/snowenc.c | 8 ++++---- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 017aadb3e7..4811fc0ad6 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -46,7 +46,6 @@ #include "mpegvideoencdsp.h" #include "pixblockdsp.h" #include "put_bits.h" -#include "ratecontrol.h" #if FF_API_FLAG_TRUNCATED #include "parser.h" #endif @@ -312,13 +311,6 @@ typedef struct MPVContext { int dct_count[2]; uint16_t (*dct_offset)[64]; - /* bit rate control */ - int64_t total_bits; - int frame_bits; ///< bits used for the current frame - int stuffing_bits; ///< bits used for stuffing - int next_lambda; ///< next lambda used for retrying to encode a frame - RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c - /* statistics, used for 2-pass encoding */ int mv_bits; int header_bits; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index e365f2fd81..37eeb68f15 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1407,15 +1407,15 @@ static int select_input_picture(MPVMainEncContext *m) for (i = 0; i < s->max_b_frames + 1; i++) { int pict_num = s->input_picture[0]->f->display_picture_number + i; - if (pict_num >= s->rc_context.num_entries) + if (pict_num >= m->rc_context.num_entries) break; if (!s->input_picture[i]) { - s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P; + m->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P; break; } s->input_picture[i]->f->pict_type = - s->rc_context.entry[pict_num].new_pict_type; + m->rc_context.entry[pict_num].new_pict_type; } } @@ -1745,14 +1745,14 @@ vbv_retry: ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits); if (avctx->rc_buffer_size) { - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; int max_size = FFMAX(rcc->buffer_index * avctx->rc_max_available_vbv_use, rcc->buffer_index - 500); int hq = (avctx->mb_decision == FF_MB_DECISION_RD || avctx->trellis); int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139; if (put_bits_count(&s->pb) > max_size && s->lambda < s->lmax) { - s->next_lambda = FFMAX(s->lambda + min_step, s->lambda * + m->next_lambda = FFMAX(s->lambda + min_step, s->lambda * (s->qscale + 1) / s->qscale); if (s->adaptive_quant) { int i; @@ -1803,10 +1803,10 @@ vbv_retry: s->misc_bits + s->i_tex_bits + s->p_tex_bits); flush_put_bits(&s->pb); - s->frame_bits = put_bits_count(&s->pb); + m->frame_bits = put_bits_count(&s->pb); - stuffing_count = ff_vbv_update(m, s->frame_bits); - s->stuffing_bits = 8*stuffing_count; + stuffing_count = ff_vbv_update(m, m->frame_bits); + m->stuffing_bits = 8 * stuffing_count; if (stuffing_count) { if (put_bytes_left(&s->pb, 0) < stuffing_count + 50) { av_log(avctx, AV_LOG_ERROR, "stuffing too large\n"); @@ -1830,10 +1830,10 @@ vbv_retry: break; default: av_log(avctx, AV_LOG_ERROR, "vbv buffer overflow\n"); - s->stuffing_bits = 0; + m->stuffing_bits = 0; } flush_put_bits(&s->pb); - s->frame_bits = put_bits_count(&s->pb); + m->frame_bits = put_bits_count(&s->pb); } /* update MPEG-1/2 vbv_delay for CBR */ @@ -1848,9 +1848,9 @@ vbv_retry: int vbv_delay, min_delay; double inbits = avctx->rc_max_rate * av_q2d(avctx->time_base); - int minbits = s->frame_bits - 8 * + int minbits = m->frame_bits - 8 * (s->vbv_delay_pos - 1); - double bits = s->rc_context.buffer_index + minbits - inbits; + double bits = m->rc_context.buffer_index + minbits - inbits; uint8_t *const vbv_delay_ptr = s->pb.buf + s->vbv_delay_pos; if (bits < 0) @@ -1885,7 +1885,7 @@ vbv_retry: return ret; } } - s->total_bits += s->frame_bits; + m->total_bits += m->frame_bits; pkt->pts = s->current_picture.f->pts; if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) { @@ -1901,7 +1901,7 @@ vbv_retry: if (s->mb_info) av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size); } else { - s->frame_bits = 0; + m->frame_bits = 0; } /* release non-reference frames */ @@ -1910,9 +1910,9 @@ vbv_retry: ff_mpeg_unref_picture(avctx, &s->picture[i]); } - av_assert1((s->frame_bits & 7) == 0); + av_assert1((m->frame_bits & 7) == 0); - pkt->size = s->frame_bits / 8; + pkt->size = m->frame_bits / 8; *got_packet = !!pkt->size; return 0; } @@ -3447,10 +3447,10 @@ static void merge_context_after_encode(MPVEncContext *dst, MPVEncContext *src) static int estimate_qp(MPVMainEncContext *m, int dry_run) { MPVEncContext *const s = &m->common; - if (s->next_lambda){ + if (m->next_lambda) { s->current_picture_ptr->f->quality = - s->current_picture.f->quality = s->next_lambda; - if(!dry_run) s->next_lambda= 0; + s->current_picture.f->quality = m->next_lambda; + if (!dry_run) m->next_lambda= 0; } else if (!s->fixed_qscale) { int quality = ff_rate_estimate_qscale(m, dry_run); s->current_picture_ptr->f->quality = diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h index 7b58ace64b..b03b785769 100644 --- a/libavcodec/mpegvideoenc.h +++ b/libavcodec/mpegvideoenc.h @@ -31,6 +31,7 @@ #include "libavutil/opt.h" #include "internal.h" #include "mpegvideo.h" +#include "ratecontrol.h" #define MPVENC_MAX_B_FRAMES 16 @@ -38,6 +39,13 @@ typedef MPVContext MPVEncContext; typedef struct MPVMainEncContext { MPVMainContext common; + /* bit rate control */ + int64_t total_bits; + int frame_bits; ///< bits used for the current frame + int stuffing_bits; ///< bits used for stuffing + int next_lambda; ///< next lambda used for retrying to encode a frame + RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c + /* temporary frames used by b_frame_strategy == 2 */ AVFrame *tmp_frames[MPVENC_MAX_B_FRAMES + 2]; int b_frame_strategy; diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 4c326741df..b0f319680b 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -81,7 +81,7 @@ static inline double bits2qp(RateControlEntry *rce, double bits) static double get_diff_limited_q(MPVMainEncContext *m, RateControlEntry *rce, double q) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; AVCodecContext *a = s->avctx; const int pict_type = rce->new_pict_type; const double last_p_q = rcc->last_qscale_for[AV_PICTURE_TYPE_P]; @@ -150,7 +150,7 @@ static double modify_qscale(MPVMainEncContext *m, RateControlEntry *rce, double q, int frame_num) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; const double buffer_size = s->avctx->rc_buffer_size; const double fps = get_fps(s->avctx); const double min_rate = s->avctx->rc_min_rate / fps; @@ -242,7 +242,7 @@ static double get_qscale(MPVMainEncContext *m, RateControlEntry *rce, double rate_factor, int frame_num) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; AVCodecContext *a = s->avctx; const int pict_type = rce->new_pict_type; const double mb_num = s->mb_num; @@ -315,7 +315,7 @@ static double get_qscale(MPVMainEncContext *m, RateControlEntry *rce, static int init_pass2(MPVMainEncContext *m) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; AVCodecContext *a = s->avctx; int i, toobig; double fps = get_fps(s->avctx); @@ -477,7 +477,7 @@ static int init_pass2(MPVMainEncContext *m) av_cold int ff_rate_control_init(MPVMainEncContext *m) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; int i, res; static const char * const const_names[] = { "PI", @@ -677,8 +677,7 @@ av_cold int ff_rate_control_init(MPVMainEncContext *m) av_cold void ff_rate_control_uninit(MPVMainEncContext *m) { - MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; emms_c(); av_expr_free(rcc->rc_eq_eval); @@ -688,7 +687,7 @@ av_cold void ff_rate_control_uninit(MPVMainEncContext *m) int ff_vbv_update(MPVMainEncContext *m, int frame_size) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; const double fps = get_fps(s->avctx); const int buffer_size = s->avctx->rc_buffer_size; const double min_rate = s->avctx->rc_min_rate / fps; @@ -866,7 +865,7 @@ static void adaptive_quantization(MPVMainEncContext *m, double q) void ff_get_2pass_fcode(MPVMainEncContext *m) { MPVEncContext *const s = &m->common; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; RateControlEntry *rce = &rcc->entry[s->picture_number]; s->f_code = rce->f_code; @@ -886,7 +885,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *m, int dry_run) double fps; int picture_number = s->picture_number; int64_t wanted_bits; - RateControlContext *rcc = &s->rc_context; + RateControlContext *rcc = &m->rc_context; AVCodecContext *a = s->avctx; RateControlEntry local_rce, *rce; double bits; @@ -904,11 +903,11 @@ float ff_rate_estimate_qscale(MPVMainEncContext *m, int dry_run) const int64_t last_var = s->last_pict_type == AV_PICTURE_TYPE_I ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum; - av_assert1(s->frame_bits >= s->stuffing_bits); + av_assert1(m->frame_bits >= m->stuffing_bits); update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), - s->frame_bits - s->stuffing_bits); + m->frame_bits - m->stuffing_bits); } if (s->avctx->flags & AV_CODEC_FLAG_PASS2) { @@ -937,7 +936,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *m, int dry_run) wanted_bits = (uint64_t)(s->bit_rate * (double)dts_pic->f->pts / fps); } - diff = s->total_bits - wanted_bits; + diff = m->total_bits - wanted_bits; br_compensation = (a->bit_rate_tolerance - diff) / a->bit_rate_tolerance; if (br_compensation <= 0.0) br_compensation = 0.001; @@ -951,7 +950,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *m, int dry_run) q = rce->new_qscale / br_compensation; ff_dlog(s, "%f %f %f last:%d var:%"PRId64" type:%d//\n", q, rce->new_qscale, - br_compensation, s->frame_bits, var, pict_type); + br_compensation, m->frame_bits, var, pict_type); } else { rce->pict_type = rce->new_pict_type = pict_type; @@ -1014,8 +1013,8 @@ float ff_rate_estimate_qscale(MPVMainEncContext *m, int dry_run) "size:%d var:%"PRId64"/%"PRId64" br:%"PRId64" fps:%d\n", av_get_picture_type_char(pict_type), qmin, q, qmax, picture_number, - wanted_bits / 1000, s->total_bits / 1000, - br_compensation, short_term_q, s->frame_bits, + wanted_bits / 1000, m->total_bits / 1000, + br_compensation, short_term_q, m->frame_bits, pic->mb_var_sum, pic->mc_mb_var_sum, s->bit_rate / 1000, (int)fps); } diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index 028b6b91aa..ebed90c729 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -1597,7 +1597,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, mpv->picture_number= avctx->frame_number; if(avctx->flags&AV_CODEC_FLAG_PASS2){ - mpv->pict_type = pic->pict_type = mpv->rc_context.entry[avctx->frame_number].new_pict_type; + mpv->pict_type = pic->pict_type = s->m.rc_context.entry[avctx->frame_number].new_pict_type; s->keyframe = pic->pict_type == AV_PICTURE_TYPE_I; if(!(avctx->flags&AV_CODEC_FLAG_QSCALE)) { pic->quality = ff_rate_estimate_qscale(&s->m, 0); @@ -1847,12 +1847,12 @@ redo_frame: s->current_picture->coded_picture_number = avctx->frame_number; s->current_picture->pict_type = pic->pict_type; s->current_picture->quality = pic->quality; - mpv->frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); - mpv->p_tex_bits = mpv->frame_bits - mpv->misc_bits - mpv->mv_bits; + s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); + mpv->p_tex_bits = s->m.frame_bits - mpv->misc_bits - mpv->mv_bits; mpv->current_picture.f->display_picture_number = mpv->current_picture.f->coded_picture_number = avctx->frame_number; mpv->current_picture.f->quality = pic->quality; - mpv->total_bits += 8*(s->c.bytestream - s->c.bytestream_start); + s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start); if(s->pass1_rc) if (ff_rate_estimate_qscale(&s->m, 0) < 0) return -1;