summaryrefslogtreecommitdiff
path: root/chromium-119-ffmpeg-first_dts.patch
diff options
context:
space:
mode:
Diffstat (limited to 'chromium-119-ffmpeg-first_dts.patch')
-rw-r--r--chromium-119-ffmpeg-first_dts.patch94
1 files changed, 94 insertions, 0 deletions
diff --git a/chromium-119-ffmpeg-first_dts.patch b/chromium-119-ffmpeg-first_dts.patch
new file mode 100644
index 0000000..19cf84b
--- /dev/null
+++ b/chromium-119-ffmpeg-first_dts.patch
@@ -0,0 +1,94 @@
+diff -up chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.cc.first_dts chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.cc
+--- chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.cc.first_dts 2023-11-01 19:10:31.000000000 +0100
++++ chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.cc 2023-11-06 13:05:09.819011697 +0100
+@@ -101,7 +101,7 @@ static base::TimeDelta FramesToTimeDelta
+ sample_rate);
+ }
+
+-static base::TimeDelta ExtractStartTime(AVStream* stream) {
++static base::TimeDelta ExtractStartTime(AVStream* stream, int64_t first_dts) {
+ // The default start time is zero.
+ base::TimeDelta start_time;
+
+@@ -111,12 +111,12 @@ static base::TimeDelta ExtractStartTime(
+
+ // Next try to use the first DTS value, for codecs where we know PTS == DTS
+ // (excludes all H26x codecs). The start time must be returned in PTS.
+- if (av_stream_get_first_dts(stream) != kNoFFmpegTimestamp &&
++ if (first_dts != AV_NOPTS_VALUE &&
+ stream->codecpar->codec_id != AV_CODEC_ID_HEVC &&
+ stream->codecpar->codec_id != AV_CODEC_ID_H264 &&
+ stream->codecpar->codec_id != AV_CODEC_ID_MPEG4) {
+ const base::TimeDelta first_pts =
+- ConvertFromTimeBase(stream->time_base, av_stream_get_first_dts(stream));
++ ConvertFromTimeBase(stream->time_base, first_dts);
+ if (first_pts < start_time)
+ start_time = first_pts;
+ }
+@@ -274,6 +274,7 @@ FFmpegDemuxerStream::FFmpegDemuxerStream
+ fixup_negative_timestamps_(false),
+ fixup_chained_ogg_(false),
+ num_discarded_packet_warnings_(0),
++ first_dts_(AV_NOPTS_VALUE),
+ last_packet_pos_(AV_NOPTS_VALUE),
+ last_packet_dts_(AV_NOPTS_VALUE) {
+ DCHECK(demuxer_);
+@@ -336,6 +337,10 @@ void FFmpegDemuxerStream::EnqueuePacket(
+ int64_t packet_dts =
+ packet->dts == AV_NOPTS_VALUE ? packet->pts : packet->dts;
+
++ if (first_dts_ == AV_NOPTS_VALUE) {
++ first_dts_ = packet_dts;
++ }
++
+ // Chained ogg files have non-monotonically increasing position and time stamp
+ // values, which prevents us from using them to determine if a packet should
+ // be dropped. Since chained ogg is only allowed on single track audio only
+@@ -1442,7 +1447,8 @@ void FFmpegDemuxer::OnFindStreamInfoDone
+
+ max_duration = std::max(max_duration, streams_[i]->duration());
+
+- base::TimeDelta start_time = ExtractStartTime(stream);
++ base::TimeDelta start_time =
++ ExtractStartTime(stream, streams_[i]->first_dts());
+
+ // Note: This value is used for seeking, so we must take the true value and
+ // not the one possibly clamped to zero below.
+@@ -1604,7 +1610,7 @@ FFmpegDemuxerStream* FFmpegDemuxer::Find
+ for (const auto& stream : streams_) {
+ if (!stream || stream->IsEnabled() != enabled)
+ continue;
+- if (av_stream_get_first_dts(stream->av_stream()) == kInvalidPTSMarker)
++ if (stream->first_dts() == AV_NOPTS_VALUE)
+ continue;
+ if (!lowest_start_time_stream ||
+ stream->start_time() < lowest_start_time_stream->start_time()) {
+@@ -1625,7 +1631,7 @@ FFmpegDemuxerStream* FFmpegDemuxer::Find
+ if (stream->type() != DemuxerStream::VIDEO)
+ continue;
+
+- if (av_stream_get_first_dts(stream->av_stream()) == kInvalidPTSMarker)
++ if (stream->first_dts() == AV_NOPTS_VALUE)
+ continue;
+
+ if (!stream->IsEnabled())
+diff -up chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.h.first_dts chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.h
+--- chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.h.first_dts 2023-11-01 19:10:31.000000000 +0100
++++ chromium-119.0.6045.105/media/filters/ffmpeg_demuxer.h 2023-11-06 13:08:43.425784988 +0100
+@@ -142,6 +142,8 @@ class MEDIA_EXPORT FFmpegDemuxerStream :
+ base::TimeDelta start_time() const { return start_time_; }
+ void set_start_time(base::TimeDelta time) { start_time_ = time; }
+
++ int64_t first_dts() const { return first_dts_; }
++
+ private:
+ friend class FFmpegDemuxerTest;
+
+@@ -198,6 +200,7 @@ class MEDIA_EXPORT FFmpegDemuxerStream :
+ bool fixup_chained_ogg_;
+
+ int num_discarded_packet_warnings_;
++ int64_t first_dts_;
+ int64_t last_packet_pos_;
+ int64_t last_packet_dts_;
+ // Requested buffer count. The actual returned buffer count could be less