From patchwork Thu Jun 21 16:58:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Otto X-Patchwork-Id: 9466 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:115:0:0:0:0:0 with SMTP id c21-v6csp62779jad; Thu, 21 Jun 2018 09:58:38 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIZje4sxn4ncXZ6jaLhQZ+fkBJf5bB9eiK0r+U6C0fVsZdXA35E5VIsk6adnTtrJaz3Zd1q X-Received: by 2002:a1c:aac5:: with SMTP id t188-v6mr5568333wme.109.1529600318144; Thu, 21 Jun 2018 09:58:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529600318; cv=none; d=google.com; s=arc-20160816; b=LD6IrF3qj3s9ZSlSo38/1O1kWPDbnTm7iuFD9zmKpSmHiL8aMgnTh/z9J7bu5hB60l GlzxSD85F92PjZSQvuERRjS1PDuUXiMkvrvDin01gl8fswNho07i6w2vZB+ITwPqyI/U 7bX1/7+qQCZtJxH+fX9aaJhRF2A1fXRPqDozqR+sc78PzwxOMcf7GGw7sSbiUFrlcK2v TdgKLn9hsOjWcwYSbytAxN2rWD2IqTySGn6JShSx2yWGNFSBTzj+FANCtQ/a+hc2nHqD cCApfvUETEIscz2XeZv8f/XPoStgaoNUCCxROn0hVu51izo6mJiTTNmIBgpBMOQPCR9H Zhjw== 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: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:dkim-signature:delivered-to:arc-authentication-results; bh=1nDtI6Kd/rop3+XVi0nVX69LmxMUwFhwofXr1sc6eWI=; b=CC3KmZR6KcvMot3kZjqA72eJg9znu7rnv4CT4Sf+CYEiI8J3nchdfzWHzv0NmcJVHW kjbxQTCxeLivB48PgMxKqutDcXOavNe9ELCip331blFoLERb5M7TPipdYYFgE2OhO+w3 CRwKKKbPuSAPwlk7v94qlPCOM0P0Zi1wV9E5eEzmswZNMZDl+hS0yKm11OaWKYTWEXES A5HYtnS5dimPRmeDKa21Gbreh2cRtnsXfOdEI9S92fF0iLUjOS1TDeql5+lc7ayWGjRE B6TCHJET8bmKkhRbI11HfpPqHhRchYuVVMi9JnWyaKKcdjB+eubSje3Ksa76B7CxNPnY PRrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b=ib3Vx6Vj; 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=NONE dis=NONE) header.from=posteo.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z62-v6si5325450wrc.305.2018.06.21.09.58.36; Thu, 21 Jun 2018 09:58:38 -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=@posteo.de header.s=2017 header.b=ib3Vx6Vj; 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=NONE dis=NONE) header.from=posteo.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0C96D68A636; Thu, 21 Jun 2018 19:57:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6829768A567 for ; Thu, 21 Jun 2018 19:57:34 +0300 (EEST) Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 9F34120ECC for ; Thu, 21 Jun 2018 18:58:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1529600307; bh=DqGHiPyFjxDdPpis97CsqanyD6Fcz5g+hdVyuYt2fAA=; h=From:To:Subject:Date:From; b=ib3Vx6VjCsy+o75EtZWlKp9breTx8ChWCjD4tJGeVOJFCcHYPQZ4gjbRbdciM4Gy4 drUwysSkZ95ivwar+5ekQrVO7cbtZtPxqcVZCUgJMOdi0IVtLovk7DlnkuJrNpegMZ kl72XhcvZcEatSCibo+Guhwn3sonBJu4PSdaua7ZsrGCb8GJnzbvIvhoCGx0OMWu0i RwVNlvXJb0WqOb0LIjzo/nEUckfkEYFWT5siksdVLfUqCfGMhGhYiyyBxpA4jCr77t d33T+AFh5e5PTY4TvdSQSQ+wH9u+1D5cv5VQadJR6hDQUeM5oAtwX+bW2kfXAOC2CM zOTd8gSg1bJSg== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 41BSZW2f5bz10Wr for ; Thu, 21 Jun 2018 18:58:27 +0200 (CEST) From: Karsten Otto To: ffmpeg-devel@ffmpeg.org Date: Thu, 21 Jun 2018 18:58:26 +0200 Message-Id: <20180621165826.1714-4-ottoka@posteo.de> X-Mailer: git-send-email 2.14.3 (Apple Git-98) In-Reply-To: <20180621165826.1714-1-ottoka@posteo.de> References: <20180621165826.1714-1-ottoka@posteo.de> Subject: [FFmpeg-devel] [PATCH v3 3/3] aadec: fix seeking in mp3 content 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" MP3 frames may not be aligned to aa chunk boundaries. After seeking, scan for the next valid frame header. Then truncate the packet, and also adjust timestamp information accordingly. --- libavformat/aadec.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/libavformat/aadec.c b/libavformat/aadec.c index b009c9deca..3bb8cd0768 100644 --- a/libavformat/aadec.c +++ b/libavformat/aadec.c @@ -50,6 +50,7 @@ typedef struct AADemuxContext { int64_t current_chapter_size; int64_t content_start; int64_t content_end; + int did_seek; } AADemuxContext; static int get_second_size(char *codec_name) @@ -205,6 +206,7 @@ static int aa_read_header(AVFormatContext *s) } start = TOC[largest_idx].offset; avio_seek(pb, start, SEEK_SET); + c->did_seek = 0; // extract chapter positions. since all formats have constant bit rate, use it // as time base in bytes/s, for easy stream position <-> timestamp conversion @@ -242,7 +244,7 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) int trailing_bytes; int blocks; uint8_t buf[MAX_CODEC_SECOND_SIZE * 2]; - int written = 0; + int written = 0, offset = 0; int ret; AADemuxContext *c = s->priv_data; uint64_t pos = avio_tell(s->pb); @@ -295,10 +297,32 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) if (c->current_chapter_size <= 0) c->current_chapter_size = 0; - ret = av_new_packet(pkt, written); + // re-init timestamps after seeking + if (c->did_seek) { + c->did_seek = 0; + + if (s->streams[0]->codecpar->codec_id == AV_CODEC_ID_MP3) { + for (; offset < written - 2; ++offset) { + // find mp3 header: sync, v2, layer3, 32kbps, non-reserved sample rate + if ((buf[offset + 0] & 0xff) == 0xff && + (buf[offset + 1] & 0xfe) == 0xf2 && + (buf[offset + 2] & 0xf0) == 0x40 && + (buf[offset + 2] & 0x0c) != 0x0c) + break; + } + if (offset == written - 2) + offset = 0; // not found, e.g. chapter end chunk; just use as is + } + ff_update_cur_dts(s, s->streams[0], + (pos + offset - c->content_start - CHAPTER_HEADER_SIZE * (c->chapter_idx - 1)) + * TIMEPREC); + } + + // create packet + ret = av_new_packet(pkt, written - offset); if (ret < 0) return ret; - memcpy(pkt->data, buf, written); + memcpy(pkt->data, buf + offset, written - offset); pkt->pos = pos; return 0; @@ -343,8 +367,7 @@ static int aa_read_seek(AVFormatContext *s, c->current_codec_second_size = c->codec_second_size; c->current_chapter_size = chapter_size - chapter_pos; c->chapter_idx = 1 + chapter_idx; - - ff_update_cur_dts(s, s->streams[0], ch->start + chapter_pos * TIMEPREC); + c->did_seek = 1; return 1; }