From de27de9d61cc6efeedd524275c574abd1ae76d7e Mon Sep 17 00:00:00 2001
From: Misty De Meo <mistydemeo@gmail.com>
Date: Thu, 21 Dec 2017 23:16:44 +0800
Subject: [PATCH] Fix detecting ATRAC3 audio from MPS files

---
 libavformat/mpeg.c | 38 ++++++++++++++------------------------
 libavformat/mpeg.h |  1 +
 2 files changed, 15 insertions(+), 24 deletions(-)

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 };
 
-- 
2.15.1

