From patchwork Thu Jul 27 17:34:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Trimble X-Patchwork-Id: 4471 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.76 with SMTP id 73csp2277223vsb; Thu, 27 Jul 2017 10:35:20 -0700 (PDT) X-Received: by 10.28.222.70 with SMTP id v67mr3632999wmg.152.1501176920227; Thu, 27 Jul 2017 10:35:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501176920; cv=none; d=google.com; s=arc-20160816; b=KgIW8JJJQb0W2S90iYs/cayLc5fVxtAOdY4VWglIaHJ1SI11eR+EjvcRGlonm81nA+ llVFIwnbE1DGobfsA3fO4ZyHjS0QK7FHcVEtP3l4mjoIWzCOoLU3MSTnlrItjVhiVRRk uSaOA1KODA2VveLogehdWlm+jqm/1C9yt/+VSNtRTAgDNYiTDe8SAXR3Rzg+i81TgEfp pVZ63eaQzUAl3TuAyoydB+zsWCojTFANnHFj38OZTXtZykA3CqXLqMkylp79N1dnKZCS rooEER1ybIV4mbSGI/4FLOJh63TcBWmRAzTT/XDDFVDK50b2HYzz7MMQsACsHhOHlzHi coSQ== 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:to:from:message-id:date:mime-version :dkim-signature:delivered-to:arc-authentication-results; bh=nfg3iQvWzNVzykvoOK3oY1LmgJrkGYy10fhn0I91Ucg=; b=arNf7SU2lvnrhPcODGX7RS2XK2XD8+BjJJ0xiVl3LKEyGPsP8+Pv759X23IIT3lVO0 uCMgS0w+6Ln3AOT2bhEVX5pRufVnKoZ5b9kAYHt/dE8tPUJsRN3MGKeJjo5qvHhJtoBU DCHQskXETbpSQVBw6E1ey0xV5fKjGuWHK8xSyqNIzIcnGnj/BEvxi6sU/pvf8Typ1m0K OvRlkmtYZ2EKT1UaP0BFytdcU1V87Q8XxSl9PPnZ17+DAaNNVjLN4x40gY7uQ835fDao jVIhDATgKWIBcwPI9PXzair9kLw5AuayjEzMoi9rmtXs6VVTgZFPGx2tZUWjhrbuE2na DfGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@google.com header.s=20161025 header.b=XlaQZJeT; 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 131si11447161wmo.123.2017.07.27.10.35.19; Thu, 27 Jul 2017 10:35:20 -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=@google.com header.s=20161025 header.b=XlaQZJeT; 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 247B768831C; Thu, 27 Jul 2017 20:35:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f202.google.com (mail-pf0-f202.google.com [209.85.192.202]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA9F96882C9 for ; Thu, 27 Jul 2017 20:35:08 +0300 (EEST) Received: by mail-pf0-f202.google.com with SMTP id k72so4791958pfj.8 for ; Thu, 27 Jul 2017 10:35:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:date:message-id:subject:from:to:cc; bh=bNJ8UtB/M20/hMPIKNdfUT2Q2fMXPwVaKOul4m42Sg4=; b=XlaQZJeTRNOc7Wmc6WLAkYZv5YHpqa4nD4YI+aSAg3BGGUw3HhYhOkcombVjRmibKr SK2+dmRPlG3pQex3lH7RvuT7FFjQqGvv3jWuXh78o2i297VMSwOymmgc7ch6jMgqRyse 14jAjCi2eEGMpKJh36gEqbKqu8nUXcZBhg/PrOpP8BspwdlcFfJ6qKCbmCw8c8I0C+Yz d0A5oxWGMVakC4MYYta9VWWeR8T4/OGEfcI0YQfwWYDw9tzWSpIUYWyus9NJVrC9ALkT pSZm4yuSaDH6TZWyL4xw6nOnqEO6QIA4ERgo3RueJQPPncpYr8b7+x00cCoFoSYZrNYX in2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc; bh=bNJ8UtB/M20/hMPIKNdfUT2Q2fMXPwVaKOul4m42Sg4=; b=ir5NqNAXjpkDTzwvP27y7WnVqqH9zVjMqtmjsa+s2IgKi0Nci/D37B46gEeE3OaG61 QjySG+qPeBSoW1rmfhCdG+M9LiScN4JXWwH3Pg/X66onVy1Kwu6egvdN8yLqGGsbED0L sLK0OsBKqDcwN8KNxy0A5SfddTvZvHr09cqk8Z6FUPJVA5iGoRRSyTunejFTf2urs3zQ EfiZalTQUs106q9nsXjK7vHa2AeccGddJc9lxs2qiVNDK5tCfv76odNmC1uRlTjJxf0Z TJ/SLNhawuGHcWgw0aFyVvjz62K8BmEA+9+SHoWAQAP/n9qz3vN1cIOuDm5gOYyWbPVm U2nQ== X-Gm-Message-State: AIVw113TMAVsffw9CBHGskuoj6UuTMPCP9twjcCP/M5AUZYGtk+5QK36 PDHX3QEpLrmKFyx6jyO5QORPr7QdRUURVCDo8Gew/LB+yUr7ZRQsfKBfSLn8J2WVyXmGXGg/Wt8 nBqBe6Oi+UzzZlut9P93zu1FADXqL5M9CZQAzcmH0GRq0YWi6KZ0BwelhWcA= MIME-Version: 1.0 X-Received: by 10.101.70.15 with SMTP id v15mr3838908pgq.19.1501176907937; Thu, 27 Jul 2017 10:35:07 -0700 (PDT) Date: Thu, 27 Jul 2017 10:34:32 -0700 Message-Id: <20170727173432.45471-1-modmaker@google.com> X-Mailer: git-send-email 2.14.0.rc0.400.g1c36432dff-goog From: Jacob Trimble To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH] libavformat/mov: Fix inserting frames before current_frame. 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: Jacob Trimble Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" When using streaming input, it may be possible to see frames that appear before the current_frame. When these frames are inserted into the index, the current_frame needs to be updated so it is still pointing at the same frame. Signed-off-by: Jacob Trimble --- libavformat/mov.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 63f84be782..d039f27063 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -4259,7 +4259,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) int64_t dts; int data_offset = 0; unsigned entries, first_sample_flags = frag->flags; - int flags, distance, i, err; + int flags, distance, i, err, old_nb_index_entries; for (i = 0; i < c->fc->nb_streams; i++) { if (c->fc->streams[i]->id == frag->track_id) { @@ -4352,13 +4352,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES)); if (keyframe) distance = 0; + old_nb_index_entries = st->nb_index_entries; err = av_add_index_entry(st, offset, dts, sample_size, distance, keyframe ? AVINDEX_KEYFRAME : 0); if (err < 0) { av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n"); + } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries && + st->nb_index_entries != old_nb_index_entries) { + // if we inserted a new item before the current sample, move the + // counter ahead so it is still pointing to the same sample. + sc->current_sample++; } - av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %u, offset %"PRIx64", dts %"PRId64", " - "size %u, distance %d, keyframe %d\n", st->index, sc->sample_count+i, + av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", " + "size %u, distance %d, keyframe %d\n", st->index, err, offset, dts, sample_size, distance, keyframe); distance++; dts += sample_duration;