summaryrefslogtreecommitdiff
blob: 6e6d03675a4fcf2989bc9e676511794098de4fd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
From 03bbe01b79a1f07a6780cb60f23a087104c5d77b Mon Sep 17 00:00:00 2001
From: Abs62 <ottomann@yandex.ru>
Date: Fri, 30 Mar 2018 22:53:24 +0300
Subject: [PATCH] Fix warnings while compile with FFMpeg 3.4.2 (issue #978)

---
 ffmpegaudio.cc | 68 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 62 insertions(+), 6 deletions(-)

diff --git a/ffmpegaudio.cc b/ffmpegaudio.cc
index ed1172bd..56e8f788 100644
--- a/ffmpegaudio.cc
+++ b/ffmpegaudio.cc
@@ -91,6 +91,7 @@ struct DecoderContext
   QByteArray audioData_;
   QDataStream audioDataStream_;
   AVFormatContext * formatContext_;
+  AVCodec * codec_;
   AVCodecContext * codecContext_;
   AVIOContext * avioContext_;
   AVStream * audioStream_;
@@ -114,6 +115,7 @@ DecoderContext::DecoderContext( QByteArray const & audioData, QAtomicInt & isCan
   audioData_( audioData ),
   audioDataStream_( audioData_ ),
   formatContext_( NULL ),
+  codec_( NULL ),
   codecContext_( NULL ),
   avioContext_( NULL ),
   audioStream_( NULL ),
@@ -143,7 +145,11 @@ bool DecoderContext::openCodec( QString & errorString )
     return false;
   }
 
+#if LIBAVCODEC_VERSION_MAJOR < 56 || ( LIBAVCODEC_VERSION_MAJOR == 56 && LIBAVCODEC_VERSION_MINOR < 56 )
   unsigned char * avioBuffer = ( unsigned char * )av_malloc( kBufferSize + FF_INPUT_BUFFER_PADDING_SIZE );
+#else
+  unsigned char * avioBuffer = ( unsigned char * )av_malloc( kBufferSize + AV_INPUT_BUFFER_PADDING_SIZE );
+#endif
   if ( !avioBuffer )
   {
     errorString = QObject::tr( "av_malloc() failed." );
@@ -186,7 +192,11 @@ bool DecoderContext::openCodec( QString & errorString )
   // Find audio stream, use the first audio stream if available
   for ( unsigned i = 0; i < formatContext_->nb_streams; i++ )
   {
+#if LIBAVCODEC_VERSION_MAJOR < 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR < 33 )
     if ( formatContext_->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO )
+#else
+      if ( formatContext_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO )
+#endif
     {
       audioStream_ = formatContext_->streams[i];
       break;
@@ -198,22 +208,38 @@ bool DecoderContext::openCodec( QString & errorString )
     return false;
   }
 
+#if LIBAVCODEC_VERSION_MAJOR < 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR < 33 )
   codecContext_ = audioStream_->codec;
-  AVCodec * codec = avcodec_find_decoder( codecContext_->codec_id );
-  if ( !codec )
+  codec_ = avcodec_find_decoder( codecContext_->codec_id );
+  if ( !codec_ )
   {
     errorString = QObject::tr( "Codec [id: %1] not found." ).arg( codecContext_->codec_id );
     return false;
   }
+#else
+  codec_ = avcodec_find_decoder( audioStream_->codecpar->codec_id );
+  if ( !codec_ )
+  {
+    errorString = QObject::tr( "Codec [id: %1] not found." ).arg( audioStream_->codecpar->codec_id );
+    return false;
+  }
+  codecContext_ = avcodec_alloc_context3( codec_ );
+  if ( !codecContext_ )
+  {
+    errorString = QObject::tr( "avcodec_alloc_context3() failed." );
+    return false;
+  }
+  avcodec_parameters_to_context( codecContext_, audioStream_->codecpar );
+#endif
 
-  ret = avcodec_open2( codecContext_, codec, NULL );
+  ret = avcodec_open2( codecContext_, codec_, NULL );
   if ( ret < 0 )
   {
     errorString = QObject::tr( "avcodec_open2() failed: %1." ).arg( avErrorString( ret ) );
     return false;
   }
 
-  av_log( NULL, AV_LOG_INFO, "Codec open: %s: channels: %d, rate: %d, format: %s\n", codec->long_name,
+  av_log( NULL, AV_LOG_INFO, "Codec open: %s: channels: %d, rate: %d, format: %s\n", codec_->long_name,
           codecContext_->channels, codecContext_->sample_rate, av_get_sample_fmt_name( codecContext_->sample_fmt ) );
   return true;
 }
@@ -252,10 +278,13 @@ void DecoderContext::closeCodec()
 
   // Closing a codec context without prior avcodec_open2() will result in
   // a crash in ffmpeg
-  if ( audioStream_ && audioStream_->codec && audioStream_->codec->codec )
+  if ( audioStream_ && codecContext_ && codec_ )
   {
     audioStream_->discard = AVDISCARD_ALL;
-    avcodec_close( audioStream_->codec );
+    avcodec_close( codecContext_ );
+#if LIBAVCODEC_VERSION_MAJOR > 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR >= 33 )
+    avcodec_free_context( &codecContext_ );
+#endif
   }
 
   avformat_close_input( &formatContext_ );
@@ -356,6 +385,7 @@ bool DecoderContext::play( QString & errorString )
     if ( packet.stream_index == audioStream_->index )
     {
       AVPacket pack = packet;
+#if LIBAVCODEC_VERSION_MAJOR < 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR < 37 )
       int gotFrame = 0;
       do
       {
@@ -370,6 +400,19 @@ bool DecoderContext::play( QString & errorString )
         pack.data += len;
       }
       while( pack.size > 0 );
+#else
+      int ret = avcodec_send_packet( codecContext_, &pack );
+      /* read all the output frames (in general there may be any number of them) */
+      while( ret >= 0 )
+      {
+        ret = avcodec_receive_frame( codecContext_, frame);
+
+        if ( Qt4x5::AtomicInt::loadAcquire( isCancelled_ ) || ret < 0 )
+          break;
+
+        playFrame( frame );
+      }
+#endif
     }
     // av_free_packet() must be called after each call to av_read_frame()
 #if LIBAVCODEC_VERSION_MAJOR < 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR < 7 )
@@ -379,6 +422,7 @@ bool DecoderContext::play( QString & errorString )
 #endif
   }
 
+#if LIBAVCODEC_VERSION_MAJOR < 57 || ( LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR < 37 )
   if ( !Qt4x5::AtomicInt::loadAcquire( isCancelled_ ) &&
        codecContext_->codec->capabilities & CODEC_CAP_DELAY )
   {
@@ -391,6 +435,18 @@ bool DecoderContext::play( QString & errorString )
       playFrame( frame );
     }
   }
+#else
+  /* flush the decoder */
+  av_init_packet( &packet );
+  int ret = avcodec_send_packet(codecContext_, &packet );
+  while( ret >= 0 )
+  {
+    ret = avcodec_receive_frame(codecContext_, frame);
+    if ( Qt4x5::AtomicInt::loadAcquire( isCancelled_ ) || ret < 0 )
+      break;
+    playFrame( frame );
+  }
+#endif
 
 #if LIBAVCODEC_VERSION_MAJOR < 54
   av_free( frame );