From patchwork Wed Jul 11 21:53:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Otto X-Patchwork-Id: 9684 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp971440jad; Wed, 11 Jul 2018 14:54:55 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdgKi74rAxli7oysPZDgjsLY1wxq/rNTIwlCS/UdB+DkZw4UBJHgnVAnDMQACxvjgkCC11s X-Received: by 2002:adf:b968:: with SMTP id b37-v6mr208212wrg.117.1531346095000; Wed, 11 Jul 2018 14:54:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531346094; cv=none; d=google.com; s=arc-20160816; b=NpapLXxmd5Em1Ueu6ULk3hG+BkqIGSgI6BQKktKt895E03f0bsJIlHDC8uyKJMlAa2 zbIb2oErZ6bBT/OTGamT4odILXugmSNZ91hAL2xuSkQ6I7NXV3DoOyK9QxQicR3haQSx +m1GH3VoVfuxh38HVQRmPYK0duMtzIUO7nh/wRfgWK7PMGxzbt/QX4+l2u8b+i4MJgLk ZuuWA25NH3WdunFFxdqakZg9b3uJNhD+Qzv7OeksSHecd5DHH9loSPxjC8+HDABBfV8i esIg152EgwVR3W/VEuOiYG6gHUtD7JqpuxbT3XAip01Oq1hj9lNMeq+Qd9pKXI5TBcNi GxnQ== 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=hJztFCxn9wXAz6uXJd5uov3acGPbcdFEaz0WkPgWZXM=; b=u3v2i7xjO2OnGoCHLdhlES2v/bngyQ3AHS6xLdD/TInAaTorKPJQ5z9fXPUkVZkxIQ R+kfFShJD16XiXy1WEz0qrOa/2Yl1UVYmG1aH4N8DpeGDOHLWpp5F+Q0dyIhrbCGXX1z Eq0gR5Oq74ez9i9HBJIdRbQrqzZVEhzjNL61sNe5ii/RuBRrVrbiTgwjl+T7X3bhiQlR eibcr1LY0/5N4TRvwzsipMedoCNVQ902LIxiC7WsKfPpPx5NpG+rE7JMX4ZAK1mphAiG C9IkoCaH6u51SK2UN83FiE+Z/4amtWrWGoDvIEbglAFnc8zt6P9u7s8smdljmoF+3NvZ maqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b="a/fO6vG/"; 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 a12-v6si2140703wmi.189.2018.07.11.14.54.54; Wed, 11 Jul 2018 14:54:54 -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="a/fO6vG/"; 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 153C968A675; Thu, 12 Jul 2018 00:54:45 +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 8A95368A59F for ; Thu, 12 Jul 2018 00:54:38 +0300 (EEST) Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 0797620F0C for ; Wed, 11 Jul 2018 23:54:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1531346086; bh=j8bR4x46AemhkoW/1AqNDvGZJFikJrp100Pyt3kik8U=; h=From:To:Subject:Date:From; b=a/fO6vG/DZJEms1wIMZDuhvPO6a0YgPxLgc9mNdAONZFUm4V6oQLSBMC0B0z3zn2g a+hrmU8TcLMWH1a19TopL1IKqPQnbOQ5t+vYfGR40TMUCweZhgu7DO4XU1rSasbaQB bTKtpAN+KjcHoehLK6nBqHmvhUvyysMbzNwJXWfI3Qe7PrjsxoJ8T9eUWz4HHq7eA3 pwEUjYn0zuejzH+3zZO6UiE3MqOVZ8yfZok2cvWFGGD9x0GUjpmnf4rQopfQIST1FM knR9o2ZNnElY+PSjPXl6aeV9FDYoQ6/esrPzDAzn3SAbRTK2EhfhwIx8MIQWoOJLjC iSDot6aVD68fA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 41Qt9d4nMLz10cy for ; Wed, 11 Jul 2018 23:53:25 +0200 (CEST) From: Karsten Otto To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Jul 2018 23:53:25 +0200 Message-Id: <20180711215325.84466-1-ottoka@posteo.de> X-Mailer: git-send-email 2.14.3 (Apple Git-98) In-Reply-To: <67ED8A49-640D-45C1-B5ED-4759BDF4E1C0@posteo.de> References: <67ED8A49-640D-45C1-B5ED-4759BDF4E1C0@posteo.de> Subject: [FFmpeg-devel] [PATCH v5 3/3] aadec: improve 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. When seeking, calculate the expected frame offset in the target chunk. Adjust the timestamp and truncate the next packet accordingly. This solution works for the majority of tested audio material. For some rare encodings with mp3 padding or embedded id3 tags, it will mispredict the correct offset, and at worst skip an extra frame. --- libavformat/aadec.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libavformat/aadec.c b/libavformat/aadec.c index 17ad20686b..2d78def6e8 100644 --- a/libavformat/aadec.c +++ b/libavformat/aadec.c @@ -37,6 +37,7 @@ #define TEA_BLOCK_SIZE 8 #define CHAPTER_HEADER_SIZE 8 #define TIMEPREC 1000 +#define MP3_FRAME_SIZE 104 typedef struct AADemuxContext { AVClass *class; @@ -50,6 +51,7 @@ typedef struct AADemuxContext { int64_t current_chapter_size; int64_t content_start; int64_t content_end; + int seek_offset; } AADemuxContext; static int get_second_size(char *codec_name) @@ -228,6 +230,7 @@ static int aa_read_header(AVFormatContext *s) ff_update_cur_dts(s, st, 0); avio_seek(pb, start, SEEK_SET); c->current_chapter_size = 0; + c->seek_offset = 0; return 0; } @@ -266,6 +269,8 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) // is this the last block in this chapter? if (c->current_chapter_size / c->current_codec_second_size == 0) { c->current_codec_second_size = c->current_chapter_size % c->current_codec_second_size; + if (c->seek_offset > c->current_codec_second_size) + c->seek_offset = 0; } // decrypt c->current_codec_second_size bytes @@ -293,12 +298,13 @@ 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); + ret = av_new_packet(pkt, written - c->seek_offset); if (ret < 0) return ret; - memcpy(pkt->data, buf, written); + memcpy(pkt->data, buf + c->seek_offset, written - c->seek_offset); pkt->pos = pos; + c->seek_offset = 0; return 0; } @@ -342,7 +348,12 @@ static int aa_read_seek(AVFormatContext *s, 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); + // handle extra offset for unaligned frames + if (s->streams[0]->codecpar->codec_id == AV_CODEC_ID_MP3) { + c->seek_offset = (MP3_FRAME_SIZE - chapter_pos % MP3_FRAME_SIZE) % MP3_FRAME_SIZE; + } + + ff_update_cur_dts(s, s->streams[0], ch->start + (chapter_pos + c->seek_offset) * TIMEPREC); return 1; }