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 517F84127A for ; Sat, 10 Jun 2023 10:24:15 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 476BE6898EE; Sat, 10 Jun 2023 13:24:12 +0300 (EEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2073.outbound.protection.outlook.com [40.92.90.73]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 046F968BF5A for ; Sat, 10 Jun 2023 13:24:05 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=f37pBhYeLARc69JSc5k9CbttDVXe9OC8KK2DRni7ZP3NmBIjzyIDEygFakrTzd0+x7bySKvx1J07M9VOlveDVuMXmcJT0+CyKVFOLxu+/G+D9hWeOXR78toAdBYXurZpTeWVCXxWO3hE3lxup4CpzOwUc/+4Gdc1WkJEDuOZs6LSlFxcHcjKp+Icb6V+1jG3j8B7oJwTc7PZ5KrQFpBmVVrpGUhcVx8qp45VeARVgCjKpbQa5wcxWNndgFsbR/SCmB884xiLF9ErqJNZxqeCIPLIwaAuld4080OCa/tBjwpKvlxcLcXLEldyjmo3IC+sFcQWcP2GXtWenTzGcTAkEw== 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=cEAd+mN6he8lYZcwC0XWUYNJjlIVlRiNMA4QV6gQqS0=; b=JyGt2YwV7wlXY9+b6MsqnC/NYhTvwjRN5Jfc56NzMxuGPJ+fnC3ypsJScP8p8dPtjumHCAKZfbgUDoIMJ4TaAM2zfPZXoAyhThi0SBRgtMB1CqNme1rv7lEbFOnisVqdzA6Kvrtxc3+uIwio3FuzmgxP6I0EuZfdz5mSC+dpnf/+Hq7dC9zYYy4X5yr+BcbXmg0rCD19XWFgpvIuUhRh/7In/V3XKB+QsBNdPE/6EkzYl96RkjBw+JTkgRi0otXWb8wEzBr9W41W2syoqPJLbbOVaF31+YSUdcLVghyiriVJG3cK81wO6s2rAdKNleShJgddbTqM34zVUWQhxx/dCA== 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=cEAd+mN6he8lYZcwC0XWUYNJjlIVlRiNMA4QV6gQqS0=; b=KWD/WkEYleYZcQ58haRXomgXkueiHdV3xQki8x1LY4i78H7YIuXhictgrrwwUukRJW/1gh2Chgbh8bhEvzAzmc75nVYAEsXFoRGFxpL1cf7yVab9jJz58TbVsGVXy2oBdOUCSTqOTz/u3bf9iUQ/StH/RY0fqB58jL2tB+gThmOGpNz2AO28uok6anTit4eEwqBGqmS7+HJntGam/MtUtyGE6z7DtJRFkY0QV9YExDCu6uVTRVIND11KWqekJNOzAxYb0+0ESc5WhFjeMvmCHXQZhuByM6yoNW+hgAhlfbbqEKpmGB82tlHZ+2PDnfXXhlGiQ+Q13ABhYN0AQyqqWg== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0374.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:329::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.33; Sat, 10 Jun 2023 10:24:04 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::a38:e93f:c7e0:f473]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::a38:e93f:c7e0:f473%6]) with mapi id 15.20.6455.034; Sat, 10 Jun 2023 10:24:04 +0000 Message-ID: Date: Sat, 10 Jun 2023 12:24:51 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [wdXrrxYfDeNtLrNKdxFYzKHxUUFh7nGO] X-ClientProxiedBy: ZR2P278CA0076.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:65::15) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <745fff7c-8071-8d67-ebce-8e803e003f47@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0374:EE_ X-MS-Office365-Filtering-Correlation-Id: 6316c4a3-14e9-4919-69f1-08db699cd07a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: v8E7pufE1XBqMClDpl/rIXRl6W60w53uPq6hr6xppjQy32uHbxt49ZiHNTIWE6V9FEJktDThzsR2LaEs1QxszjdEAhrurwtdycy0sJJI7ZUIkgZjE376tg7rT2RduS46L2GnM22CdzYELIvSeJWBtXRhXOhXxSTQfmwxhqi2x0/FxN2h/XTxaiKgq0s8N7hAhIcDf3k2Xj+6E3lXPslodF41nzsuf2qHpj+C07c9Il4dp8OfT47BcCOnFzSwcX92EoAH4QUa9WIOBmNhcKMFjWpzbRUNk+oWkmchlO43oLZjnph5nZUaeSrFO71YAWvtaaYSuWHKAzVGhjOFzdZQciIeWPETl6QqbHNFps/hNfHNnK2SFxb4IQ52q5pjOBBHLrOzFSai+GkbQKplImh/5B6ssvurQtlY9J+ywQIeSH26NSdu16ZI06us+i15fnjRnkRyFSDh0nf9wRirGsyJfGeJa2/igMoUZEIUN4WPzE+1jmZbWfYqzc8vzbRVXKGDIVAlCxtJf2EDpa7DQqrR0j+JF2kIkokyQetQ1d/qZxmekdAWBZAMImZPvJEk2jE5xm1H5pKF/mD0LVqXkmFJP2X8OMf3GiQPwF/diIIPOE0yL+/MDwwUaTohMwpcPUej X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SmVYcS8rSHBIRHE3NVhBSlFkSHpPSFBTeitNZmpPaDIzcG5ER3dDR2NZTmZG?= =?utf-8?B?dHE3ckhFbHBLaW52a0hyOHpKK2QxK1pEMnhEQzdhQURuaysxa2V3VmNqVzZu?= =?utf-8?B?cWp4S1ZDS0s1cTF0N2lxeGNhN0RLNGYyMzhSZDcwcFViNzlmQ3o1L1Y5UHRk?= =?utf-8?B?U1V5REVWaTU5UlVETXpuMnlydk5NQVpLcUhxckpQODNBWEk4VU0rRXh6RUxX?= =?utf-8?B?SUtDeWt3NGZ5SHF5dFBnQU1MQnE1bktVQUpaM0hYMThSeUZYekk0aWVEanBa?= =?utf-8?B?M2NmaUJiYW45dDltZXlIYVEyZlcvbTl2SW4yc1dYZkVIUEF2MVRidElqakZL?= =?utf-8?B?KzhJdDJ4UUdmTDdKOW1FYkd2eXA5UVJrbXl2MGxiRnpjbjVoU2dqK3owZm14?= =?utf-8?B?TXhDSGJKUHZlUDVwZTZzY3pmQW4wekwrWCtLYVdYZ3N6b2xjWGFuc05yM1VT?= =?utf-8?B?VjFyTFJzbWFMclZMSjBBM1BrcURpS2VTKzZSbFYyM1dyQ3ZJNVlZQmFSUlFL?= =?utf-8?B?ckwyVEMxbEhnL2lTRkIwSGFyNUJCcHhqQWx0SkV4YmlpRnkzY3ljL2w0ZlMw?= =?utf-8?B?QUpydStMQTY0YnBTbStlWVdKUUdmbkNOdWVJL3pPOFpwdnhrNzZkMWN4Q1BL?= =?utf-8?B?cDV6VENXRTE3eHFLRGtKbW54SFVkQlZ6NndxQXpyOFoxbG1TRlJ4eVN0emsw?= =?utf-8?B?KzFKS1R3UjdmWkliQU8xNm5qYXllZHlPemZqV1FsS1JsK0s5YlRMckx4Y0Zh?= =?utf-8?B?VmVOTjdCL0xNZGtSVWdmMHFETlM0andWN3FoWXpyYzNYaWdxb25QNnFLdHp0?= =?utf-8?B?M0FYc0R6MHlsRmlwUmJrU0Zlc2xOdHN2alFUak9Cejd0OHJISGJadk9CU3Yv?= =?utf-8?B?TVkrMnBHK0tiZnN6WmRYUzlOTWg1d2dMN1hTVDN0RG5ZL3QvNVRIQ3VQK294?= =?utf-8?B?NmQyQ0MxSWlHaTNhKysrUTMyQnBZeFZyUWswbEpqWTQ2Y2RORFEraGJXWXUw?= =?utf-8?B?ZEJwZTRRTVV2Zlg3TDhDZjBLemVQZk85L1JxWFhnK3g5N2N0ZlJvRFJvbjdQ?= =?utf-8?B?YTdTZks1OGJRWWc5L1hqeU9HS3dlZkNyVmFsZzc3WGVrT3pNRmZSMTlYSENL?= =?utf-8?B?NHN1STdqNGFrMG5lOGRDK084dXBrTDEzdjBFN3d2NHp0Ukx0MHlrV1NiZW44?= =?utf-8?B?R05xbmIwTHZHdC9WbVdWNkcrWGJXRGM0Ump1cmN3L2NzWEVHMGIra0lhSWNJ?= =?utf-8?B?UTk5cTJNMDNubGpVUXVpMHFxelJ5UkMyRDZYYjE5ZGZGTHNJNmh0R2Q3UnBz?= =?utf-8?B?L1IzeVMzM25Ea1ZwNEVwUDRuYXRHbXdZQ0MxZUg1a3hMaEprRGE2Y3ZubHRT?= =?utf-8?B?RVdCTTBHYTQzR0s2UDFEbHltYXgwL3cvSGNJcGhNOEN4TTJWNTFicVJrbWZQ?= =?utf-8?B?QnJhUTVUTkpnR2M0Y3hqYmc3WWdZdHZvc3U1akRsQjE0c0YzUXBnTGZLNnVs?= =?utf-8?B?SkdjcW55Tm1ITFlIUUlHZlEyTEIyZ2lpczM3NVFqZkNuODJDWkRDSmp3dTl5?= =?utf-8?B?Uys0TFoyRU9QUlUvb3ZOT2dpWnkyN0lsSDhrWm1CcUd3blFMdmxPSGV0LytN?= =?utf-8?B?UnJyRVc0OCt6RUFZOHdtdnhtRmJqSU9FYnhOY3U1VEtGOWNXb1ovd2w2dWlJ?= =?utf-8?Q?xq4Few4pMTbQeuZYnntd?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6316c4a3-14e9-4919-69f1-08db699cd07a X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jun 2023 10:24:03.9755 (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: AM8P250MB0374 Subject: Re: [FFmpeg-devel] [PATCH] avcodec: add VMX1 decoder 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: Paul B Mahol: > +static av_cold int decode_init(AVCodecContext *avctx) > +{ > + VMIXContext *s = avctx->priv_data; > + > + avctx->bits_per_raw_sample = 8; > + avctx->pix_fmt = AV_PIX_FMT_YUV422P; > + > + avctx->coded_width = FFALIGN(avctx->width, 16); > + avctx->coded_height = FFALIGN(avctx->height, 16); > + > + ff_idctdsp_init(&s->idsp, avctx); Missing idctdsp configure dependency. > + ff_permute_scantable(s->scan, ff_zigzag_direct, > + s->idsp.idct_permutation); > + return 0; > +} > + > +static inline int get_se_golomb_vmix(GetBitContext *gb) > +{ > + unsigned int buf = get_ue_golomb_long(gb); > + int sign = (buf & 1) - 1; > + return ((buf >> 1) ^ (~sign)); > +} > + > +static int decode_dcac(AVCodecContext *avctx, > + GetBitContext *dc_gb, GetBitContext *ac_gb, > + unsigned *dcrun, unsigned *acrun, > + AVFrame *frame, int width, int by, int plane) > +{ > + const ptrdiff_t linesize = frame->linesize[plane]; > + uint8_t *dst = frame->data[plane] + by * linesize; > + unsigned dc_run = *dcrun, ac_run = *acrun; > + LOCAL_ALIGNED_32(int16_t, block, [64]); > + VMIXContext *s = avctx->priv_data; > + const int16_t *factors = s->factors; > + const uint8_t *scan = s->scan; > + const int add = plane ? 0 : 1024; > + int i, dc_v = 0, ac_v = 0, dc = 0; > + > + for (int y = 0; y < 2; y++) { > + for (int x = 0; x < width; x += 8) { > + memset(block, 0, sizeof(*block)*64); > + > + if (dc_run > 0) { > + dc_run--; > + } else { > + dc_v = get_se_golomb_vmix(dc_gb); > + dc += dc_v; > + if (!dc_v) > + dc_run = get_ue_golomb_long(dc_gb); > + } > + > + for (int n = 0; n < 64; n++) { > + if (ac_run > 0) { > + ac_run--; > + continue; > + } > + > + ac_v = get_se_golomb_vmix(ac_gb); > + i = scan[n]; > + block[i] = (ac_v * factors[i]) >> 4; > + if (!ac_v) > + ac_run = get_ue_golomb_long(ac_gb); > + } > + > + block[0] = ((dc + add) * 16) >> 4; > + s->idsp.idct_put(dst + x, linesize, block); > + } > + > + dst += 8 * linesize; > + } > + > + *dcrun = dc_run; > + *acrun = ac_run; > + > + return 0; > +} > + > +static int decode_slice(AVCodecContext *avctx, AVFrame *frame, > + const uint8_t *dc_src, unsigned dc_slice_size, > + const uint8_t *ac_src, unsigned ac_slice_size, > + int by) > +{ > + unsigned dc_run = 0, ac_run = 0; > + GetBitContext dc_gb, ac_gb; > + int ret; > + > + ret = init_get_bits8(&dc_gb, dc_src, dc_slice_size); > + if (ret < 0) > + return ret; > + > + ret = init_get_bits8(&ac_gb, ac_src, ac_slice_size); > + if (ret < 0) > + return ret; > + > + for (int p = 0; p < 3; p++) { > + const int rshift = !!p; > + ret = decode_dcac(avctx, &dc_gb, &ac_gb, > + &dc_run, &ac_run, frame, > + frame->width >> rshift, by, p); > + if (ret < 0) > + return ret; > + > + if (get_bits_left(&dc_gb) < 0) > + return AVERROR_INVALIDDATA; > + if (get_bits_left(&ac_gb) < 0) > + return AVERROR_INVALIDDATA; > + > + align_get_bits(&dc_gb); > + align_get_bits(&ac_gb); > + } > + > + if (get_bits_left(&dc_gb) > 0) > + return AVERROR_INVALIDDATA; > + if (get_bits_left(&ac_gb) > 0) > + return AVERROR_INVALIDDATA; > + > + return 0; > +} > + > +static int decode_slices(AVCodecContext *avctx, void *arg, > + int n, int thread_nb) > +{ > + VMIXContext *s = avctx->priv_data; > + const uint8_t *dc_slice_ptr = s->slices[n].dc_ptr; > + const uint8_t *ac_slice_ptr = s->slices[n].ac_ptr; > + unsigned dc_slice_size = s->slices[n].dc_size; > + unsigned ac_slice_size = s->slices[n].ac_size; > + AVFrame *frame = arg; > + > + return decode_slice(avctx, frame, dc_slice_ptr, dc_slice_size, > + ac_slice_ptr, ac_slice_size, n * 16); > +} > + > +static int decode_frame(AVCodecContext *avctx, > + AVFrame *frame, int *got_frame, > + AVPacket *avpkt) > +{ > + VMIXContext *s = avctx->priv_data; > + unsigned offset = 3, q; > + int ret; > + > + if (avpkt->size <= 7) > + return AVERROR_INVALIDDATA; > + > + if (avpkt->data[0] != 0x01) > + return AVERROR_INVALIDDATA; > + > + q = av_clip(99 - av_clip(avpkt->data[1], 0, 99), 0, FF_ARRAY_ELEMS(quality) - 1); The inner av_clip() is redundant. > + for (int n = 0; n < 64; n++) > + s->factors[n] = quant[n] * quality[q]; > + > + s->nb_slices = avpkt->data[2]; > + if (!s->nb_slices || s->nb_slices > (avctx->height + 15) / 16) > + return AVERROR_INVALIDDATA; > + > + ret = ff_thread_get_buffer(avctx, frame, 0); This should be moved after the loops below in order to avoid an allocation in case of invalid input. > + if (ret < 0) > + return ret; > + > + for (int n = 0; n < s->nb_slices; n++) { > + unsigned slice_size; > + > + if (offset + 4 > avpkt->size) > + return AVERROR_INVALIDDATA; > + > + slice_size = AV_RL32(avpkt->data + offset); > + if (slice_size > avpkt->size) > + return AVERROR_INVALIDDATA; > + > + if (avpkt->size - slice_size - 4LL < offset) > + return AVERROR_INVALIDDATA; > + > + s->slices[n].dc_size = slice_size; > + s->slices[n].dc_ptr = avpkt->data + offset + 4; > + offset += slice_size + 4; > + } > + > + for (int n = 0; n < s->nb_slices; n++) { > + unsigned slice_size; > + > + if (offset + 4 > avpkt->size) > + return AVERROR_INVALIDDATA; > + > + slice_size = AV_RL32(avpkt->data + offset); > + if (slice_size > avpkt->size) > + return AVERROR_INVALIDDATA; > + > + if (avpkt->size - slice_size - 4LL < offset) > + return AVERROR_INVALIDDATA; > + > + s->slices[n].ac_size = slice_size; > + s->slices[n].ac_ptr = avpkt->data + offset + 4; > + offset += slice_size + 4; > + } These loops could be combined if you modified the way you stored the data by putting the dc information into slices[n] and the corresponding ac information into slices[n + nb_slices]. In this case, you would need to unpack this in decode_slices. If you don't do this, then there is no need to put nb_slices in the context. It can be local to this function. > + > + avctx->execute2(avctx, decode_slices, frame, NULL, s->nb_slices); > + > + frame->pict_type = AV_PICTURE_TYPE_I; > + frame->flags |= AV_FRAME_FLAG_KEY; > + > + *got_frame = 1; > + > + return avpkt->size; > +} _______________________________________________ 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".