File 232.patch of Package failed_spek

From 23f481e41a612b71f94f79546303545111c303ae Mon Sep 17 00:00:00 2001
From: MikeWang000000 <mikewang000000@gmail.com>
Date: Tue, 12 Jul 2022 00:49:00 +0800
Subject: [PATCH] Replace deprecated FFmpeg APIs to support FFmpeg 5.x

---
 src/spek-audio.cc | 58 +++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/spek-audio.cc b/src/spek-audio.cc
index b7cfa47..3606d9c 100644
--- a/src/spek-audio.cc
+++ b/src/spek-audio.cc
@@ -50,7 +50,7 @@ class AudioFileImpl : public AudioFile
 
     int channel;
 
-    AVPacket packet;
+    AVPacket *packet;
     int offset;
     AVFrame *frame;
     int buffer_len;
@@ -103,7 +103,7 @@ std::unique_ptr<AudioFile> Audio::open(const std::string& file_name, int stream)
 
     AVStream *avstream = nullptr;
     AVCodecParameters *codecpar = nullptr;
-    AVCodec *codec = nullptr;
+    const AVCodec *codec = nullptr;
     if (!error) {
         avstream = format_context->streams[audio_stream];
         codecpar = avstream->codecpar;
@@ -201,9 +201,9 @@ AudioFileImpl::AudioFileImpl(
     sample_rate(sample_rate),
     bits_per_sample(bits_per_sample), streams(streams), channels(channels), duration(duration)
 {
-    av_init_packet(&this->packet);
-    this->packet.data = nullptr;
-    this->packet.size = 0;
+    this->packet = av_packet_alloc();
+    this->packet->data = nullptr;
+    this->packet->size = 0;
     this->offset = 0;
     this->frame = av_frame_alloc();
     this->buffer_len = 0;
@@ -221,11 +221,11 @@ AudioFileImpl::~AudioFileImpl()
     if (this->frame) {
         av_frame_free(&this->frame);
     }
-    if (this->packet.data) {
-        this->packet.data -= this->offset;
-        this->packet.size += this->offset;
+    if (this->packet->data) {
+        this->packet->data -= this->offset;
+        this->packet->size += this->offset;
         this->offset = 0;
-        av_packet_unref(&this->packet);
+        av_packet_unref(this->packet);
     }
     if (this->codec_context) {
         avcodec_free_context(&codec_context);
@@ -258,23 +258,23 @@ int AudioFileImpl::read()
     }
 
     for (;;) {
-        while (this->packet.size > 0) {
+        while (this->packet->size > 0) {
             av_frame_unref(this->frame);
-            int got_frame = 0;
-            int len = avcodec_decode_audio4(
-                this->codec_context, this->frame, &got_frame, &this->packet
-            );
-            if (len < 0) {
-                // Error, skip the frame.
+            int ret;
+            ret = avcodec_send_packet(this->codec_context, this->packet);
+            if (ret < 0) {
+                // Error sending a packet for decoding, skip the frame.
                 break;
             }
-            this->packet.data += len;
-            this->packet.size -= len;
-            this->offset += len;
-            if (!got_frame) {
-                // No data yet, get more frames.
-                continue;
+            ret = avcodec_receive_frame(this->codec_context, this->frame);
+            if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
+                // Error during decoding, skip the frame.
+                break;
             }
+            int len = this->packet->size;
+            this->packet->data += len;
+            this->packet->size -= len;
+            this->offset += len;
             // We have data, return it and come back for more later.
             int samples = this->frame->nb_samples;
             if (samples > this->buffer_len) {
@@ -324,19 +324,19 @@ int AudioFileImpl::read()
             }
             return samples;
         }
-        if (this->packet.data) {
-            this->packet.data -= this->offset;
-            this->packet.size += this->offset;
+        if (this->packet->data) {
+            this->packet->data -= this->offset;
+            this->packet->size += this->offset;
             this->offset = 0;
-            av_packet_unref(&this->packet);
+            av_packet_unref(this->packet);
         }
 
         int res = 0;
-        while ((res = av_read_frame(this->format_context, &this->packet)) >= 0) {
-            if (this->packet.stream_index == this->audio_stream) {
+        while ((res = av_read_frame(this->format_context, this->packet)) >= 0) {
+            if (this->packet->stream_index == this->audio_stream) {
                 break;
             }
-            av_packet_unref(&this->packet);
+            av_packet_unref(this->packet);
         }
         if (res < 0) {
             // End of file or error.
openSUSE Build Service is sponsored by