From a55c02df0a7a83a6a76fd89d8574910b2f24df3d Mon Sep 17 00:00:00 2001 From: Sivasubramanian Patchaiperumal Date: Fri, 26 Jun 2026 15:22:38 +0530 Subject: [PATCH] VPAAMP-457 Cherry-pick middleware subtitle PTS offset changes from aamp commit 2da7d5d Instead of rewriting the MPEGTS field in the VTT byte stream (fragile header surgery), the PTS offset is pushed into the subtec channel as a signed time offset, matching the pattern already used on the DASH path. - subtitleParser.h: add virtual setPtsOffset(double) no-op to base class - WebVttSubtecParser.hpp: declare setPtsOffset override; change time_offset_ms_ to signed int64_t - WebVttSubtecParser.cpp: implement setPtsOffset; pass time_offset_ms_ to SendDataPacket Cherry-picked from rdkcentral/aamp@2da7d5d8324c1bab81e24ea3d64c9a21eed6f2f7 --- subtec/subtecparser/WebVttSubtecParser.cpp | 12 +++++++++++- subtec/subtecparser/WebVttSubtecParser.hpp | 3 ++- subtitle/subtitleParser.h | 9 +++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/subtec/subtecparser/WebVttSubtecParser.cpp b/subtec/subtecparser/WebVttSubtecParser.cpp index b284e470..92e9d71d 100644 --- a/subtec/subtecparser/WebVttSubtecParser.cpp +++ b/subtec/subtecparser/WebVttSubtecParser.cpp @@ -19,6 +19,7 @@ #include "WebVttSubtecParser.hpp" #include "TextStyleAttributes.h" +#include WebVTTSubtecParser::WebVTTSubtecParser(SubtitleMimeType type, int width, int height) : SubtitleParser(type, width, height), m_channel(nullptr) { @@ -70,11 +71,20 @@ bool WebVTTSubtecParser::processData(const char* buffer, size_t bufferLen, doubl std::string str(const_cast(buffer), bufferLen); std::vector data(str.begin(), str.end()); - m_channel->SendDataPacket(std::move(data), 0); + m_channel->SendDataPacket(std::move(data), time_offset_ms_); return true; } +void WebVTTSubtecParser::setPtsOffset(double ptsOffsetSec) +{ + // Subtec's display_time = media_PTS - time_offset_ms (subtraction + // convention shared with Rialto SetSubtitlePtsOffset). The HLS + // restamped video PTS is media_PTS + ptsOffsetSec, so we negate + // here to make subtec add the offset on the subtitle path. + time_offset_ms_ = -static_cast(std::llround(ptsOffsetSec * 1000.0)); +} + void WebVTTSubtecParser::mute(bool mute) { if (mute) diff --git a/subtec/subtecparser/WebVttSubtecParser.hpp b/subtec/subtecparser/WebVttSubtecParser.hpp index 5e4186dd..e9cbf040 100644 --- a/subtec/subtecparser/WebVttSubtecParser.hpp +++ b/subtec/subtecparser/WebVttSubtecParser.hpp @@ -40,9 +40,10 @@ class WebVTTSubtecParser : public SubtitleParser void pause(bool pause) override; void mute(bool mute) override; void setTextStyle(const std::string &options) override; + void setPtsOffset(double ptsOffsetSec) override; protected: std::unique_ptr m_channel; private: - std::uint64_t time_offset_ms_ = 0; + std::int64_t time_offset_ms_ = 0; std::uint64_t start_ms_ = 0; }; diff --git a/subtitle/subtitleParser.h b/subtitle/subtitleParser.h index fb1d88af..ca156bf1 100644 --- a/subtitle/subtitleParser.h +++ b/subtitle/subtitleParser.h @@ -93,6 +93,15 @@ class SubtitleParser virtual void mute(bool mute) {} virtual void isLinear(bool isLinear) {} virtual void setTextStyle(const std::string &options){} + /** + * @brief Set a per-fragment PTS offset (seconds) that the parser + * applies when forwarding cue data to its subtitle sink. + * + * Used by the HLS PTS-restamp path to align subtitle display time + * with the restamped video PTS without rewriting MPEGTS in the + * VTT header. Default no-op; subtec-based parsers override. + */ + virtual void setPtsOffset(double ptsOffsetSec) {} void RegisterCallback(const PlayerCallbacks& playerCallBack) { playerResumeTrackDownloads_CB = playerCallBack.resumeTrackDownloads_CB;