From patchwork Sat Jul 10 01:10:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Beranek X-Patchwork-Id: 28882 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp1210141ios; Fri, 9 Jul 2021 18:10:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx5u/sWIbnHQFE7JxZN1pjJeTli5W0R/yEm/v4cVvnm+dHnK9MhVuXwSIel/+2brmCiuzqz X-Received: by 2002:a17:906:9719:: with SMTP id k25mr13060999ejx.460.1625879426462; Fri, 09 Jul 2021 18:10:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625879426; cv=none; d=google.com; s=arc-20160816; b=YFH72PaLrUDY386/zuQjzh/J/pqHPhFrBZRLjwHiaS46qeTLjDg8Sm+WY3+tx8u4hT Hcy66maJpX3XZSnVESbOx/WCuUJJxujlAk3JZ8Gh55Z+JEk9MaLY7dkXHwqu7osE8hhf UsboBxVEbVFh2ofLX0kSJF+NZBmqH924DJkOzm5f43qT+mkv11VSfd1SANVlk4Q95D5u ifTxb0+vB859xBmmEESNg+lrhOtVJWtndgyfKjNAWmDEVosF06hY4zYX6QKrz0mgmxgO jRikNBRrwBZMteWvtEJW7WQhOiwTXHiuv+GKPbfUClXMb0cee75AZJaZLIfZRDtR7XE2 kjHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=Btyc5+CoNlSQ9fAS8LXLPtIAmhhG1aZItVJEirwkeO8=; b=SCg+IbPu0MNFCfDEiN5JFDbVG5loaSJnlMY3E2/83OkXIhQeUznflEu01w/u2TkBPG Yw7jGja0lOd8O9xuuRpoNZeehesgZ3R79yYrrmaC1KYMQyc2gxgvZ7Djc1GIHnTikW2L 2tZy+Pua9ndtpISRD0V0FW+WotqEWJ6Yi3kCm0gXVQeVFtvfDbzfr0XkgY7va47zeiHE tgrk/6lFveeK94peOkY4m8ndkAy+cXHTQOMqX/6hZ7XdaK5at6QO2vTiiIz6sNZKA12F RM8r7f+wcD5w7oWdbbvlGM576YOmp05EUw4Rlw9TA9kqFdRZTgqGUullH3twX/hwwiIT o2ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@prusa3d-cz.20150623.gappssmtp.com header.s=20150623 header.b=sb3pSREw; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gt42si9106523ejc.668.2021.07.09.18.10.25; Fri, 09 Jul 2021 18:10:26 -0700 (PDT) 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=@prusa3d-cz.20150623.gappssmtp.com header.s=20150623 header.b=sb3pSREw; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5B12C689E41; Sat, 10 Jul 2021 04:10:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2AD7F68A8DF for ; Sat, 10 Jul 2021 04:10:16 +0300 (EEST) Received: by mail-ej1-f50.google.com with SMTP id gn32so19470874ejc.2 for ; Fri, 09 Jul 2021 18:10:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=prusa3d-cz.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=wxWgt3VRASiSNpgyZAXGdM8gh0DK+xl3awvArcuE9oU=; b=sb3pSREwuWVf9SVh7U24nOEcarrFs6x01zxsfOAxbCV3Hi7SkzoEv8A2n3v1BcGcH6 EvVaHziw1A2ZbQtY+laCwevFUWscpy3/lcrkvt6o2w3hTb75Yis9c3WFq9jCm1tt1acC 7axNRgwUafwWakiJ7oo1mEOXfO0bXsNjwqEWGgSbO6rvSy2ifDTDzvzlvVNr9R7H5HzC piLDhJ6RYuZvlor2Ppim+LPlKbMiG2tVI/hBJYZNt8PXLTP7ifiOlu6PGyK+N+BICyks nYKeKAjJ0esyItonobZKJVrYdOyZEwx7DgTQzSQrBb9bipx9OMdUWQCmemnXW8jt26KE 6gTQ== 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:mime-version :content-transfer-encoding; bh=wxWgt3VRASiSNpgyZAXGdM8gh0DK+xl3awvArcuE9oU=; b=SJCsBgBUSPY9cvJr13GNjaF48DBrQBr/gJJD8kA/hH5Pcm0LZelRFGoYCvtTFVnoPC d/vfQiSTXmwt0ZhbhHcAj5IdqexJPq+CuxHLJMrovZhuphlzPyNAfwORm28d35X5ORyl glQDzsHKIzNiW5hed6drbqNVGkMluEch6UNkLPEk7EHUrbZhSU1IggmZ8JitWc7Y1n/v rFrdr1lV0EYCLp/w2PSJBCFzJyAY1B4pC4+JXCZjpkKD0Y5yjvPM6vennPOia11HIbml jrg+DeKprhnylOKEsYOWwRgDNeMox0uODOW6fdQfUI+hNFBBw0+7LCmot3fO1+EnVFjg FbeQ== X-Gm-Message-State: AOAM533Df7QjwvpUYXqN1QKRXjmxbm6jpZzinrcP+bznUwqTYi1ET5Pf CmCVAIGoC8CTHCrzYiErcx6Jx3swOBOeSw== X-Received: by 2002:a17:906:4c89:: with SMTP id q9mr3969146eju.118.1625879415318; Fri, 09 Jul 2021 18:10:15 -0700 (PDT) Received: from zen.local (ip-89-103-215-157.net.upcbroadband.cz. [89.103.215.157]) by smtp.gmail.com with ESMTPSA id jx1sm2940840ejc.101.2021.07.09.18.10.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jul 2021 18:10:14 -0700 (PDT) From: Roman Beranek To: ffmpeg-devel@ffmpeg.org Date: Sat, 10 Jul 2021 03:10:06 +0200 Message-Id: <20210710011006.3383868-1-roman.beranek@prusa3d.cz> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] cafenc: fill in avg. packet size later if unknown 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9YRB4FRaZCEC Frame size of Opus stream was previously presumed here to be 960 samples (20ms), however sizes of 120, 240, 480, 1920, and 2880 are also allowed. It can also alter on a per-packet basis and even multiple frames may be present in a single packet according to the specification, for the sake of simplicity however, let us assume that this doesn't occur. Because the mFramesPerPacket field, representing the number of samples per packet in the ffmpeg terminilogy, is the key factor in calculating packet durations and all that follows from that (index, bitrate, ...), it is crucial to get right. Therefore, if the packet size is not available ahead of time (as it is in the case of Opus), calculate an average from the stream duration once we know how many packets there are and update the filed in the header. --- libavformat/cafenc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libavformat/cafenc.c b/libavformat/cafenc.c index 422beaf93d..816e978945 100644 --- a/libavformat/cafenc.c +++ b/libavformat/cafenc.c @@ -26,6 +26,8 @@ #include "libavutil/intfloat.h" #include "libavutil/dict.h" +#define FRAME_SIZE_OFFSET 40 + typedef struct { int64_t data; uint8_t *pkt_sizes; @@ -81,8 +83,6 @@ static uint32_t samples_per_packet(enum AVCodecID codec_id, int channels, int bl return 320; case AV_CODEC_ID_MP1: return 384; - case AV_CODEC_ID_OPUS: - return 960; case AV_CODEC_ID_MP2: case AV_CODEC_ID_MP3: return 1152; @@ -240,19 +240,26 @@ static int caf_write_trailer(AVFormatContext *s) { CAFContext *caf = s->priv_data; AVIOContext *pb = s->pb; - AVCodecParameters *par = s->streams[0]->codecpar; + AVStream *st = s->streams[0]; + AVCodecParameters *par = st->codecpar; if (pb->seekable & AVIO_SEEKABLE_NORMAL) { int64_t file_size = avio_tell(pb); avio_seek(pb, caf->data, SEEK_SET); avio_wb64(pb, file_size - caf->data - 8); - avio_seek(pb, file_size, SEEK_SET); if (!par->block_align) { + int packet_size = samples_per_packet(par->codec_id, par->channels, par->block_align); + if (!packet_size) { + packet_size = st->duration / (caf->packets - 1); + avio_seek(pb, FRAME_SIZE_OFFSET, SEEK_SET); + avio_wb32(pb, packet_size); + } + avio_seek(pb, file_size, SEEK_SET); ffio_wfourcc(pb, "pakt"); avio_wb64(pb, caf->size_entries_used + 24); avio_wb64(pb, caf->packets); ///< mNumberPackets - avio_wb64(pb, caf->packets * samples_per_packet(par->codec_id, par->channels, par->block_align)); ///< mNumberValidFrames + avio_wb64(pb, caf->packets * packet_size); ///< mNumberValidFrames avio_wb32(pb, 0); ///< mPrimingFrames avio_wb32(pb, 0); ///< mRemainderFrames avio_write(pb, caf->pkt_sizes, caf->size_entries_used);