subtitlecomposer/0004-VideoPlayer-stop-using-AVFrame.pkt_pos.patch
Christophe Marin 7e2072f1f1 - Add patch to fix build with pocketsphinx 5.0.3 in TW since
the API changed in the 5.0.0 release. Also, removed some
  parameters that don't seem to be configurable by pocketsphinx
  anymore:
  * use-pocketsphinx-5.0.0-api.patch

OBS-URL: https://build.opensuse.org/package/show/KDE:Extra/subtitlecomposer?expand=0&rev=47
2024-12-24 11:58:10 +00:00

94 lines
3.5 KiB
Diff

From 91b414a778cfc8fcee55f72352043aade2582627 Mon Sep 17 00:00:00 2001
From: Mladen Milinkovic <maxrd2@smoothware.net>
Date: Thu, 1 Aug 2024 10:46:54 +0200
Subject: [PATCH 04/11] VideoPlayer: stop using AVFrame.pkt_pos
This field is ad-hoc and will be deprecated. Use the recently-added
AV_CODEC_FLAG_COPY_OPAQUE to pass arbitrary user data from packets to
frames.
---
src/videoplayer/backend/audiodecoder.cpp | 4 +++-
src/videoplayer/backend/decoder.cpp | 17 +++++++++++++----
src/videoplayer/backend/decoder.h | 4 ++++
src/videoplayer/backend/videodecoder.cpp | 4 +++-
4 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/src/videoplayer/backend/audiodecoder.cpp b/src/videoplayer/backend/audiodecoder.cpp
index 8c0b943e..35144965 100644
--- a/src/videoplayer/backend/audiodecoder.cpp
+++ b/src/videoplayer/backend/audiodecoder.cpp
@@ -490,8 +490,10 @@ AudioDecoder::run()
if(!(af->frame = av_frame_alloc()))
break;
+ Decoder::FrameData *fd = reinterpret_cast<Decoder::FrameData*>(frame->opaque_ref ? frame->opaque_ref->data : nullptr);
+
af->pts = frame->pts == AV_NOPTS_VALUE ? NAN : double(frame->pts) / frame->sample_rate;
- af->pos = frame->pkt_pos;
+ af->pos = fd ? fd->pkt_pos : -1;
af->serial = m_pktSerial;
af->duration = double(frame->nb_samples) / frame->sample_rate;
diff --git a/src/videoplayer/backend/decoder.cpp b/src/videoplayer/backend/decoder.cpp
index 80fb993f..222056d0 100644
--- a/src/videoplayer/backend/decoder.cpp
+++ b/src/videoplayer/backend/decoder.cpp
@@ -133,10 +133,19 @@ Decoder::decodeFrame(AVFrame *frame, AVSubtitle *sub)
} else {
ret = pkt->data ? AVERROR(EAGAIN) : AVERROR_EOF;
}
- } else if(avcodec_send_packet(m_avCtx, pkt) == AVERROR(EAGAIN)) {
- av_log(m_avCtx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");
- m_pkt = pkt;
- pkt = nullptr;
+ } else {
+ if(pkt->buf && !pkt->opaque_ref) {
+ pkt->opaque_ref = av_buffer_allocz(sizeof(Decoder::FrameData));
+ if(!pkt->opaque_ref)
+ return AVERROR(ENOMEM);
+ Decoder::FrameData *fd = reinterpret_cast<Decoder::FrameData*>(pkt->opaque_ref->data);
+ fd->pkt_pos = pkt->pos;
+ }
+ if(avcodec_send_packet(m_avCtx, pkt) == AVERROR(EAGAIN)) {
+ av_log(m_avCtx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");
+ m_pkt = pkt;
+ pkt = nullptr;
+ }
}
av_packet_free(&pkt);
}
diff --git a/src/videoplayer/backend/decoder.h b/src/videoplayer/backend/decoder.h
index 55970668..f4dd8c7e 100644
--- a/src/videoplayer/backend/decoder.h
+++ b/src/videoplayer/backend/decoder.h
@@ -55,6 +55,10 @@ protected:
AVRational m_startPtsTb;
int64_t m_nextPts;
AVRational m_nextPtsTb;
+
+ struct FrameData {
+ int64_t pkt_pos;
+ };
};
}
diff --git a/src/videoplayer/backend/videodecoder.cpp b/src/videoplayer/backend/videodecoder.cpp
index 851f6268..d5bd111e 100644
--- a/src/videoplayer/backend/videodecoder.cpp
+++ b/src/videoplayer/backend/videodecoder.cpp
@@ -101,8 +101,10 @@ VideoDecoder::run()
if(!ret)
continue;
+ Decoder::FrameData *fd = reinterpret_cast<Decoder::FrameData*>(frame->opaque_ref ? frame->opaque_ref->data : nullptr);
+
double pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * m_timeBase;
- ret = queuePicture(frame, pts, frameDuration, frame->pkt_pos, pktSerial());
+ ret = queuePicture(frame, pts, frameDuration, fd ? fd->pkt_pos : -1, pktSerial());
av_frame_unref(frame);
if(ret < 0)
--
2.46.0