From patchwork Sun Dec 24 04:48:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: misty@brew.sh X-Patchwork-Id: 6946 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp4318512jad; Sat, 23 Dec 2017 20:49:51 -0800 (PST) X-Google-Smtp-Source: ACJfBot2OqJUIV43baHF0jELutYjz4oPUU1VmvzgMwuhv6CjbhzuiZHau7jErGZYEnxGsVZWzHpI X-Received: by 10.223.169.67 with SMTP id u61mr20626188wrc.30.1514090991840; Sat, 23 Dec 2017 20:49:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514090991; cv=none; d=google.com; s=arc-20160816; b=r1lTECyHoiiRYddoPL46+w1NrABB64e1FyQNik8ASUb2zVpbrfe+dfpcIA67PSQoiG m5aFn8Dm1LAL2/j9qaPKX5HHf6CY10kR3XZkSn6S4afof5YOQzi/CpITPpKatQ8b4+o9 +7e4Fkf/rB92H7Q5GULySfZ0QMWeI3bojmM3tPhrtfPA09qtoW1rYt94ibUkfQ1rp6gh 2IBXHiGbj+8ZMWFOdfD4wgk/P1IItnNdWvTG3MGPS8FJBZCCyVQG30yvdPHbBPysG6cD 16s0oDpG9Xrgtpdt818nsHYmnl/SzKZe8JfPqbdTPs14A7UYBkZtWJzRkjEN8e5ucCJD 6xXA== 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:dkim-signature:delivered-to:arc-authentication-results; bh=49gbZHDppxG5T8VZ/PQrfKUqLcut321VohvcGeUnuD8=; b=OseKBi6ER7ba0KM/kq3JX8dDS+HgR16+6YYRi+1UtLnT2T7BUjLoO8hejwSqASkJat zYj7elu6cJqjYsqZEItUiCKGpzxDkLpZrgjExusfcnxeQ67XbkMtWAQscToKqY/QEF4F sBP+Z440Gnsxustks7Cb8NsbyBXCuzWlmUScRObon/v7rXAohCe2J501zTYIv1xbC67n ahikVOpYwULhGijLV/G0rlNBiunhgUgSjwvPcyQvoKE/0WLt0BQKjhWvu5XiRpuUN+Dx I8UqQ8SPg+n6esgiR+syeqEcIRMnlVgVujKb9jjdHC9KNSJF2rKAb6DYu1+O4vKaZiAN ia5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=a2a8Lwvo; 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 t9si20657498wra.449.2017.12.23.20.49.51; Sat, 23 Dec 2017 20:49:51 -0800 (PST) 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=a2a8Lwvo; 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 5E97F687EB1; Sun, 24 Dec 2017 06:49:21 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f53.google.com (mail-pg0-f53.google.com [74.125.83.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 41C7D680A07 for ; Sun, 24 Dec 2017 06:49:15 +0200 (EET) Received: by mail-pg0-f53.google.com with SMTP id f12so15974367pgo.5 for ; Sat, 23 Dec 2017 20:49:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=hBai0oawJrZTeBQPfPHqKlUJ9dnG7rYwm4gPimmUGKg=; b=a2a8LwvoQpj/Z7rkrgATZfzZNb6mLYPv+PyRDlIKC15XTCsvAz1K6HBJcoFNsaPaO+ /rlNYOepsZGPsolr0k/tcg8kWRntLXuYjcJwy1/CwY240oZuKU8pyXcOIZeaVuTkWNAX iNtxKE0SIgaQ3vJx2gKXZ8E9p6H3vbAoiYKiMEnqNfO9p6LWKT31HL4QG8BEZGJNlqT6 68eeNXRMjqG5xsxVUeJNzZeMX9owv8jaKsF11iy9uiZFGU8m3igh3PIk3cqfdp49QE9f CmE2ByZTCy4pN8D0nq72efVQ9ZaHxMwz1BhTZHuEt1XEg5+s5Kz1L0+BnNaaCZiDMcp3 zcOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=hBai0oawJrZTeBQPfPHqKlUJ9dnG7rYwm4gPimmUGKg=; b=m7WcsYyu7uOOPKr8DwWEmvw7Rgn3dwU303BS/9W5pMoR/iYhmDF9xIqiEQO+yECaF/ FcDV/nmhTE1CO9Qy5/NAXFUwDINetmeX+i78Ghm1tG3Yso3IILFWsCTQZTlRAAWyWN0v AswkWin/uhk1Bvmg4ICbAw9E4WOzUySvHBknLQJ0AsJebrxgcXWpqQ6RSyQwMRhaXeUH m6+3PeTUM46TE3WL3ZLQCALdaQ0i6VFK/6BAGYSgwOULcSUOQsq0yQMYaCESB38TqgDN Lr/Yc8NtS8z33Pmh+usRfryyItwo37WjDlAzd9VCVst94f7EdqErR03zw0sN13cDMvRI EzgA== X-Gm-Message-State: AKGB3mLh5ciiBRLkwdEFUPYE6578Q9wDQhymihBcqqOOmV6c9FqkyVrC Z3pk2IW7WbAYJvYfNtffTP4wejxU X-Received: by 10.98.193.1 with SMTP id i1mr19279687pfg.29.1514090966199; Sat, 23 Dec 2017 20:49:26 -0800 (PST) Received: from localhost.localdomain (124-148-94-180.dyn.iinet.net.au. [124.148.94.180]) by smtp.gmail.com with ESMTPSA id q74sm49532038pfd.134.2017.12.23.20.49.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 23 Dec 2017 20:49:25 -0800 (PST) From: misty@brew.sh To: ffmpeg-devel@ffmpeg.org Date: Sun, 24 Dec 2017 12:48:51 +0800 Message-Id: <20171224044852.88559-5-misty@brew.sh> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20171224044852.88559-4-misty@brew.sh> References: <20171223130859.GB2080@sunshine.barsnick.net> <20171224044852.88559-1-misty@brew.sh> <20171224044852.88559-2-misty@brew.sh> <20171224044852.88559-3-misty@brew.sh> <20171224044852.88559-4-misty@brew.sh> Subject: [FFmpeg-devel] [PATCH 4/5] Fix detecting ATRAC3 audio from MPS files 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: Misty De Meo MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Misty De Meo MPS files are MPEG files used on PSP Video discs. They lack the PSMF header used by .pms files, and so the special casing in the original patch fails to support their audio. This patch fixes this by unconditionally reading a new byte for the startcode for PRIVATE_STREAM_1 sections, and doing the comparison on that to find ATRAC-3 streams. In my testing, it works fine for both MPS and PSMF files. --- Changelog | 1 + libavformat/mpeg.c | 38 ++++++++++++++------------------------ libavformat/mpeg.h | 1 + 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/Changelog b/Changelog index ee48876128..67f28ea839 100644 --- a/Changelog +++ b/Changelog @@ -27,6 +27,7 @@ version : - video setrange filter - nsp demuxer - support LibreSSL (via libtls) +- ATRAC-3 support for Sony PSP MPEG files version 3.4: diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 895c6fb231..a366ece0ed 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -128,7 +128,6 @@ typedef struct MpegDemuxContext { int sofdec; int dvd; int imkh_cctv; - int sony_psmf; // true if Play Station Movie file signature is present #if CONFIG_VOBSUB_DEMUXER AVFormatContext *sub_ctx; FFDemuxSubtitlesQueue q[32]; @@ -148,8 +147,6 @@ static int mpegps_read_header(AVFormatContext *s) avio_get_str(s->pb, 6, buffer, sizeof(buffer)); if (!memcmp("IMKH", buffer, 4)) { m->imkh_cctv = 1; - } else if (!memcmp("PSMF00", buffer, 6)) { - m->sony_psmf = 1; } else if (!memcmp("Sofdec", buffer, 6)) { m->sofdec = 1; } else @@ -444,7 +441,7 @@ redo: goto redo; } - if (startcode == PRIVATE_STREAM_1 && !m->sony_psmf) { + if (startcode == PRIVATE_STREAM_1) { startcode = avio_r8(s->pb); len--; } @@ -544,28 +541,21 @@ redo: else request_probe= 1; type = AVMEDIA_TYPE_VIDEO; - } else if (startcode == PRIVATE_STREAM_1 && m->sony_psmf) { - uint8_t stream_id; - - if (len < 2) - goto skip; - stream_id = avio_r8(s->pb); + // Sony PSP video with ATRAC-3 audio + } else if (!(startcode & STREAM_TYPE_AUDIO_ATRAC3)) { avio_r8(s->pb); // skip padding - len -= 2; - if (!(stream_id & 0xF0)) { // seems like we got an ATRAC stream - /* check if an appropriate stream already exists */ - for (i = 0; i < s->nb_streams; i++) { - st = s->streams[i]; - if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && - st->codec->codec_id == AV_CODEC_ID_ATRAC3P && - st->id - 0x1BD0 == (stream_id & 0xF)) - goto found; - } - - startcode = 0x1BD0 + (stream_id & 0xF); - type = AVMEDIA_TYPE_AUDIO; - codec_id = AV_CODEC_ID_ATRAC3P; + len--; + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && + st->codec->codec_id == AV_CODEC_ID_ATRAC3P && + st->id - 0x1BD0 == (startcode & 0xF)) + goto found; } + + startcode = 0x1BD0 + (startcode & 0xF); + type = AVMEDIA_TYPE_AUDIO; + codec_id = AV_CODEC_ID_ATRAC3P; } else if (startcode == PRIVATE_STREAM_2) { type = AVMEDIA_TYPE_DATA; codec_id = AV_CODEC_ID_DVD_NAV; diff --git a/libavformat/mpeg.h b/libavformat/mpeg.h index 617e36cba8..efbadec8ba 100644 --- a/libavformat/mpeg.h +++ b/libavformat/mpeg.h @@ -58,6 +58,7 @@ #define STREAM_TYPE_VIDEO_CAVS 0x42 #define STREAM_TYPE_AUDIO_AC3 0x81 +#define STREAM_TYPE_AUDIO_ATRAC3 0xF0 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };