From cc646df5fd14e4201dbfa2e829528fbef8c34ae5 Mon Sep 17 00:00:00 2001
From: Francois Cartegnie <fcvlcdev@free.fr>
Date: Wed, 26 Jun 2019 22:08:33 +0200
Subject: [PATCH] demux: hls: set ID3 time offset

callback lost or disabled ?
---
 modules/demux/hls/HLSStreams.cpp | 35 ++++++++++++++++----------------
 modules/demux/hls/HLSStreams.hpp |  3 ++-
 2 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/modules/demux/hls/HLSStreams.cpp b/modules/demux/hls/HLSStreams.cpp
index 411fc162e8b7..b96414516b80 100644
--- a/modules/demux/hls/HLSStreams.cpp
+++ b/modules/demux/hls/HLSStreams.cpp
@@ -49,24 +49,27 @@ HLSStream::~HLSStream()
         vlc_meta_Delete(p_meta);
 }
 
-void HLSStream::setTimeOffset(vlc_tick_t i_offset)
+void HLSStream::setMetadataTimeOffset(vlc_tick_t i_offset)
 {
     if(i_offset >= 0)
     {
-        if((unsigned)format == StreamFormat::PACKEDAAC)
-        {
-            if(!b_id3_timestamps_offset_set)
-            {
-                fakeEsOut()->setAssociatedTimestamp(i_offset);
-            }
-            return;
-        }
+        if(!b_id3_timestamps_offset_set)
+            fakeEsOut()->setAssociatedTimestamp(i_offset);
+        b_id3_timestamps_offset_set = true;
     }
     else
     {
+        fakeEsOut()->setAssociatedTimestamp(-1);
         b_id3_timestamps_offset_set = false;
     }
-    AbstractStream::setTimeOffset(i_offset);
+}
+
+bool HLSStream::setPosition(vlc_tick_t ts , bool b)
+{
+    bool ok = AbstractStream::setPosition(ts ,b);
+    if(b && ok)
+        b_id3_timestamps_offset_set = false;
+    return ok;
 }
 
 int HLSStream::ParseID3PrivTag(const uint8_t *p_payload, size_t i_payload)
@@ -74,19 +77,17 @@ int HLSStream::ParseID3PrivTag(const uint8_t *p_payload, size_t i_payload)
     if(i_payload == 53 &&
        !memcmp( p_payload, "com.apple.streaming.transportStreamTimestamp", 45))
     {
-        if(!b_id3_timestamps_offset_set)
-        {
-            const vlc_tick_t i_aac_offset = FROM_SCALE_NZ(GetQWBE(&p_payload[45]));
-            setTimeOffset(i_aac_offset);
-            b_id3_timestamps_offset_set = true;
-        }
+        setMetadataTimeOffset(FROM_SCALE_NZ(GetQWBE(&p_payload[45])));
     }
     return VLC_SUCCESS;
 }
 
 int HLSStream::ParseID3Tag(uint32_t i_tag, const uint8_t *p_payload, size_t i_payload)
 {
-    (void) ID3HandleTag(p_payload, i_payload, i_tag, p_meta, &b_meta_updated);
+    if(i_tag == VLC_FOURCC('P','R','I','V'))
+        (void) ParseID3PrivTag(p_payload, i_payload);
+    else
+        (void) ID3HandleTag(p_payload, i_payload, i_tag, p_meta, &b_meta_updated);
     return VLC_SUCCESS;
 }
 
diff --git a/modules/demux/hls/HLSStreams.hpp b/modules/demux/hls/HLSStreams.hpp
index 77dff6a434b9..ac56961bd8b1 100644
--- a/modules/demux/hls/HLSStreams.hpp
+++ b/modules/demux/hls/HLSStreams.hpp
@@ -33,15 +33,16 @@ namespace hls
             virtual ~HLSStream();
 
         protected:
-            virtual void setTimeOffset(vlc_tick_t); /* reimpl */
             virtual block_t *checkBlock(block_t *, bool); /* reimpl */
             virtual AbstractDemuxer * newDemux(demux_t *, const StreamFormat &,
                                                es_out_t *, AbstractSourceStream *) const; /* reimpl */
+            virtual bool setPosition(vlc_tick_t, bool);
 
         private:
             static int ID3TAG_Parse_Handler(uint32_t, const uint8_t *, size_t, void *);
             int ParseID3Tag(uint32_t, const uint8_t *, size_t);
             int ParseID3PrivTag(const uint8_t *, size_t);
+            void setMetadataTimeOffset(vlc_tick_t);
             bool b_id3_timestamps_offset_set;
             vlc_meta_t *p_meta;
             bool b_meta_updated;
-- 
GitLab