From patchwork Fri Oct 5 13:08:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Seokjin Hong X-Patchwork-Id: 10604 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp389958uaq; Fri, 5 Oct 2018 06:08:47 -0700 (PDT) X-Google-Smtp-Source: ACcGV63T788rFdCGKnnI5TbefQUx4ZgkEZQgaNWEKVpfatPIjZakMmTujAI7FAvIQmxIOjzp+zjX X-Received: by 2002:adf:bf11:: with SMTP id p17-v6mr8002141wrh.235.1538744927126; Fri, 05 Oct 2018 06:08:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538744927; cv=none; d=google.com; s=arc-20160816; b=phYdR5MfpssmxSI3epQKCLamh1r5N9L3a2cjfQTQ1/1flB3mYBKdGy3ZD2bcURauwI S2x5okd7D72Q7pw/bwjJ/90M7yfk7fRnzKgOiqDH9bQR9+u3GqcHBS0c3sFOhq71CVv6 EfPmpCZGGKmQG4rSNcwo41vsRDdlQYC1BvCk4FCAfpUHi/x5gvPiBrUH4vmVSyxTVXVv P3o3qdVyoXH9QDAiIOCj49rwRGP6e3yIwaQ16KL6CuXtsH3+jW+75N+5PQZ2ZiRucW53 VWQYU1TlahfTXM4QInxMytTcgpUfY7LDcpKRs9BTG1KQI9GgxWkAoJQjjSn5YrnmTWIY BAkg== 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:to:message-id:date:from:mime-version :dkim-signature:delivered-to; bh=W4NK5REy3OQlpWJszTr4D+zp3OVJdEmMwUVrUpcGGew=; b=NtvCKL/yy1KfHvLx9uPEdZgXtG4/PA4IOPzJS0HZX+J/+u9rJ36K8kqo9yG+dH+6m7 C+wbf1ZUGdZjhctHwoW/YK1koFZy+zxGPg9Hg+FwBAinWKTOHTPnGbnG/UlCzvCZC1EJ oIxlK4m/T483IorDE8354BmdPGplEmV3e+mWhRYx/wDeXVrjKbJcXpj4eR+ZUPxhAquk RHquP7AdVISRq+cZPm3rgRJxg9HJDqiBHDUh3uPlgHbsQp5s5T9x+k5uOkMFp1kLdvcv ThmWAxfBVM6R4un1kr5oPKnXR1l/fwVKpMaEZjdTCRBpMYOXKB+qqchwAgOg3zpzO14R bjJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=aI9EOLYz; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n66-v6si1571207wmf.82.2018.10.05.06.08.45; Fri, 05 Oct 2018 06:08:47 -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=@gmail.com header.s=20161025 header.b=aI9EOLYz; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2E46468A4C7; Fri, 5 Oct 2018 16:08:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f43.google.com (mail-io1-f43.google.com [209.85.166.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 44E1268A46C for ; Fri, 5 Oct 2018 16:08:16 +0300 (EEST) Received: by mail-io1-f43.google.com with SMTP id n18-v6so10594822ioa.9 for ; Fri, 05 Oct 2018 06:08:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=ubg2GUJp4jOLLeICjmfmnQo0HNiSR5O1JmV2cJphRAQ=; b=aI9EOLYzAOABt1yQPPe/ASKLwC5XuZSDMGZlkczMongPWTemJVyGKv3Lq0pAz6OGEa tw+DTSse2VjzSCYBGLKpokWL5yhWr0meaXD0F21SzO+S2q78wpsSdULGKrignJ8Of5bn DRxBA2OSx7nYwSBsrsgSx7cK8GGxnoFh1k8BWEC8X6vzqGxZPvCSvcDCt9DoD7CnBm/M 9yoMjOP3PIPDIGKqmBPl8gkZLgoCmQGEKCtruHtC3/U/5y1iQNJ3KNL7U3nsmCcNnigd ebdYJsQfCE0GS5TrnZ6k+1TLFemlSxbaNmwLc4rNZu8R3GqOs+QidIaAV+DU8OKKYYyu rE9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=ubg2GUJp4jOLLeICjmfmnQo0HNiSR5O1JmV2cJphRAQ=; b=bT6mSmtb5vC5X4R0V53z99N8TTAcHoNoQkIcB9OZFIajHDLmetByiivCghIhBnGTy4 bHlSWEDyqBCTJ8/qnTQHUO/7Hmxo1UkayMeWj3UF0jQu2u+kIUUYnfC3yvEWO8d8jopR S58ZcHx6UZaM+iFNEiU2vPDTYm6/pbIvxQqXxaXcUVrGNWZ8uC2fYXn2+yH4O4pke6zG exOm/gX9uAg2kZjk82qO+6ZItNkgF6HpXs31AjWqPOu7x0vfSp6ZiHd0CqCh0t8UfvDT xDk8+0JNztT2eIAYPj/K/kA3xIrv+A60H/zssGeWrzUmkfKpprEXtP0O5tWvt0NOCbvB Ruiw== X-Gm-Message-State: ABuFfoj5F8IIxS3w5wGQTao4wMG34LYDrVSXMzrRsEqWoVKvqloA0Vbz dLmdfhZ/1qYY9LBj2Ctxj6mJC6uN+7KcySzaWvXKjtSpsFk= X-Received: by 2002:a6b:9d0b:: with SMTP id g11-v6mr8173629ioe.85.1538744914818; Fri, 05 Oct 2018 06:08:34 -0700 (PDT) MIME-Version: 1.0 From: Seokjin Hong Date: Fri, 5 Oct 2018 22:08:23 +0900 Message-ID: To: ffmpeg-devel@ffmpeg.org X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] avformat/matroskadec.c: Fix support seek to non keyframes 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hi. I finally figured out the reason why all videos on matroska format can't get last packet. When I tried to get last video stream packet by seeking, I can't get any packet. Please check my example code as below: // timestamp is bigger than last key_frame timestamp // for example, if nb_index_entries is equal to 100 // and index_entries[nb_index_entries - 1].timestamp is equal to 1000 // and timestamp is equal to 1010. (please assume that last packet (non-keyframe) pts is 1040) av_seek_frame(fmt_ctx, stream_idx, timestamp, AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWORD); while(av_read_frame(fmt_ctx, &packet) >=0) { ... } av_seek_frame works fine, but matroska_read_seek function always sets 'matroska->skip_to_keyframe = 1' without considering 'flags & AVSEEK_FLAG_ANY'. After call av_seek_frame(..., AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWORD) and call av_read_frame, matroska_parse_block function always ends line 3364 (see below) if (matroska->skip_to_keyframe && track->type != MATROSKA_TRACK_TYPE_SUBTITLE) { if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode) return res; // line 3364 ... } It means that matroska_parse_block can't call matroska_parse_frame. matroska_parse_frame is important because it manufactures packet and puts packet in packet list by calling ff_packet_list_put function. So that, I attached patch to fix this bug. Please check it. Regards. ------------------------------------------------------------------------------------------ From 0b35c837ce61d87a4e74865c0d968b258a7c76c3 Mon Sep 17 00:00:00 2001 From: Seokjin Hong Date: Sun, 2 Sep 2018 21:37:06 +0900 Subject: [PATCH] avformat/matroskadec.c: Fix support seek to non keyframes --- libavformat/matroskadec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ff_update_cur_dts(s, st, st->index_entries[index].timestamp); -- 2.17.1 diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index e6793988e1..b66fcec4a5 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3590,12 +3590,13 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, matroska->current_id = 0; if (flags & AVSEEK_FLAG_ANY) { st->skip_to_keyframe = 0; + matroska->skip_to_keyframe = 0; matroska->skip_to_timecode = timestamp; } else { st->skip_to_keyframe = 1; + matroska->skip_to_keyframe = 1; matroska->skip_to_timecode = st->index_entries[index].timestamp; } - matroska->skip_to_keyframe = 1; matroska->done = 0; matroska->num_levels = 0;