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 75F8E42A3C for ; Mon, 10 Oct 2022 03:13:43 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B428268BC93; Mon, 10 Oct 2022 06:13:39 +0300 (EEST) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073059.outbound.protection.outlook.com [40.92.73.59]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BF3C768BC85 for ; Mon, 10 Oct 2022 06:13:33 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QtENwrzJqGPgWyT21YuF2zhtUQ4Ykj1pQUV698Sg5G89gtdXYt0nxoAjWfSbz0UMGCCGz6vo/YowcZgEi4BjeFmAjH3vG/oHByu1svNG4Vqg4ZijNU5w6123KunfYhfCAEg2yj2HMfjAk4GkCCtC3LCERncU69f/qQMwH3+MicnEId0WtApX+sp5y0Yrhk7UCMtT+glwpTnyf4BxRnKMNG6WLI/iRwP1PAQ5yPDHZazSm96YgrybhLeStDIiXLRsYnGuVLN7MYq/rk+vxhlfspQ4HGm+Q37wonwOZLa6qVcJx9+ZVOFmrfdvQEL3MvMyd3U8lion4DUFNZGLmxDWLQ== 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=wSjjlaaU2+r9fbJ4kppe57c0k0xdiWPluDDpTqY/dOM=; b=YYsVrUmyxQc8h0J3tTyVVwCUxZQS2QtEz4vy2O3T626SM87chmfvBBi2KN7gY54PanVZcUAdy3yY+f2yupFTk3W7EJUsxehkJ1UcHD84O+4EoVRfkMJ+49UaxlUWHVuIMpkQRpInCcSoHT/bJ3oYuaSIrLJ5ZPW6JxZgq12IyuchbrfLRD/FmnbsM5Gb2ODqpiaPnReZNi4LRY2Z0BoUW8lkZXeW/c590+trgqZlmv2mmKao4kq3Bb9fGcSptWjy01LvFnyqyM8sBCqIX5Z08H7+XfZv0rUnlzfJjNh/6rymIbigOw7Iqi/aWZsVHZpPFiX9ppbZEPMvFnHW1d1qnA== 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=wSjjlaaU2+r9fbJ4kppe57c0k0xdiWPluDDpTqY/dOM=; b=nl3EsRZRoKm9tlC0kQtyItI5zqGKJQ3CK0e0xyZoWIzwWBlPlLyShi9QpjhdWZpHevi7SQmp5e/42OqKZFzV79yVpT5AuKdcW0xJ3jlR6dZ2O0uI6uYVSMxXJRFu6jdFLCc5pQRA1XHYTIU1fSvGIoO8GGAqXbAQbPcuEnKc/nikNFUEmeKWkYrn6rm/GMK++kTrMWq74hFRYx/K3t0j40DcX5MEKVzCh7HU/c8tjr2f5UnDcuHmEELn+EzaD5K8Zo3QdWiFA11md181NrO/1PYBG3LOdmO8bPZNzjTyhf7ivIBxfBKBJPdKpdvrUPcXD0FXLNMy2w7rRH41JRL61w== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by PR3P250MB0354.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:17d::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.32; Mon, 10 Oct 2022 03:13:28 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f9d7:680f:70c4:44fe]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f9d7:680f:70c4:44fe%7]) with mapi id 15.20.5709.015; Mon, 10 Oct 2022 03:13:28 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Oct 2022 05:13:01 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [MxHEvKPV++BNSxkys34Z9BQbmuvq+7BGjCnZxQq9Yjo=] X-ClientProxiedBy: AM5P194CA0008.EURP194.PROD.OUTLOOK.COM (2603:10a6:203:8f::18) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20221010031310.187429-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|PR3P250MB0354:EE_ X-MS-Office365-Filtering-Correlation-Id: b2abfa0d-56ff-4af1-9af8-08daaa6d66ea X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmruWxLySsUhFVxtZUJ43WkHRq/PX6X+eaa2c5j2FUnsSI/Ss/p1w/iOpaWK3F1bjii4TuQYrxeIn/HOcZ9GmSRcVfiRAyC9Ny4UtysaFW0jZqS2C6cgvNyfzxD7WnTWM32pBaa3yXmvdWdOvM/lnXzFuk3MQMirlcxmUN/2rUZJvtiF6LjLyCoJpGLO0JnU4rLYygMyuwMKuBMbHsQSgeXoenNaSzbR7FbhPJzmlHlmd+9tg3Wus9mUluVw4uEAXvPLgmSyzb9Neirl26aScevOoGOayPNtJXoWl7U8dezW9GyqynQFZq8LP1CgoFl0xZp0oHGGKZZ9czGw9cgundTvmCwgOcgm2YtZS8yWORtCtSjfx5gkY5wr3XCkEEUjJBKasIE7eSVPBY9Q/7qjRJHlzWoa6jiFqQ/UJKi3+gdoa2d8LyQmXdp1ORP3Y7FAqUFG8wuVVexzFTeXFlmsti0v+uMSSTD0OR/M42piRCcvFDqlGjcF7bjCf7pgpDNupuzQY1jDdDG/hVGjgM4qsn/k6HuRQX0RnayNUtfaLnIs2Lx6h9EKH0PATPyw0CUs049/WOZZwPsKF+KFwrlTSA5w2w4pI1RwLpTr8b/gagqKV1E3OOUW6VpQo2VStNC3YJ+1wWrTREz1hZ6Nx1TH601jovx7DUjj+gMQeJP5USKyxrmI2xSRWIVm+eELkfCP/7aomBbqSvr2I7rLzIYf3OuTdKPCZbV4J1UJBncBrrrYPYCFP4O4rhejTVWpptHm3Zk= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dTdEtxr2K6bEB6euiNp+VyO17YQvtdLND7lUWZpIa14y+KVyFDpvd6bFXHgNMKwM/7DXyiL4/GYnm4vun5cXtDghfTxFbsSWsx3jESDxOHkNGUP7IzL3WQ3HryiqSvNkvoqG2tfK6TTbBntsrMTrkLA/C5C+54yRbVtXmVUQEm5prSgjMBTHqntCZ9cnVWNf8C3MPMeFYAcRRui57Cy6WxjIBVi0pX1qkajKVP3ST0nbCUj5kSkZw8Vdf87bgoNNTAA1tz/EPEEI0Rg6KvDJdpvTmeJV0SA1jyYlZQ7+zhB0l7TtxfxDcYw5T0L6oZazOL2bAveh4D0bZH+GgyJBV+AbExxBgvQIoO+Gfh7x2X9aClsrJckLUWJNLe1HCOG6rF1WLY+CAkw6Hh6AR1R59UTPDsRDwiIkWmLrLTQHja5GASy3PtCKPe5nk62VAMBnflxnuWhWnJh74JxJCuwhcmwz339lvmT+m2tjndg4rJ0XWwgN3n7xqlMjOjnB0R34o5EkMa5NdFTOFWPCAWwrQj3auyiOCxy6BBCwrtgBZ7kNLtIK1siuOqzgHhlQP+y2mzft9EOLyktmjYALHW/baI5rQpoPhFFUq0AdBb1R9HQypQnCObt1gzDNCcdeIplAGEmnipqIsxXmChUheojrK9nc39d2mE7bDHVm3KvymXfZ+oP2t30i6/1ejw9ykZGQ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?F/TVr65BKDeBz3j9XtGoB41BZgnNjhiL50vZvxmJMb9nx8AZU4Q7V+PsxA8j?= =?us-ascii?Q?g6GI7Wva+gFgDnIfTtbR+PRQ2QcwqOx7BNu7a4b3Sr65mkf1YiAERnkSxauC?= =?us-ascii?Q?EEyUfxOAjhLlzxStBpUi4v73sNNRJRiZP4zC5XGETYH59wAZkTYJ7Mm2ZhCe?= =?us-ascii?Q?vjH0RfAI2rwoGEnh5/hR0yzmernyCmHC/VUY/mgKX5W6R2M2ZvgBIVWyNNyX?= =?us-ascii?Q?n+eYTcctnYb63Yr17SL1YI9god7PEc/khCvJCfUGv7V74h+odJJI2Ckqmfbu?= =?us-ascii?Q?whX++1jUPZwfnUxm5P2F3fPJ3S5o9E+X+PPSrfZtQ6g6OVHtV9nchkD5QPjS?= =?us-ascii?Q?E3MgOReLy96dr3ezCrEizZ89XqtuCHZBfIL6BO67tQeMSELjgBDJPO2Nbf8H?= =?us-ascii?Q?Ryz4tgrtGTUQRwHPM0QCv2Qte0XmnVURf1zIf1ylGQMp9dyGhrMtQlTKrMvi?= =?us-ascii?Q?t2Az9S2o+rD/LbqJwhTHmzDGHfqYAUiNzsqvotNK4aKHC8RIfRikYIbtul/k?= =?us-ascii?Q?tC9cV8zLPO+zXSQJe2mctWAuRAqlW/c6XuQhdOh2+q0YA/A7ycZdHJPynT31?= =?us-ascii?Q?qYNcOv3fpZ92U+jVo9l4SN4pOAsA1T6ial9OE84sGD0aGNohG0v5uT26FJiE?= =?us-ascii?Q?JwMrw4KljmY63hRwDfOCgZs7bq5PCvcZiwYE458WSZztkMlr7cmxhEyRJVG1?= =?us-ascii?Q?6rH881hv8HSKJ3RlLkSzxsNck5ekXKpUeqCS4Go1JM2xszqiXhM8qkQY5Wrk?= =?us-ascii?Q?0YlESDgnyItipk9jPFrSkCjCLna/NXHuWCNZ+MFkURxQJLSILUfFA5o9OUga?= =?us-ascii?Q?aWHUUdxdOZT1gIrryq3wB3XSAOhJ9KWTCeSpT6QRs8npKbxRq5MmRe7lWNkw?= =?us-ascii?Q?SRl9S48WUTapyp7xsNrYCFJbOkxD9a7oLgTz74+gHZQYKE24eFTbM/3knD7/?= =?us-ascii?Q?zhvVJqBA3LYUpERX/e94TwPhDaa+7pg2M1E5j2u2lynkPTDqNlIBsPwZcyyH?= =?us-ascii?Q?3j5oF0dyYVFUT1Q6HB7dCmpV12bRv0LMIXr+JmMjJmDl7GVw6vUD0rQXrpi/?= =?us-ascii?Q?cqr/SUSqaDZGeihK6jltc2XuFcqW9e9zbqKCoLd3D6w+1WrfUalNu6ABkY86?= =?us-ascii?Q?JfvqjanbVvTbzQprokJt0nYcTLF3Ov2uAiKOLQfCjI0aVSh8Tu+nQeYdHYj0?= =?us-ascii?Q?Hbhsu3wBk9llAORbl7iFq9a0sGKYwKs3HdCS8zTCtQdjTJbXGOxXn2Ba9eYx?= =?us-ascii?Q?r9vym+c9okmPmu7uRl75UI+5LJ7hCICPLu4Mvsq03ovP3yMMBx6LMUmrIq6x?= =?us-ascii?Q?cXF90plILfqMMAvUigUDA0KN?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b2abfa0d-56ff-4af1-9af8-08daaa6d66ea X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Oct 2022 03:13:28.3498 (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: PR3P250MB0354 Subject: [FFmpeg-devel] [PATCH 11/20] avcodec/snow: Move decoder/encoder-only inline funcs to snow(dec|enc).c 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 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: Signed-off-by: Andreas Rheinhardt --- libavcodec/snow.h | 219 ------------------------------------------- libavcodec/snowdec.c | 147 +++++++++++++++++++++++++++++ libavcodec/snowenc.c | 64 +++++++++++++ 3 files changed, 211 insertions(+), 219 deletions(-) diff --git a/libavcodec/snow.h b/libavcodec/snow.h index ed0f9abb42..8da3d99885 100644 --- a/libavcodec/snow.h +++ b/libavcodec/snow.h @@ -486,227 +486,8 @@ static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, in } } -static inline void init_ref(MotionEstContext *c, const uint8_t *const src[3], uint8_t *const ref[3], uint8_t *const ref2[3], int x, int y, int ref_index){ - SnowContext *s = c->avctx->priv_data; - const int offset[3]= { - y*c-> stride + x, - ((y*c->uvstride + x)>>s->chroma_h_shift), - ((y*c->uvstride + x)>>s->chroma_h_shift), - }; - int i; - for(i=0; i<3; i++){ - c->src[0][i]= src [i]; - c->ref[0][i]= ref [i] + offset[i]; - } - av_assert2(!ref_index); -} - - -/* bitstream functions */ - extern const int8_t ff_quant3bA[256]; #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0 -static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ - int i; - - if(v){ - const int a= FFABS(v); - const int e= av_log2(a); - const int el= FFMIN(e, 10); - put_rac(c, state+0, 0); - - for(i=0; i=el; i--){ - put_rac(c, state+22+9, (a>>i)&1); //22..31 - } - for(; i>=0; i--){ - put_rac(c, state+22+i, (a>>i)&1); //22..31 - } - - if(is_signed) - put_rac(c, state+11 + el, v < 0); //11..21 - }else{ - put_rac(c, state+0, 1); - } -} - -static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ - if(get_rac(c, state+0)) - return 0; - else{ - int i, e; - unsigned a; - e= 0; - while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10 - e++; - if (e > 31) - return AVERROR_INVALIDDATA; - } - - a= 1; - for(i=e-1; i>=0; i--){ - a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31 - } - - e= -(is_signed && get_rac(c, state+11 + FFMIN(e,10))); //11..21 - return (a^e)-e; - } -} - -static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){ - int i; - int r= log2>=0 ? 1<=0); - av_assert2(log2>=-4); - - while(v >= r){ - put_rac(c, state+4+log2, 1); - v -= r; - log2++; - if(log2>0) r+=r; - } - put_rac(c, state+4+log2, 0); - - for(i=log2-1; i>=0; i--){ - put_rac(c, state+31-i, (v>>i)&1); - } -} - -static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){ - int i; - int r= log2>=0 ? 1<=-4); - - while(log2<28 && get_rac(c, state+4+log2)){ - v+= r; - log2++; - if(log2>0) r+=r; - } - - for(i=log2-1; i>=0; i--){ - v+= get_rac(c, state+31-i)<width; - const int h= b->height; - int x,y; - - int run, runs; - x_and_coeff *xc= b->x_coeff; - x_and_coeff *prev_xc= NULL; - x_and_coeff *prev2_xc= xc; - x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; - x_and_coeff *prev_parent_xc= parent_xc; - - runs= get_symbol2(&s->c, b->state[30], 0); - if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); - else run= INT_MAX; - - for(y=0; yx == 0){ - rt= prev_xc->coeff; - } - for(x=0; xx <= x) - prev_xc++; - if(prev_xc->x == x + 1) - rt= prev_xc->coeff; - else - rt=0; - } - if(parent_xc){ - if(x>>1 > parent_xc->x){ - parent_xc++; - } - if(x>>1 == parent_xc->x){ - p= parent_xc->coeff; - } - } - if(/*ll|*/l|lt|t|rt|p){ - int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); - - v=get_rac(&s->c, &b->state[0][context]); - if(v){ - v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); - v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + ff_quant3bA[l&0xFF] + 3*ff_quant3bA[t&0xFF]]); - if ((uint16_t)v != v) { - av_log(s->avctx, AV_LOG_ERROR, "Coefficient damaged\n"); - v = 1; - } - xc->x=x; - (xc++)->coeff= v; - } - }else{ - if(!run){ - if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); - else run= INT_MAX; - v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); - v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]); - if ((uint16_t)v != v) { - av_log(s->avctx, AV_LOG_ERROR, "Coefficient damaged\n"); - v = 1; - } - - xc->x=x; - (xc++)->coeff= v; - }else{ - int max_run; - run--; - v=0; - av_assert2(run >= 0); - if(y) max_run= FFMIN(run, prev_xc->x - x - 2); - else max_run= FFMIN(run, w-x-1); - if(parent_xc) - max_run= FFMIN(max_run, 2*parent_xc->x - x - 1); - av_assert2(max_run >= 0 && max_run <= run); - - x+= max_run; - run-= max_run; - } - } - } - (xc++)->x= w+1; //end marker - prev_xc= prev2_xc; - prev2_xc= xc; - - if(parent_xc){ - if(y&1){ - while(parent_xc->x != parent->width+1) - parent_xc++; - parent_xc++; - prev_parent_xc= parent_xc; - }else{ - parent_xc= prev_parent_xc; - } - } - } - - (xc++)->x= w+1; //end marker -} - #endif /* AVCODEC_SNOW_H */ diff --git a/libavcodec/snowdec.c b/libavcodec/snowdec.c index 5c95ffde11..3a835650a5 100644 --- a/libavcodec/snowdec.c +++ b/libavcodec/snowdec.c @@ -29,6 +29,153 @@ #include "rangecoder.h" #include "mathops.h" +static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed) +{ + if (get_rac(c, state + 0)) + return 0; + else { + int e; + unsigned a; + e = 0; + while (get_rac(c, state + 1 + FFMIN(e, 9))) { //1..10 + e++; + if (e > 31) + return AVERROR_INVALIDDATA; + } + + a = 1; + for (int i = e - 1; i >= 0; i--) + a += a + get_rac(c, state + 22 + FFMIN(i, 9)); //22..31 + + e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); //11..21 + return (a ^ e) - e; + } +} + +static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2) +{ + int r = log2 >= 0 ? 1 << log2 : 1; + int v = 0; + + av_assert2(log2 >= -4); + + while (log2 < 28 && get_rac(c, state + 4 + log2)) { + v += r; + log2++; + if (log2 > 0) r += r; + } + + for (int i = log2 - 1; i >= 0; i--) + v += get_rac(c, state + 31 - i) << i; + + return v; +} + +static void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation) +{ + const int w = b->width; + const int h = b->height; + + int run, runs; + x_and_coeff *xc = b->x_coeff; + x_and_coeff *prev_xc = NULL; + x_and_coeff *prev2_xc = xc; + x_and_coeff *parent_xc = parent ? parent->x_coeff : NULL; + x_and_coeff *prev_parent_xc = parent_xc; + + runs = get_symbol2(&s->c, b->state[30], 0); + if (runs-- > 0) run = get_symbol2(&s->c, b->state[1], 3); + else run = INT_MAX; + + for (int y = 0; y < h; y++) { + int v = 0; + int lt = 0, t = 0, rt = 0; + + if (y && prev_xc->x == 0) + rt = prev_xc->coeff; + + for (int x = 0; x < w; x++) { + int p = 0; + const int l = v; + + lt= t; t= rt; + + if (y) { + if (prev_xc->x <= x) + prev_xc++; + if (prev_xc->x == x + 1) + rt = prev_xc->coeff; + else + rt = 0; + } + if (parent_xc) { + if (x>>1 > parent_xc->x) + parent_xc++; + if (x>>1 == parent_xc->x) + p = parent_xc->coeff; + } + if (/*ll|*/l|lt|t|rt|p) { + int context = av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); + + v = get_rac(&s->c, &b->state[0][context]); + if (v) { + v = 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); + v += get_rac(&s->c, &b->state[0][16 + 1 + 3 + ff_quant3bA[l&0xFF] + 3 * ff_quant3bA[t&0xFF]]); + if ((uint16_t)v != v) { + av_log(s->avctx, AV_LOG_ERROR, "Coefficient damaged\n"); + v = 1; + } + xc->x = x; + (xc++)->coeff = v; + } + } else { + if (!run) { + if (runs-- > 0) run = get_symbol2(&s->c, b->state[1], 3); + else run = INT_MAX; + v = 2 * (get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); + v += get_rac(&s->c, &b->state[0][16 + 1 + 3]); + if ((uint16_t)v != v) { + av_log(s->avctx, AV_LOG_ERROR, "Coefficient damaged\n"); + v = 1; + } + + xc->x = x; + (xc++)->coeff = v; + } else { + int max_run; + run--; + v = 0; + av_assert2(run >= 0); + if (y) max_run = FFMIN(run, prev_xc->x - x - 2); + else max_run = FFMIN(run, w-x-1); + if (parent_xc) + max_run = FFMIN(max_run, 2*parent_xc->x - x - 1); + av_assert2(max_run >= 0 && max_run <= run); + + x += max_run; + run -= max_run; + } + } + } + (xc++)->x = w+1; //end marker + prev_xc = prev2_xc; + prev2_xc = xc; + + if (parent_xc) { + if (y & 1) { + while (parent_xc->x != parent->width+1) + parent_xc++; + parent_xc++; + prev_parent_xc= parent_xc; + } else { + parent_xc= prev_parent_xc; + } + } + } + + (xc++)->x = w + 1; //end marker +} + static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, IDWTELEM * old_buffer, int plane_index, int add, int mb_y){ Plane *p= &s->plane[plane_index]; const int mb_w= s->b_width << s->block_max_depth; diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index 929edc1340..addca0ced9 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -37,6 +37,70 @@ #include "mpegvideo.h" #include "h263enc.h" +static void init_ref(MotionEstContext *c, const uint8_t *const src[3], + uint8_t *const ref[3], uint8_t *const ref2[3], + int x, int y, int ref_index) +{ + SnowContext *s = c->avctx->priv_data; + const int offset[3] = { + y*c-> stride + x, + ((y*c->uvstride + x) >> s->chroma_h_shift), + ((y*c->uvstride + x) >> s->chroma_h_shift), + }; + for (int i = 0; i < 3; i++) { + c->src[0][i] = src [i]; + c->ref[0][i] = ref [i] + offset[i]; + } + av_assert2(!ref_index); +} + +static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed) +{ + if (v) { + const int a = FFABS(v); + const int e = av_log2(a); + const int el = FFMIN(e, 10); + int i; + + put_rac(c, state + 0, 0); + + for (i = 0; i < el; i++) + put_rac(c, state + 1 + i, 1); //1..10 + for(; i < e; i++) + put_rac(c, state + 1 + 9, 1); //1..10 + put_rac(c, state + 1 + FFMIN(i, 9), 0); + + for (i = e - 1; i >= el; i--) + put_rac(c, state + 22 + 9, (a >> i) & 1); //22..31 + for(; i >= 0; i--) + put_rac(c, state + 22 + i, (a >> i) & 1); //22..31 + + if (is_signed) + put_rac(c, state + 11 + el, v < 0); //11..21 + } else { + put_rac(c, state + 0, 1); + } +} + +static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2) +{ + int r = log2 >= 0 ? 1<= 0); + av_assert2(log2 >= -4); + + while (v >= r) { + put_rac(c, state + 4 + log2, 1); + v -= r; + log2++; + if (log2 > 0) r += r; + } + put_rac(c, state + 4 + log2, 0); + + for (int i = log2 - 1; i >= 0; i--) + put_rac(c, state + 31 - i, (v >> i) & 1); +} + static av_cold int encode_init(AVCodecContext *avctx) { SnowContext *s = avctx->priv_data; -- 2.34.1 _______________________________________________ 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".