From patchwork Sat Feb 20 16:37:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 25843 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 269B444B169 for ; Sat, 20 Feb 2021 18:37:39 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0C1C568A1C5; Sat, 20 Feb 2021 18:37:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 99F06687F71 for ; Sat, 20 Feb 2021 18:37:31 +0200 (EET) Received: by mail-ej1-f42.google.com with SMTP id do6so21766958ejc.3 for ; Sat, 20 Feb 2021 08:37:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=D+6G89Qu1QCP5YKVGMHSzSdXK3sfZ2jZFplBUndq+Uw=; b=lMGoBAf+ZYT973TGE8JNRzAfLTU1eM8lfOcdz+FozrI+1KlFSUJ2Qrdhcx79ix+6vH GegYYHc/mYgQD7UUlYB+BoxkrNk6KPA6dO8XKlkecIxuprAjnITKxqNtRL51Xe7h2mMP alEpdC1plqH93KpQijGeOYbOvVLpiVwWKM0K+MBytO0uo5hzYGV8lZ3+TOWjIc1EgGlT vwNHiSzNoLMT0x3jJZKT5914WTMPmThHvisiRbbO+p46ovyEYMB0Ni3c0erCbP98xFkc TaRjg6CzpMLy62rABSMMV22/Nt/4g94RR/q8kSOiwt8MZUpEOILdlCPUmoN//lvUbDlI y9vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=D+6G89Qu1QCP5YKVGMHSzSdXK3sfZ2jZFplBUndq+Uw=; b=er+lkApkOap4E3sjJhioLIYujfXEjL4Kl5L7Wq3vc4YAYQOU9JIamqVBWKxs0Ix3BH DWddjAk4WHWCzwdwYOpRVwmuSj+7MMFyeSymi+S/rsszySrjP7Bji7PpqYqApqc2yeuK quUxOEgxZFGe5eJmSy9rqHof+2iklR9AFzPfkMz/ve2rQKbly9rBjQNvOZyZYi8RxT3b 34ve8nNQqV30nNV21FYgk/aIR3OsPdnYrQIp2acWJzSa/fXZz2ZYDooEkfMTiASW46Me yVV7JAFniPPQ5msuvbwpr5dH4+iWhkcwKerdtKTfctElQwVrIS70AseAeLsn0U4fp2KF bApg== X-Gm-Message-State: AOAM533zdHopz941afUaaGIBKNNXlNwaLjIxaclTDohnX/RWPTRzxM2u c1iwp/KpPHFDamgcWgDLgH6JJmU36+Y07w== X-Google-Smtp-Source: ABdhPJztXDxWFbdZ8V4pTX5yy74k6IpQrWSKkV7YYmeg25D/49SyaQ9wgYKC7P2KPhw7Ar9arhu6Gw== X-Received: by 2002:a17:906:5fcc:: with SMTP id k12mr6388098ejv.113.1613839051130; Sat, 20 Feb 2021 08:37:31 -0800 (PST) Received: from localhost.localdomain ([94.250.162.225]) by smtp.gmail.com with ESMTPSA id y8sm7325300edd.97.2021.02.20.08.37.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Feb 2021 08:37:30 -0800 (PST) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Feb 2021 17:37:19 +0100 Message-Id: <20210220163719.20482-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210220163719.20482-1-onemda@gmail.com> References: <20210220163719.20482-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/dpx_parser: export framerate and timebase of frames X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Also always skip pixel bytes. Signed-off-by: Paul B Mahol --- libavcodec/dpx_parser.c | 68 ++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/libavcodec/dpx_parser.c b/libavcodec/dpx_parser.c index 8e4a01e09d..ed7b085040 100644 --- a/libavcodec/dpx_parser.c +++ b/libavcodec/dpx_parser.c @@ -32,6 +32,7 @@ typedef struct DPXParseContext { ParseContext pc; uint32_t index; + uint32_t hsize; uint32_t fsize; uint32_t remaining_size; int is_be; @@ -43,14 +44,18 @@ static int dpx_parse(AVCodecParserContext *s, AVCodecContext *avctx, { DPXParseContext *d = s->priv_data; uint32_t state = d->pc.state; - int next = END_NOT_FOUND; - int i = 0; + int next = END_NOT_FOUND, i = 0; s->pict_type = AV_PICTURE_TYPE_I; + s->key_frame = 1; *poutbuf_size = 0; - if (buf_size == 0) - next = 0; + *poutbuf = NULL; + + if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { + next = buf_size; + goto flush; + } if (!d->pc.frame_start_found) { for (; i < buf_size; i++) { @@ -64,36 +69,53 @@ static int dpx_parse(AVCodecParserContext *s, AVCodecContext *avctx, } } d->pc.state = state; - } else { - if (d->remaining_size) { - i = FFMIN(d->remaining_size, buf_size); - d->remaining_size -= i; - if (d->remaining_size) - goto flush; + } else if (d->remaining_size) { + i = FFMIN(d->remaining_size, buf_size); + d->remaining_size -= i; + if (!d->remaining_size) { + d->pc.frame_start_found = 0; } + goto flush; } - for (; d->pc.frame_start_found && i < buf_size; i++) { + for (; i < buf_size; i++) { d->pc.state = (d->pc.state << 8) | buf[i]; d->index++; - if (d->index == 17) { + if (d->index == 5) { + d->hsize = d->is_be ? d->pc.state : av_bswap32(d->pc.state); + } else if (d->index == 17) { d->fsize = d->is_be ? d->pc.state : av_bswap32(d->pc.state); - if (d->fsize <= 1664) { + + if (d->fsize <= 1664 || d->fsize <= d->hsize) { d->pc.frame_start_found = 0; goto flush; } - if (d->fsize > buf_size - i + 19) - d->remaining_size = d->fsize - buf_size + i - 19; - else - i += d->fsize - 19; - break; - } else if (d->index > 17) { - if (d->pc.state == MKBETAG('S','D','P','X') || - d->pc.state == MKTAG('S','D','P','X')) { - next = i - 3; + if (d->hsize < 1728) { + if (d->fsize > buf_size - i + 19) { + d->remaining_size = d->fsize - buf_size + i - 19; + } else { + i += d->fsize - 19; + } break; } + } else if (d->index == 1725) { + uint32_t fps = d->is_be ? d->pc.state : av_bswap32(d->pc.state); + + avctx->framerate = av_d2q(av_int2float(fps), 4096); + avctx->time_base = av_inv_q(avctx->framerate); + + d->fsize -= d->index + 2; + if (d->fsize > buf_size - i) { + d->remaining_size = d->fsize - buf_size + i; + } else { + i += d->fsize; + } + break; + } else if (state == MKBETAG('S','D','P','X') || + state == MKTAG('S','D','P','X')) { + next = i - 3; + break; } } @@ -101,8 +123,6 @@ flush: if (ff_combine_frame(&d->pc, next, &buf, &buf_size) < 0) return buf_size; - d->pc.frame_start_found = 0; - *poutbuf = buf; *poutbuf_size = buf_size; return next;