From patchwork Thu Feb 3 04:07:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Anthony Lemieux X-Patchwork-Id: 34088 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp2133264iov; Wed, 2 Feb 2022 20:08:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJwwP4yxwuxwjttJ5/neeI9A36oclKDJRp1W6HhMUKK8D7VI2wWj04tHS557JFg+6U3e1iwB X-Received: by 2002:a17:907:1c92:: with SMTP id nb18mr27257775ejc.309.1643861294984; Wed, 02 Feb 2022 20:08:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643861294; cv=none; d=google.com; s=arc-20160816; b=c2Zeg9N7MrhdVhkIhcDuk34etGwL/6B/LNgOK6PMWU+GKmR/YoIdvgw4c/TzNCVk0O LxvIdG/s3H7Yb5erwwnjT1z8AV9rbpZkDYZfaeFAlIkxn8+W7UEWAe1pu52zPxBoNodn T1YqgdoB5nVIB+d5gN090fcE1FouyxPUH1CBBtuSx4RsKRNL94CriZJNnNcEEFQRGZp1 7Andft7R0qgWiS8imzynFQ1e5yZ/O6NWU1kuqLJp9NkGd5OkQj+tO2+L4IYdvTaHq0E0 4qcNtzRk+C4jM2tOOGazaH+7xKazND5W4u2853fQzt9mMNmYwS5IjunqXTcrRIqKnw/8 9NEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :delivered-to; bh=L/30UYK5QYPHwycTdb7UthJcUng1IU+gFTNdxzb4AZg=; b=d1kd87qKDaRQleChObyN873teImZlauOnb6YL6DY2xEH3SoCysfT+pHoJ6Nm994Ul8 wLP3kJu8txpdQbyuk3Uxm+9h422s3vkD8c0OsURKlGlBppmZ6TnT6QVH/taRQYFh2wnL b2V2KGy2VH3kiQelFd633yFbPWJehQuCnEMA2I4zje2wQhcnJHBIdR2K8amAbAOtGGby 0fQ+4Glj/9LWIE23yOVyqLX5qfzlT8tJ8H6FCs1kLaXk1t0kGsCb4vl9qTlWopllspbp IztZ6M4SMmn47e6ij5Xpa7HAld/KxFVKWAMtmGhaMYHqPlKhGnkoj0yBkt7ozGx/0o1b f9OQ== ARC-Authentication-Results: i=1; mx.google.com; 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 m3si7457174edq.548.2022.02.02.20.08.14; Wed, 02 Feb 2022 20:08:14 -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; 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 68AEF68AB96; Thu, 3 Feb 2022 06:08:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9022468AB96 for ; Thu, 3 Feb 2022 06:08:03 +0200 (EET) Received: by mail-pl1-f170.google.com with SMTP id k17so1153456plk.0 for ; Wed, 02 Feb 2022 20:08:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4qFv0nR0JHxaZsxcgoA98ClQ2aF77HI5wEMVVlzBiq0=; b=G2zcgdQpa+apaY6XKLwRdGuZ+l9x2yZkX8haeGoUiInTVwS8/kntgEdpDRwtETII5O xUpnaWpXneC5OfSqW8yeVL4CthZUlL3Q4UpCTv7vD5im0bTL/VvB3YuMQsKSZipnXmT6 AeyzuwHjjPamxCQpd46hGGsv6Fasx1T+feqfWSBHyg6aJ1PAtXAraPl2PNinsV/eis49 9GJQO+NgmaNkmVMl8bZIeglCFoPTxu//MkI7JmgPO3qE8ZQV5dERCuFOZYhfT7wf7ifl /huO/XvoG+vGruThUdenUujUVyc1PF04RuK10N+Ww6mcMXKPVwVeCp+rcjwRukFAZJDA AJlg== X-Gm-Message-State: AOAM5313+bu5QNtz/aOjJryHilX9r43LIDPtLsoReTA7K2+6wN2k0gGj aN9z1MCW2s/vvoSc3C5h07fX6mH7qZk= X-Received: by 2002:a17:903:11c3:: with SMTP id q3mr34004497plh.97.1643861281317; Wed, 02 Feb 2022 20:08:01 -0800 (PST) Received: from localhost (76-14-89-2.sf-cable.astound.net. [76.14.89.2]) by smtp.gmail.com with ESMTPSA id nu7sm8868129pjb.30.2022.02.02.20.07.59 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Feb 2022 20:08:00 -0800 (PST) Received: by localhost (sSMTP sendmail emulation); Wed, 02 Feb 2022 20:07:47 -0800 From: pal@sandflow.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Feb 2022 20:07:42 -0800 Message-Id: <20220203040745.10983-1-pal@sandflow.com> X-Mailer: git-send-email 2.35.0.windows.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 1/4] avformat/imf: open resources only when first needed 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: Pierre-Anthony Lemieux Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wN9Zp+IK6vz0 From: Pierre-Anthony Lemieux IMF CPLs can reference thousands of files, which can result in system limits for the number of open files to be exceeded. The following patch opens and closes files as needed. Addresses https://trac.ffmpeg.org/ticket/9623 --- libavformat/imfdec.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libavformat/imfdec.c b/libavformat/imfdec.c index d67c9b8898..e6a1020ecc 100644 --- a/libavformat/imfdec.c +++ b/libavformat/imfdec.c @@ -103,10 +103,11 @@ typedef struct IMFVirtualTrackPlaybackCtx { int32_t index; /**< Track index in playlist */ AVRational current_timestamp; /**< Current temporal position */ AVRational duration; /**< Overall duration */ - uint32_t resource_count; /**< Number of resources */ + uint32_t resource_count; /**< Number of resources (<= INT32_MAX) */ unsigned int resources_alloc_sz; /**< Size of the buffer holding the resource */ IMFVirtualTrackResourcePlaybackCtx *resources; /**< Buffer holding the resources */ - uint32_t current_resource_index; /**< Current resource */ + int32_t current_resource_index; /**< Index of the current resource in resources, + or < 0 if a current resource has yet to be selected */ int64_t last_pts; /**< Last timestamp */ } IMFVirtualTrackPlaybackCtx; @@ -435,7 +436,6 @@ static int open_track_file_resource(AVFormatContext *s, IMFContext *c = s->priv_data; IMFAssetLocator *asset_locator; void *tmp; - int ret; asset_locator = find_asset_map_locator(&c->asset_locator_map, track_file_resource->track_file_uuid); if (!asset_locator) { @@ -452,7 +452,7 @@ static int open_track_file_resource(AVFormatContext *s, UID_ARG(asset_locator->uuid), asset_locator->absolute_uri); - if (track->resource_count > UINT32_MAX - track_file_resource->base.repeat_count + if (track->resource_count > INT32_MAX - track_file_resource->base.repeat_count || (track->resource_count + track_file_resource->base.repeat_count) > INT_MAX / sizeof(IMFVirtualTrackResourcePlaybackCtx)) return AVERROR(ENOMEM); @@ -470,8 +470,6 @@ static int open_track_file_resource(AVFormatContext *s, vt_ctx.locator = asset_locator; vt_ctx.resource = track_file_resource; vt_ctx.ctx = NULL; - if ((ret = open_track_resource_context(s, &vt_ctx)) != 0) - return ret; track->resources[track->resource_count++] = vt_ctx; track->duration = av_add_q(track->duration, av_make_q((int)track_file_resource->base.duration @@ -501,6 +499,7 @@ static int open_virtual_track(AVFormatContext *s, if (!(track = av_mallocz(sizeof(IMFVirtualTrackPlaybackCtx)))) return AVERROR(ENOMEM); + track->current_resource_index = -1; track->index = track_index; track->duration = av_make_q(0, 1); @@ -551,6 +550,7 @@ static int set_context_streams_from_tracks(AVFormatContext *s) AVStream *first_resource_stream; /* Open the first resource of the track to get stream information */ + open_track_resource_context(s, &c->tracks[i]->resources[0]); first_resource_stream = c->tracks[i]->resources[0].ctx->streams[0]; av_log(s, AV_LOG_DEBUG, "Open the first resource of track %d\n", c->tracks[i]->index); @@ -741,7 +741,8 @@ static IMFVirtualTrackResourcePlaybackCtx *get_resource_context_for_timestamp(AV track->index); if (open_track_resource_context(s, &(track->resources[i])) != 0) return NULL; - avformat_close_input(&(track->resources[track->current_resource_index].ctx)); + if (track->current_resource_index > 0) + avformat_close_input(&track->resources[track->current_resource_index].ctx); track->current_resource_index = i; } From patchwork Thu Feb 3 04:07:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Anthony Lemieux X-Patchwork-Id: 34089 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp2133468iov; Wed, 2 Feb 2022 20:08:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJxPSqU4/vJFf3RvIZh+3qXmulN78q4CU5qZSZ+8x7ty6vEljOrdFpArp0TSutN5AwVr0hX3 X-Received: by 2002:a17:907:7251:: with SMTP id ds17mr28120702ejc.151.1643861325372; Wed, 02 Feb 2022 20:08:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643861325; cv=none; d=google.com; s=arc-20160816; b=Gr/Ttes9u6JJ6W/Xx2UhvxE5zq/Ut4jkVrx6mu1yV+xF4DmTh769PT9Nm7CgGLbftP pFz44ELae44x4S/4u7fmCRmz5rUJTAWhS1x/ayKlD+ozg5PFJClzcg3vxog/PQlEtvLV RML35MvAA//1lkh80boiZOp64mVfEydAyXqgvkzGzDwUmEn2TMkGydWKFYTdaXNHkH/D tFkgkzvMhYlsoIgo6Xdr3gcrnu00G4OUFLie47ZE06KkYTwBC8KClRi2NOC325jHojsB 6hM5/LH7KFNLU753fesxlKs/zytALghfMesvTsgZndD2fvctsL2YYH5TvYMZUxttSTrs dWwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=fuPjymneHfKVoXgBt4+QtlDKzLJWRsUSsYyeuIwE/tk=; b=cUhPSY5nath5+8tUmKXi+ho7x5vcgZk3pWXLxaJqhxeVBfwPY7kocgNZo060+NT9YN h58BSx76WGYfy6gjECS1gbEBisnGMh6omG6do5RkTBUzu+9mStiSZI8bRrCSUNWf4mrY fZD+eURcRRGKRpDTL5HS4feIj4aihoOo3XgoTfu4KxkeewpfLKbhntrrlhl2SSM15yP0 TNlt2x5+22LcmkZDA842jnEs9xeDbw/Kw4YAzMu5PPXYhTpR0Vz4Y1p1tr80/JqcUUZ3 IFaDjBlO3UqtCFOMwT+TamljyCf4c/r7diKCVApQbt576ra7DIDHqvsxE1r+L/GngDTk CkPw== ARC-Authentication-Results: i=1; mx.google.com; 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 p26si11559787ejn.336.2022.02.02.20.08.45; Wed, 02 Feb 2022 20:08:45 -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; 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 B16C668B1AA; Thu, 3 Feb 2022 06:08:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A05CF68AFEE for ; Thu, 3 Feb 2022 06:08:35 +0200 (EET) Received: by mail-pj1-f43.google.com with SMTP id d5so1262366pjk.5 for ; Wed, 02 Feb 2022 20:08:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=64XwETk71LJ6Y7sWuZnNEgO3/A6mTDbnorGFhpK7uA8=; b=4oDIzpnEChpvKkP9eWgio0MAc55Qkj+FWkGx1MEo/UH7jwvHYwlxbkbayYDTQRqiCB CvQ8ugtSz/COKjbdEKv2Gr4lWTRaElQIGQV514oAXFFvsRwDsPy0YRU1XfOgEYn1+NqR 548cMt7/SF6om1Zj5D2sgFS1+L99UK1A20vT/A7A4JBwhL3WXCukiI8JH5QPKmCEswJz Mi8eHafoquxV24NhnGwEMg0Xo7lqlssLuEtwwFOQo54w/svSnLA6Hay8lwBRn1pHOmab yh9a8BLWvhKYUbbGzLPzz041rNcI+GRJ6iVwX38p8tTaNPKlgKOhQnEvB43l26QW3K79 QC/Q== X-Gm-Message-State: AOAM531PkouvUmoz86EsPGH03XoxXNab99P9HVau6nPgQL3Cx1N7r2jw WukfNMBSPPx6C21mteq+05wEt5UCqQ0= X-Received: by 2002:a17:902:e806:: with SMTP id u6mr35215305plg.10.1643861313698; Wed, 02 Feb 2022 20:08:33 -0800 (PST) Received: from localhost (76-14-89-2.sf-cable.astound.net. [76.14.89.2]) by smtp.gmail.com with ESMTPSA id 16sm23951968pfl.99.2022.02.02.20.08.32 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Feb 2022 20:08:33 -0800 (PST) Received: by localhost (sSMTP sendmail emulation); Wed, 02 Feb 2022 20:08:20 -0800 From: pal@sandflow.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Feb 2022 20:07:43 -0800 Message-Id: <20220203040745.10983-2-pal@sandflow.com> X-Mailer: git-send-email 2.35.0.windows.1 In-Reply-To: <20220203040745.10983-1-pal@sandflow.com> References: <20220203040745.10983-1-pal@sandflow.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/4] avformat/imf: fix missing error reporting when opening resources 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: Pierre-Anthony Lemieux Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: gsC3Zhx5yMcK From: Pierre-Anthony Lemieux --- libavformat/imfdec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavformat/imfdec.c b/libavformat/imfdec.c index e6a1020ecc..658ddc40f2 100644 --- a/libavformat/imfdec.c +++ b/libavformat/imfdec.c @@ -550,7 +550,9 @@ static int set_context_streams_from_tracks(AVFormatContext *s) AVStream *first_resource_stream; /* Open the first resource of the track to get stream information */ - open_track_resource_context(s, &c->tracks[i]->resources[0]); + ret = open_track_resource_context(s, &c->tracks[i]->resources[0]); + if (ret) + return ret; first_resource_stream = c->tracks[i]->resources[0].ctx->streams[0]; av_log(s, AV_LOG_DEBUG, "Open the first resource of track %d\n", c->tracks[i]->index); From patchwork Thu Feb 3 04:07:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Anthony Lemieux X-Patchwork-Id: 34090 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp2133523iov; Wed, 2 Feb 2022 20:08:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJxMiL54svTCVffZmWArMIhmvx4Za4aSqWK4HTJHJQHnWzMrb5ZaMEwE7KMV6Rtwlmb2xkOE X-Received: by 2002:a17:906:6a0f:: with SMTP id qw15mr28438552ejc.66.1643861335158; Wed, 02 Feb 2022 20:08:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643861335; cv=none; d=google.com; s=arc-20160816; b=nuge9kmRNEOFg29ydrsEeENLpT4KaMzmLz+9KVt71YnW12tu3hRcMqhnds0ggDa8hn YImgW0iKSNWqBTdT9bid65jYdzgRl+KjeH7Bo/c1JdtIv4OeBHud7CiAoJ4RZZnCXexZ vlu38RABImuXGagGmd4ehXzeb8vJOOfQxL6KOGHX2n4Q1f6shCNi8Qy8S4DI3CB4VLE5 HosU9oQ1nP4xw+imbhHM0hzyizhbuoqSmmC+aHOD2k+s1WUVGBeOhSiE0XMLlABBiWdv hhk7/vQ+g618sRcUMYRtEiOiq3ffdyZVuCGBcozxOzc7i5oGrCzvHngY7kWMZCdtOr9o YWWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=uv7MBti9M4TI4SwzffiB08sbuxnmJdxv1JgecIeWKhI=; b=m9sqWCQZ2SGOef5sU7iY/vkuX4UsubfWQbZoP/wi36Q/RZPR/yQOLX7ZnYj0fA9ZNL x586QuB9Klz6No0t/c1YEyXt9/qbn0PsE++SecaPAdr+IF4voFk5dm/n04NEnMXEmFee pfk76YzL67ifZKCptyv63yiMfCs3oLbzqmxpSvJifA7WFHo8nL0GMHDTETXJGryVH6zI U2AAyuHYtx0AX30I5GYU8A94xb39Rk/hSfv1TzgFR2Fme6M9Fb6x+fjeZsI81B0fH9r5 8CHW9SrcENR498GJ2Lbs9fNWLyzWXekVGH/krwBRa8hKN3wAhigsRJFZcD/Z3c9Ouxh5 j7Tg== ARC-Authentication-Results: i=1; mx.google.com; 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 v4si11828457edc.588.2022.02.02.20.08.54; Wed, 02 Feb 2022 20:08:55 -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; 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 CEF4568B1BC; Thu, 3 Feb 2022 06:08:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B3DA168B1B3 for ; Thu, 3 Feb 2022 06:08:38 +0200 (EET) Received: by mail-pg1-f173.google.com with SMTP id v3so1261178pgc.1 for ; Wed, 02 Feb 2022 20:08:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C6gf5mFMg8UZjmIZ9NukcGuVNuG9+l/MSX3iL9uP4Qw=; b=VuhcLN8TGxF/Llh5HF7NNS7rL54otCeP3JQOwAyn8N2AE4U17LVGwsr2Y7XxLCDC/8 OD3K4hFZh0amWxe5qQgioNuZV97u/+7aJQ6gSZzP6FknlNzGdkCm41Ge0KNOamBRlK0W 02H3wIWeyG9iUJheukogNaxTHivmJoxz3nTr8xDseSvf0UVV2obuaXvFGRj3bNY/Hicm 626oIbtWQl57g2yYlOWmYxrbDQQrJ41vNjatisdWKUjY1rwWo0NX91gljYuU9iyollUu b16HIoFTXdnx60z4MOLP9aS1fmxtZTXY22SV0pvv2Wl2RFzRNRZB3TBpsxyGSkdAm+R5 izVA== X-Gm-Message-State: AOAM532wDf7Vp/GO5srf63D4mtP7nEK/SC/YCJKlNUZtCHluRorTFhzn 9dJfpyWtkjT2wwG/18rCcjCI3SV+zDA= X-Received: by 2002:a63:8649:: with SMTP id x70mr26578149pgd.564.1643861316152; Wed, 02 Feb 2022 20:08:36 -0800 (PST) Received: from localhost (76-14-89-2.sf-cable.astound.net. [76.14.89.2]) by smtp.gmail.com with ESMTPSA id mi18sm7821605pjb.35.2022.02.02.20.08.34 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Feb 2022 20:08:35 -0800 (PST) Received: by localhost (sSMTP sendmail emulation); Wed, 02 Feb 2022 20:08:22 -0800 From: pal@sandflow.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Feb 2022 20:07:44 -0800 Message-Id: <20220203040745.10983-3-pal@sandflow.com> X-Mailer: git-send-email 2.35.0.windows.1 In-Reply-To: <20220203040745.10983-1-pal@sandflow.com> References: <20220203040745.10983-1-pal@sandflow.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/4] avformat/imf: fix packet pts, dts and muxing 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: Pierre-Anthony Lemieux Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: INNP0YoCfnh3 From: Pierre-Anthony Lemieux The IMF demuxer does not set the DTS and PTS of packets accurately in all scenarios. Moreover, audio packets are not trimmed when they exceed the duration of the underlying resource. imf-cpl-with-repeat FATE ref file is regenerated. Addresses https://trac.ffmpeg.org/ticket/9611 --- libavformat/imfdec.c | 263 +++++++++++++++++++---------- tests/ref/fate/imf-cpl-with-repeat | 20 +-- 2 files changed, 181 insertions(+), 102 deletions(-) diff --git a/libavformat/imfdec.c b/libavformat/imfdec.c index 658ddc40f2..5be4411cb1 100644 --- a/libavformat/imfdec.c +++ b/libavformat/imfdec.c @@ -65,8 +65,10 @@ #include "avio_internal.h" #include "imf.h" #include "internal.h" +#include "libavcodec/packet.h" #include "libavutil/avstring.h" #include "libavutil/bprint.h" +#include "libavutil/intreadwrite.h" #include "libavutil/opt.h" #include "mxf.h" #include "url.h" @@ -97,6 +99,9 @@ typedef struct IMFVirtualTrackResourcePlaybackCtx { IMFAssetLocator *locator; FFIMFTrackFileResource *resource; AVFormatContext *ctx; + AVRational start_time; + AVRational end_time; + AVRational ts_offset; } IMFVirtualTrackResourcePlaybackCtx; typedef struct IMFVirtualTrackPlaybackCtx { @@ -108,7 +113,6 @@ typedef struct IMFVirtualTrackPlaybackCtx { IMFVirtualTrackResourcePlaybackCtx *resources; /**< Buffer holding the resources */ int32_t current_resource_index; /**< Index of the current resource in resources, or < 0 if a current resource has yet to be selected */ - int64_t last_pts; /**< Last timestamp */ } IMFVirtualTrackPlaybackCtx; typedef struct IMFContext { @@ -342,6 +346,7 @@ static int open_track_resource_context(AVFormatContext *s, int ret = 0; int64_t entry_point; AVDictionary *opts = NULL; + AVStream *st; if (track_resource->ctx) { av_log(s, @@ -383,23 +388,28 @@ static int open_track_resource_context(AVFormatContext *s, } av_dict_free(&opts); - /* Compare the source timebase to the resource edit rate, - * considering the first stream of the source file - */ - if (av_cmp_q(track_resource->ctx->streams[0]->time_base, - av_inv_q(track_resource->resource->base.edit_rate))) + /* make sure there is only one stream in the file */ + + if (track_resource->ctx->nb_streams != 1) { + ret = AVERROR_INVALIDDATA; + goto cleanup; + } + + st = track_resource->ctx->streams[0]; + + /* Warn if the resource time base does not match the file time base */ + if (av_cmp_q(st->time_base, av_inv_q(track_resource->resource->base.edit_rate))) av_log(s, AV_LOG_WARNING, - "Incoherent source stream timebase %d/%d regarding resource edit rate: %d/%d", - track_resource->ctx->streams[0]->time_base.num, - track_resource->ctx->streams[0]->time_base.den, + "Incoherent source stream timebase " AVRATIONAL_FORMAT + "regarding resource edit rate: " AVRATIONAL_FORMAT, + st->time_base.num, + st->time_base.den, track_resource->resource->base.edit_rate.den, track_resource->resource->base.edit_rate.num); - entry_point = (int64_t)track_resource->resource->base.entry_point - * track_resource->resource->base.edit_rate.den - * AV_TIME_BASE - / track_resource->resource->base.edit_rate.num; + entry_point = av_rescale_q(track_resource->resource->base.entry_point, st->time_base, + av_inv_q(track_resource->resource->base.edit_rate)); if (entry_point) { av_log(s, @@ -407,7 +417,7 @@ static int open_track_resource_context(AVFormatContext *s, "Seek at resource %s entry point: %" PRIu32 "\n", track_resource->locator->absolute_uri, track_resource->resource->base.entry_point); - ret = avformat_seek_file(track_resource->ctx, -1, entry_point, entry_point, entry_point, 0); + ret = avformat_seek_file(track_resource->ctx, 0, entry_point, entry_point, entry_point, 0); if (ret < 0) { av_log(s, AV_LOG_ERROR, @@ -470,11 +480,16 @@ static int open_track_file_resource(AVFormatContext *s, vt_ctx.locator = asset_locator; vt_ctx.resource = track_file_resource; vt_ctx.ctx = NULL; - track->resources[track->resource_count++] = vt_ctx; - track->duration = av_add_q(track->duration, + vt_ctx.start_time = track->duration; + vt_ctx.ts_offset = av_sub_q(vt_ctx.start_time, + av_div_q(av_make_q((int)track_file_resource->base.entry_point, 1), + track_file_resource->base.edit_rate)); + vt_ctx.end_time = av_add_q(track->duration, av_make_q((int)track_file_resource->base.duration * track_file_resource->base.edit_rate.den, track_file_resource->base.edit_rate.num)); + track->resources[track->resource_count++] = vt_ctx; + track->duration = vt_ctx.end_time; } return 0; @@ -701,11 +716,14 @@ static IMFVirtualTrackPlaybackCtx *get_next_track_with_minimum_timestamp(AVForma return track; } -static IMFVirtualTrackResourcePlaybackCtx *get_resource_context_for_timestamp(AVFormatContext *s, - IMFVirtualTrackPlaybackCtx *track) +static int get_resource_context_for_timestamp(AVFormatContext *s, IMFVirtualTrackPlaybackCtx *track, IMFVirtualTrackResourcePlaybackCtx **resource) { - AVRational edit_unit_duration = av_inv_q(track->resources[0].resource->base.edit_rate); - AVRational cumulated_duration = av_make_q(0, edit_unit_duration.den); + *resource = NULL; + + if (av_cmp_q(track->current_timestamp, track->duration) >= 0) { + av_log(s, AV_LOG_DEBUG, "Reached the end of the virtual track\n"); + return AVERROR_EOF; + } av_log(s, AV_LOG_DEBUG, @@ -714,119 +732,180 @@ static IMFVirtualTrackResourcePlaybackCtx *get_resource_context_for_timestamp(AV av_q2d(track->current_timestamp), av_q2d(track->duration)); for (uint32_t i = 0; i < track->resource_count; ++i) { - cumulated_duration = av_add_q(cumulated_duration, - av_make_q((int)track->resources[i].resource->base.duration - * edit_unit_duration.num, - edit_unit_duration.den)); - if (av_cmp_q(av_add_q(track->current_timestamp, edit_unit_duration), cumulated_duration) <= 0) { + if (av_cmp_q(track->resources[i].end_time, track->current_timestamp) > 0) { av_log(s, AV_LOG_DEBUG, - "Found resource %d in track %d to read for timestamp %lf " - "(on cumulated=%lf): entry=%" PRIu32 + "Found resource %d in track %d to read at timestamp %lf: " + "entry=%" PRIu32 ", duration=%" PRIu32 - ", editrate=" AVRATIONAL_FORMAT - " | edit_unit_duration=%lf\n", + ", editrate=" AVRATIONAL_FORMAT, i, track->index, av_q2d(track->current_timestamp), - av_q2d(cumulated_duration), track->resources[i].resource->base.entry_point, track->resources[i].resource->base.duration, - AVRATIONAL_ARG(track->resources[i].resource->base.edit_rate), - av_q2d(edit_unit_duration)); + AVRATIONAL_ARG(track->resources[i].resource->base.edit_rate)); if (track->current_resource_index != i) { + int ret; + av_log(s, AV_LOG_DEBUG, "Switch resource on track %d: re-open context\n", track->index); - if (open_track_resource_context(s, &(track->resources[i])) != 0) - return NULL; + + ret = open_track_resource_context(s, &(track->resources[i])); + if (ret != 0) + return ret; if (track->current_resource_index > 0) avformat_close_input(&track->resources[track->current_resource_index].ctx); track->current_resource_index = i; } - return &(track->resources[track->current_resource_index]); + *resource = &(track->resources[track->current_resource_index]); + return 0; } } - return NULL; + + av_log(s, AV_LOG_ERROR, "Could not find IMF track resource to read\n"); + return AVERROR_STREAM_NOT_FOUND; +} + +static int imf_time_to_ts(int64_t *ts, AVRational t, AVRational time_base) +{ + int dst_num; + int dst_den; + AVRational r; + + r = av_div_q(t, time_base); + + if ((av_reduce(&dst_num, &dst_den, r.num, r.den, INT64_MAX) != 1)) + return 1; + + if (dst_den != 1) + return 1; + + *ts = dst_num; + + return 0; } static int imf_read_packet(AVFormatContext *s, AVPacket *pkt) { - IMFContext *c = s->priv_data; - IMFVirtualTrackResourcePlaybackCtx *resource_to_read = NULL; - AVRational edit_unit_duration; + IMFVirtualTrackResourcePlaybackCtx *resource = NULL; int ret = 0; IMFVirtualTrackPlaybackCtx *track; - FFStream *track_stream; + int64_t delta_ts; + AVStream *st; + AVRational next_timestamp; track = get_next_track_with_minimum_timestamp(s); - if (av_cmp_q(track->current_timestamp, track->duration) == 0) - return AVERROR_EOF; + ret = get_resource_context_for_timestamp(s, track, &resource); + if (ret) + return ret; - resource_to_read = get_resource_context_for_timestamp(s, track); + ret = av_read_frame(resource->ctx, pkt); + if (ret) { + av_log(s, AV_LOG_ERROR, "Failed to read frame\n"); + return ret; + } - if (!resource_to_read) { - edit_unit_duration - = av_inv_q(track->resources[track->current_resource_index].resource->base.edit_rate); + av_log(s, AV_LOG_DEBUG, "Got packet: pts=%" PRId64 ", dts=%" PRId64 + ", duration=%" PRId64 ", stream_index=%d, pos=%" PRId64 + ", time_base=" AVRATIONAL_FORMAT "\n", pkt->pts, pkt->dts, pkt->duration, + pkt->stream_index, pkt->pos, pkt->time_base.num, pkt->time_base.den); - if (av_cmp_q(av_add_q(track->current_timestamp, edit_unit_duration), track->duration) > 0) - return AVERROR_EOF; + /* IMF resources contain only one stream */ - av_log(s, AV_LOG_ERROR, "Could not find IMF track resource to read\n"); - return AVERROR_STREAM_NOT_FOUND; + if (pkt->stream_index != 0) + return AVERROR_INVALIDDATA; + st = resource->ctx->streams[0]; + + pkt->stream_index = track->index; + + /* adjust the packet PTS and DTS based on the temporal position of the resource within the timeline */ + + ret = imf_time_to_ts(&delta_ts, resource->ts_offset, st->time_base); + + if (!ret) { + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts += delta_ts; + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += delta_ts; + } else { + av_log(s, AV_LOG_WARNING, "Incoherent time stamp " AVRATIONAL_FORMAT " for time base " AVRATIONAL_FORMAT, + resource->ts_offset.num, resource->ts_offset.den, pkt->time_base.num, + pkt->time_base.den); } - while (!ff_check_interrupt(c->interrupt_callback) && !ret) { - ret = av_read_frame(resource_to_read->ctx, pkt); - av_log(s, - AV_LOG_DEBUG, - "Got packet: pts=%" PRId64 - ", dts=%" PRId64 - ", duration=%" PRId64 - ", stream_index=%d, pos=%" PRId64 - "\n", - pkt->pts, - pkt->dts, - pkt->duration, - pkt->stream_index, - pkt->pos); - - track_stream = ffstream(s->streams[track->index]); - if (ret >= 0) { - /* Update packet info from track */ - if (pkt->dts < track_stream->cur_dts && track->last_pts > 0) - pkt->dts = track_stream->cur_dts; - - pkt->pts = track->last_pts; - pkt->dts = pkt->dts - - (int64_t)track->resources[track->current_resource_index].resource->base.entry_point; - pkt->stream_index = track->index; - - /* Update track cursors */ - track->current_timestamp - = av_add_q(track->current_timestamp, - av_make_q((int)pkt->duration - * resource_to_read->ctx->streams[0]->time_base.num, - resource_to_read->ctx->streams[0]->time_base.den)); - track->last_pts += pkt->duration; + /* advance the track timestamp by the packet duration */ - return 0; - } else if (ret != AVERROR_EOF) { - av_log(s, - AV_LOG_ERROR, - "Could not get packet from track %d: %s\n", - track->index, - av_err2str(ret)); - return ret; + next_timestamp = av_add_q(track->current_timestamp, + av_mul_q(av_make_q((int)pkt->duration, 1), st->time_base)); + + /* if necessary, clamp the next timestamp to the end of the current resource */ + + if (av_cmp_q(next_timestamp, resource->end_time) > 0) { + + int64_t new_pkt_dur; + + /* shrink the packet duration */ + + ret = imf_time_to_ts(&new_pkt_dur, + av_sub_q(resource->end_time, track->current_timestamp), + st->time_base); + + if (!ret) + pkt->duration = new_pkt_dur; + else + av_log(s, AV_LOG_WARNING, "Incoherent time base in packet duration calculation"); + + /* shrink the packet itself for audio essence */ + + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + + if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S24LE) { + /* AV_CODEC_ID_PCM_S24LE is the only PCM format supported in IMF */ + /* in this case, explicitly shrink the packet */ + + int bytes_per_sample = av_get_exact_bits_per_sample(st->codecpar->codec_id) >> 3; + int64_t nbsamples = av_rescale_q(pkt->duration, + st->time_base, + av_make_q(1, st->codecpar->sample_rate)); + av_shrink_packet(pkt, nbsamples * st->codecpar->channels * bytes_per_sample); + + } else { + /* in all other cases, use side data to skip samples */ + int64_t skip_samples; + + ret = imf_time_to_ts(&skip_samples, + av_sub_q(next_timestamp, resource->end_time), + av_make_q(1, st->codecpar->sample_rate)); + + if (ret || skip_samples < 0 || skip_samples > UINT32_MAX) { + av_log(s, AV_LOG_WARNING, "Cannot skip audio samples"); + } else { + uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10); + if (!side_data) + return AVERROR(ENOMEM); + + AV_WL32(side_data + 4, skip_samples); /* skip from end of this packet */ + side_data[6] = 1; /* reason for end is convergence */ + } + } + + next_timestamp = resource->end_time; + + } else { + av_log(s, AV_LOG_WARNING, "Non-audio packet duration reduced"); } } - return AVERROR_EOF; + track->current_timestamp = next_timestamp; + + return 0; } static int imf_close(AVFormatContext *s) diff --git a/tests/ref/fate/imf-cpl-with-repeat b/tests/ref/fate/imf-cpl-with-repeat index fe3106d5c6..e5b3992d04 100644 --- a/tests/ref/fate/imf-cpl-with-repeat +++ b/tests/ref/fate/imf-cpl-with-repeat @@ -34,13 +34,13 @@ 0, 28, 28, 1, 1964, 0x106d867a 0, 29, 29, 1, 1964, 0x106d867a 0, 30, 30, 1, 1964, 0x106d867a -0, 30, 31, 1, 2068, 0xd411c582 -0, 30, 32, 1, 2520, 0x7b539dfc -0, 30, 33, 1, 1846, 0x9d184658 -0, 30, 34, 1, 2475, 0x2967a123 -0, 30, 35, 1, 2540, 0xdc61ad87 -0, 30, 36, 1, 2214, 0xa7da105f -0, 30, 37, 1, 2486, 0xa68d89b4 -0, 30, 38, 1, 2615, 0xbc35d5ad -0, 30, 39, 1, 2150, 0x643aea98 -0, 30, 40, 1, 2628, 0x2880c4ad +0, 31, 31, 1, 2068, 0xd411c582 +0, 32, 32, 1, 2520, 0x7b539dfc +0, 33, 33, 1, 1846, 0x9d184658 +0, 34, 34, 1, 2475, 0x2967a123 +0, 35, 35, 1, 2540, 0xdc61ad87 +0, 36, 36, 1, 2214, 0xa7da105f +0, 37, 37, 1, 2486, 0xa68d89b4 +0, 38, 38, 1, 2615, 0xbc35d5ad +0, 39, 39, 1, 2150, 0x643aea98 +0, 40, 40, 1, 2628, 0x2880c4ad From patchwork Thu Feb 3 04:07:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Anthony Lemieux X-Patchwork-Id: 34091 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp2133602iov; Wed, 2 Feb 2022 20:09:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJwWDMfZ9+vT3vadDjeUnCATDouE4si3QdeY/fBGV+2kwMPOSQbKzqy0r0g3uMmCu2rZGXHo X-Received: by 2002:a17:907:6096:: with SMTP id ht22mr27069501ejc.611.1643861345260; Wed, 02 Feb 2022 20:09:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643861345; cv=none; d=google.com; s=arc-20160816; b=ZJsQKjcVPPPtK1rOcrvQ/pqEvSTeeSMjr33A+PsvlVjSXRgJ6f9SFuSGzViEgW7F8M 0qPvebwURQeZ9YYOBbcd6aB7ls17bS/T7v+OKGmIs+KE6Vo+Gp7uDeEbXM7laydMWahr 3ZlUKyHko7hJwjxkdu2owEA/262t/Bj0qvIKILu0tt9jh+TZDkJ6rAEJKErHWhYojrg0 /oqy/a82Zmak9bWr0QJHSlE2r6rtB19RcWz1KgZJ5Yyvub8t6efTsySb7gb1t84iyK7w 5tQJGaAwiqAmyfLZEH1ybFdF8AnPjZ6IOtGeM37FOw8Si3XD5T9p88+lJbtmXvrg6xRo tvuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=8vovRa4jVGwObmEbneYDxjoDUDS4dQWBpXQIsTC0MnA=; b=TW90DHqosy37fLfLn5BsiTZf+Py1U5dugoTdu06XusMvNrZ54S3mi5DbwLZhAz93JM Fgs+GpCAd4TQYitp8dzgJPQDQrZebVLUWkzwNhJJItxIOawsUubFR2C4bfwIpr3Boh6i 0B0jf+QlzXyuu7MhIgBUdsT4QjpZfRDdPDyeKhGjeN/qfEN9AMTh9Z+y+cKJrqb11AqK MIICv0rMy6Acm4IsGu/Fjtl72+tZrreV5wx5xFH76P5syLbEBaedNorLakSf89/Fcu7d ew33xogI31XhpdpzsozmDij6sc17NbtqPNMXIxACwLDe15y6nPJO/14s3bz5t09PLEvv iBUQ== ARC-Authentication-Results: i=1; mx.google.com; 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 v7si12150695ejv.190.2022.02.02.20.09.04; Wed, 02 Feb 2022 20:09:05 -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; 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 D99F968B1C5; Thu, 3 Feb 2022 06:08:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 95BE368B1B7 for ; Thu, 3 Feb 2022 06:08:40 +0200 (EET) Received: by mail-pj1-f48.google.com with SMTP id q63so1288092pja.1 for ; Wed, 02 Feb 2022 20:08:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Z2tWRCuRwFFjrnhDHQjJyUbrPHNKSW3xnAmcUmhvJBs=; b=GMT9o8CMfDb1Hqc1w+pMKCb7OGXpF4kNXsQD7Q4vp8T44RKBDK+TUIZ4RbneUOOyT+ 9d/CZ0mKuXe10ANm+YAL36k0uea79QZLoLEKyTNfv4q6PnWf1sZR2yq8HXr56u5EzcPE E41DzDsJt2Y9hcFZz/SuxjtSh1v8sUoqCBZBzq2e+TR2px4hfNABJHyE0SlpQMhtNu4s m/seKdNBFVzRz2Ugt0BgnhhuezDj3bk6qSaGLJc4aOC5F3TEGnSZecKAGWwkUm8DDDAj gNoRNgloib1F9zEbMVk5/gYF9iCdQEBxGpcgwOrxpyFWPWmPrzUqGJaX9LfaIOXOjNCx ufZg== X-Gm-Message-State: AOAM531sAwNfkTrSuC4MTDWJM9TzaO9nUtgCrJAA/v20xVhi8/OnU9A4 lYfq2ut8/zFhhQImVeWXOoFrC3/at3g= X-Received: by 2002:a17:90b:3a8b:: with SMTP id om11mr11673573pjb.163.1643861318619; Wed, 02 Feb 2022 20:08:38 -0800 (PST) Received: from localhost (76-14-89-2.sf-cable.astound.net. [76.14.89.2]) by smtp.gmail.com with ESMTPSA id s2sm35637765pgf.56.2022.02.02.20.08.36 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 02 Feb 2022 20:08:38 -0800 (PST) Received: by localhost (sSMTP sendmail emulation); Wed, 02 Feb 2022 20:08:24 -0800 From: pal@sandflow.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Feb 2022 20:07:45 -0800 Message-Id: <20220203040745.10983-4-pal@sandflow.com> X-Mailer: git-send-email 2.35.0.windows.1 In-Reply-To: <20220203040745.10983-1-pal@sandflow.com> References: <20220203040745.10983-1-pal@sandflow.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 4/4] avformat/imf: document IMFVirtualTrackResourcePlaybackCtx 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: Pierre-Anthony Lemieux Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cPKiHzrhdsdS From: Pierre-Anthony Lemieux --- libavformat/imfdec.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libavformat/imfdec.c b/libavformat/imfdec.c index 5be4411cb1..02e7bcc33f 100644 --- a/libavformat/imfdec.c +++ b/libavformat/imfdec.c @@ -96,12 +96,12 @@ typedef struct IMFAssetLocatorMap { } IMFAssetLocatorMap; typedef struct IMFVirtualTrackResourcePlaybackCtx { - IMFAssetLocator *locator; - FFIMFTrackFileResource *resource; - AVFormatContext *ctx; - AVRational start_time; - AVRational end_time; - AVRational ts_offset; + IMFAssetLocator *locator; /**< Location of the resource */ + FFIMFTrackFileResource *resource; /**< Underlying IMF CPL resource */ + AVFormatContext *ctx; /**< Context associated with the resource */ + AVRational start_time; /**< inclusive start time of the resource on the CPL timeline (s) */ + AVRational end_time; /**< exclusive end time of the resource on the CPL timeline (s) */ + AVRational ts_offset; /**< start_time minus the entry point into the resource (s) */ } IMFVirtualTrackResourcePlaybackCtx; typedef struct IMFVirtualTrackPlaybackCtx {