From patchwork Sun Jun 10 10:36:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 9348 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp2902698jad; Sun, 10 Jun 2018 03:37:41 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLBdda8Q9QkB1jtC150tFFETCSiyzWXMJrIv8plF6DwPn2LlSeRNjT76qUjql3gXNZYAh1e X-Received: by 2002:a1c:40d4:: with SMTP id n203-v6mr5411772wma.101.1528627061914; Sun, 10 Jun 2018 03:37:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528627061; cv=none; d=google.com; s=arc-20160816; b=v1EGEkJ0j8ZHR2CkiO5+sBLj1dOdviaBQ/WNiuOxIZrVT6+owSVYYr6loCMNmm8r4H Xyq2uhpGVPqrd19ohfVmdcquHBpmgkn7HQajp7rcN4odvGaNVFNKfQgfxiyqSLJqRTgq B3rAaBjzRTAvY2XlpjP1P1KvQVX6I3MVQiaimul2x7NFfLicGPR/EI2J0J2y1snL9Xgs 1AJZxaJAMMS896crN35bWcOS8flbuXSLNDD0MbFvBfcWKvp0IT39OMLgLzIN+TD/jWh+ tdWMPQwA30cZKxf4pHdmrLqXHIWeji7FEnKQDBCmNtXc67xQxk8LJb6jlD+j/h8+oLqD wrPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to:arc-authentication-results; bh=bvTIkO158en4p03GIBZIKFGwXX7+d6TQuuqZT3XJnas=; b=emIKJlrghuvdZOuO8jjLmMPl6iIx6+XMi3mbE4B6+zFpq3PFRF6c5JgZVfYF63L6Ke mcXo9edFUw95eg6AmTPBdUAcN75+39oAv0MaINXcR+DxNrl7zS8PY4fMLENg5NGIkXb+ iXnadhGV8YdSOOcQLMH1tn2Sebk1mlJmGwD2uoQlaNgGI/+Wo/ATkLxxoArFmyg4Chcl eq1tGMaku7iprO5LnU8P28YpDSrQm4REVRVg4PwAwXpIrHtJrntw+EVuLNFny/jipC0/ 0QfBIHy7UchNdqhQq6ZZ3Psgkyce5GRHNt6/EoCAGYtVRAGu3QV/vFjCHZX5+l2pHY4c kwsA== 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 s7-v6si14766853wra.251.2018.06.10.03.37.41; Sun, 10 Jun 2018 03:37:41 -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; 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 3864668ABD2; Sun, 10 Jun 2018 13:36:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EE8DF68A76B for ; Sun, 10 Jun 2018 13:36:15 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id ACB05E102D; Sun, 10 Jun 2018 12:37:04 +0200 (CEST) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id FgUvbcNoIa4t; Sun, 10 Jun 2018 12:37:03 +0200 (CEST) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 151F1E0E49; Sun, 10 Jun 2018 12:37:03 +0200 (CEST) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Sun, 10 Jun 2018 12:36:43 +0200 Message-Id: <20180610103650.10155-5-cus@passwd.hu> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20180610103650.10155-1-cus@passwd.hu> References: <20180610103650.10155-1-cus@passwd.hu> Subject: [FFmpeg-devel] [PATCH 05/12] avformat/mxfdec: make edit_units_per_packet a track property 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 Cc: Marton Balint MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Marton Balint --- libavformat/mxfdec.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 67b0028e88..be6884edbe 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -173,6 +173,7 @@ typedef struct { int index_sid; int body_sid; MXFWrappingScheme wrapping; + int edit_units_per_packet; /* how many edit units to read at a time (PCM, ClipWrapped) */ } MXFTrack; typedef struct MXFDescriptor { @@ -286,7 +287,6 @@ typedef struct MXFContext { int64_t current_edit_unit; int nb_index_tables; MXFIndexTable *index_tables; - int edit_units_per_packet; ///< how many edit units to read at a time (PCM, OPAtom) } MXFContext; /* NOTE: klv_offset is not set (-1) for local keys */ @@ -2874,36 +2874,46 @@ static AVStream* mxf_get_opatom_stream(MXFContext *mxf) return NULL; } +static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid) +{ + int i; + for (i = 0; i < mxf->nb_index_tables; i++) + if (mxf->index_tables[i].index_sid == index_sid) + return &mxf->index_tables[i]; + return NULL; +} + /** * Deal with the case where for some audio atoms EditUnitByteCount is * very small (2, 4..). In those cases we should read more than one * sample per call to mxf_read_packet(). */ -static void mxf_handle_small_eubc(AVFormatContext *s) +static void mxf_compute_edit_units_per_packet(MXFContext *mxf, AVStream *st) { - MXFContext *mxf = s->priv_data; - MXFTrack *track; + MXFTrack *track = st->priv_data; + MXFIndexTable *t; - /* assuming non-OPAtom == frame wrapped - * no sane writer would wrap 2 byte PCM packets with 20 byte headers.. */ - AVStream *st = mxf_get_opatom_stream(mxf); - if (!st) + if (!track) return; + track->edit_units_per_packet = 1; + if (track->wrapping != ClipWrapped) + return; + + t = mxf_find_index_table(mxf, track->index_sid); /* expect PCM with exactly one index table segment and a small (< 32) EUBC */ if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || !is_pcm(st->codecpar->codec_id) || - mxf->nb_index_tables != 1 || - mxf->index_tables[0].nb_segments != 1 || - mxf->index_tables[0].segments[0]->edit_unit_byte_count >= 32) + !t || + t->nb_segments != 1 || + t->segments[0]->edit_unit_byte_count >= 32) return; /* arbitrarily default to 48 kHz PAL audio frame size */ /* TODO: We could compute this from the ratio between the audio * and video edit rates for 48 kHz NTSC we could use the * 1802-1802-1802-1802-1801 pattern. */ - track = st->priv_data; - mxf->edit_units_per_packet = FFMAX(1, track->edit_rate.num / track->edit_rate.den / 25); + track->edit_units_per_packet = FFMAX(1, track->edit_rate.num / track->edit_rate.den / 25); } /** @@ -3028,7 +3038,6 @@ static int mxf_read_header(AVFormatContext *s) int ret; mxf->last_forward_tell = INT64_MAX; - mxf->edit_units_per_packet = 1; if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) { av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); @@ -3127,7 +3136,8 @@ static int mxf_read_header(AVFormatContext *s) mxf_compute_essence_containers(s); - mxf_handle_small_eubc(s); + for (int i = 0; i < s->nb_streams; i++) + mxf_compute_edit_units_per_packet(mxf, s->streams[i]); return 0; fail: @@ -3136,15 +3146,6 @@ fail: return ret; } -static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid) -{ - int i; - for (i = 0; i < mxf->nb_index_tables; i++) - if (mxf->index_tables[i].index_sid == index_sid) - return &mxf->index_tables[i]; - return NULL; -} - /* Get the edit unit of the next packet from current_offset in a track. The returned edit unit can be original_duration as well! */ static int mxf_get_next_track_edit_unit(MXFContext *mxf, MXFTrack *track, int64_t current_offset, int64_t *edit_unit_out) { @@ -3406,7 +3407,7 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) if (mxf->current_edit_unit >= track->original_duration) return AVERROR_EOF; - edit_units = FFMIN(mxf->edit_units_per_packet, track->original_duration - mxf->current_edit_unit); + edit_units = FFMIN(track->edit_units_per_packet, track->original_duration - mxf->current_edit_unit); if ((ret = mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit, NULL, &pos, 1)) < 0) return ret;