Skip to content

Commit ff94632

Browse files
authored
Merge pull request #326 from avTranscoder/dev/ffmpeg_5.0
FFmpeg 5.0
2 parents 5c3756b + 59f17bf commit ff94632

25 files changed

+236
-105
lines changed

src/AvTranscoder/Library.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ extern "C" {
1111
#else
1212
#include <libswresample/version.h>
1313
#endif
14+
#include <libavcodec/avcodec.h>
1415
#include <libavformat/avformat.h>
1516
#include <libavfilter/avfilter.h>
1617
}

src/AvTranscoder/codec/ICodec.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class AvExport ICodec
5454
#ifndef SWIG
5555
AVCodecContext& getAVCodecContext() { return *_avCodecContext; }
5656
const AVCodecContext& getAVCodecContext() const { return *_avCodecContext; }
57-
AVCodec& getAVCodec() { return *_avCodec; }
5857
const AVCodec& getAVCodec() const { return *_avCodec; }
5958
#endif
6059

@@ -66,7 +65,7 @@ class AvExport ICodec
6665

6766
protected:
6867
AVCodecContext* _avCodecContext; ///< Full codec instance description (has ownership)
69-
AVCodec* _avCodec; ///< Codec abstract description
68+
const AVCodec* _avCodec; ///< Codec abstract description
7069
const bool _isCodecContextAllocated; ///< Is the AVCodecContext allocated by the class
7170

7271
ECodecType _type;

src/AvTranscoder/common.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#define _AV_TRANSCODER_COMMON_HPP_
33

44
#define AVTRANSCODER_VERSION_MAJOR 0
5-
#define AVTRANSCODER_VERSION_MINOR 15
6-
#define AVTRANSCODER_VERSION_MICRO 5
5+
#define AVTRANSCODER_VERSION_MINOR 16
6+
#define AVTRANSCODER_VERSION_MICRO 0
77

88
#include <AvTranscoder/system.hpp>
99

src/AvTranscoder/data/coded/CodedData.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void CodedData::assign(const size_t size, const int value)
8787

8888
void CodedData::initAVPacket()
8989
{
90-
av_init_packet(&_packet);
90+
_packet = *av_packet_alloc();
9191
_packet.data = NULL;
9292
_packet.size = 0;
9393
}

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ bool AudioDecoder::decodeNextFrame(IFrame& frameBuffer)
8787
if(!_isSetup)
8888
setupDecoder();
8989

90-
int got_frame = 0;
90+
bool got_frame = false;
9191
while(!got_frame)
9292
{
9393
CodedData data;
@@ -98,18 +98,27 @@ bool AudioDecoder::decodeNextFrame(IFrame& frameBuffer)
9898
// decoding
9999
// @note could be called several times to return the remaining frames (last call with an empty packet)
100100
// @see CODEC_CAP_DELAY
101-
int ret = avcodec_decode_audio4(&_inputStream->getAudioCodec().getAVCodecContext(), &frameBuffer.getAVFrame(),
102-
&got_frame, &data.getAVPacket());
101+
int ret = avcodec_send_packet(&_inputStream->getAudioCodec().getAVCodecContext(), &data.getAVPacket());
102+
103103
if(ret < 0)
104104
{
105-
throw std::runtime_error("An error occurred during audio decoding: " + getDescriptionFromErrorCode(ret));
105+
throw std::runtime_error("An error occurred sending audio packet to decoder: " + getDescriptionFromErrorCode(ret));
106106
}
107107

108+
ret = avcodec_receive_frame(&_inputStream->getAudioCodec().getAVCodecContext(), &frameBuffer.getAVFrame());
109+
110+
if (ret == 0)
111+
got_frame = true;
112+
else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
113+
got_frame = false;
114+
else
115+
throw std::runtime_error("An error occurred receiving audio packet from decoder: " + getDescriptionFromErrorCode(ret));
116+
108117
// fixed channel layout value after decoding
109118
frameBuffer.getAVFrame().channel_layout = channelLayout;
110119

111120
// if no frame could be decompressed
112-
if(!nextPacketRead && ret == 0 && got_frame == 0)
121+
if(!nextPacketRead && got_frame == 0)
113122
decodeNextFrame = false;
114123
else
115124
decodeNextFrame = true;

src/AvTranscoder/decoder/VideoDecoder.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,22 @@ bool VideoDecoder::decodeNextFrame(IFrame& frameBuffer)
9494
// decoding
9595
// @note could be called several times to return the remaining frames (last call with an empty packet)
9696
// @see CODEC_CAP_DELAY
97-
const int ret = avcodec_decode_video2(&_inputStream->getVideoCodec().getAVCodecContext(), &frameBuffer.getAVFrame(),
98-
&got_frame, &data.getAVPacket());
99-
if(ret < 0)
100-
{
101-
throw std::runtime_error("An error occurred during video decoding: " + getDescriptionFromErrorCode(ret));
102-
}
97+
int ret = avcodec_send_packet(&_inputStream->getVideoCodec().getAVCodecContext(), &data.getAVPacket());
98+
99+
if (ret < 0 && (nextPacketRead || ret != AVERROR_EOF))
100+
throw std::runtime_error("An error occurred sending video packet to decoder: " + getDescriptionFromErrorCode(ret));
101+
102+
ret = avcodec_receive_frame(&_inputStream->getVideoCodec().getAVCodecContext(), &frameBuffer.getAVFrame());
103+
104+
if (ret == 0)
105+
got_frame = true;
106+
else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
107+
got_frame = false;
108+
else
109+
throw std::runtime_error("An error occurred receiving video packet from decoder: " + getDescriptionFromErrorCode(ret));
103110

104111
// if no frame could be decompressed
105-
if(!nextPacketRead && ret == 0 && got_frame == 0)
112+
if ((!nextPacketRead && ret == 0) || !got_frame)
106113
decodeNextFrame = false;
107114
else
108115
decodeNextFrame = true;

src/AvTranscoder/encoder/AudioEncoder.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ extern "C" {
77
}
88

99
#include <stdexcept>
10+
#include <libavcodec/avcodec.h>
1011

1112
namespace avtranscoder
1213
{
@@ -93,8 +94,6 @@ void AudioEncoder::setupEncoder(const ProfileLoader::Profile& profile)
9394

9495
bool AudioEncoder::encodeFrame(const IFrame& sourceFrame, CodedData& codedFrame)
9596
{
96-
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
97-
9897
AVPacket& packet = codedFrame.getAVPacket();
9998
const AVFrame& srcAvFrame = sourceFrame.getAVFrame();
10099
if(srcAvFrame.pts != (int)AV_NOPTS_VALUE)
@@ -121,7 +120,23 @@ bool AudioEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData)
121120
encodedData.data = NULL;
122121

123122
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
124-
#if LIBAVCODEC_VERSION_MAJOR > 53
123+
#if LIBAVCODEC_VERSION_MAJOR > 58
124+
int ret = avcodec_send_frame(&avCodecContext, decodedData);
125+
126+
if(ret != 0)
127+
throw std::runtime_error("Error sending audio frame to encoder: " + getDescriptionFromErrorCode(ret));
128+
129+
ret = avcodec_receive_packet(&avCodecContext, &encodedData);
130+
131+
if (ret == 0)
132+
return true;
133+
134+
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
135+
return false;
136+
137+
throw std::runtime_error("Error receiving audio frame from encoder: " + getDescriptionFromErrorCode(ret));
138+
139+
#elif LIBAVCODEC_VERSION_MAJOR > 53
125140
int gotPacket = 0;
126141
const int ret = avcodec_encode_audio2(&avCodecContext, &encodedData, decodedData, &gotPacket);
127142
if(ret != 0)

src/AvTranscoder/encoder/VideoEncoder.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ void VideoEncoder::setupEncoder(const ProfileLoader::Profile& profile)
110110

111111
bool VideoEncoder::encodeFrame(const IFrame& sourceFrame, CodedData& codedFrame)
112112
{
113-
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
114-
115113
AVPacket& packet = codedFrame.getAVPacket();
116114
const AVFrame& srcAvFrame = sourceFrame.getAVFrame();
117115
if(srcAvFrame.pts != (int)AV_NOPTS_VALUE)
@@ -138,14 +136,31 @@ bool VideoEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData)
138136
encodedData.data = NULL;
139137

140138
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
141-
#if LIBAVCODEC_VERSION_MAJOR > 53
139+
#if LIBAVCODEC_VERSION_MAJOR > 58
140+
int ret = avcodec_send_frame(&avCodecContext, decodedData);
141+
142+
if (ret != 0 && ret != AVERROR_EOF)
143+
throw std::runtime_error("Error sending video frame to encoder: " + getDescriptionFromErrorCode(ret));
144+
145+
ret = avcodec_receive_packet(&avCodecContext, &encodedData);
146+
147+
if (ret == 0)
148+
return true;
149+
150+
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
151+
return false;
152+
153+
throw std::runtime_error("Error receiving video frame from encoder: " + getDescriptionFromErrorCode(ret));
154+
155+
#elif LIBAVCODEC_VERSION_MAJOR > 53
142156
int gotPacket = 0;
143157
const int ret = avcodec_encode_video2(&avCodecContext, &encodedData, decodedData, &gotPacket);
144158
if(ret != 0)
145159
{
146160
throw std::runtime_error("Encode video frame error: avcodec encode video frame - " +
147161
getDescriptionFromErrorCode(ret));
148162
}
163+
149164
return gotPacket == 1;
150165
#else
151166
const int ret = avcodec_encode_video(&avCodecContext, encodedData.data, encodedData.size, decodedData);

src/AvTranscoder/file/FormatContext.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ FormatContext::~FormatContext()
4646
if(!_avFormatContext)
4747
return;
4848

49-
// free the streams added
50-
for(std::vector<AVStream*>::iterator it = _avStreamAllocated.begin(); it != _avStreamAllocated.end(); ++it)
51-
avcodec_close((*it)->codec);
52-
5349
// free the format context
5450
if(_isOpen)
5551
avformat_close_input(&_avFormatContext);
@@ -151,7 +147,7 @@ AVStream& FormatContext::addAVStream(const AVCodec& avCodec)
151147

152148
bool FormatContext::seek(const uint64_t position, const int flag)
153149
{
154-
LOG_INFO("Seek in '" << _avFormatContext->filename << "' at " << position << " with flag '" << flag << "'")
150+
LOG_INFO("Seek in '" << _avFormatContext->url << "' at " << position << " with flag '" << flag << "'")
155151
const int err = av_seek_frame(_avFormatContext, -1, position, flag);
156152
if(err < 0)
157153
{
@@ -186,12 +182,13 @@ AVStream& FormatContext::getAVStream(size_t index) const
186182

187183
void FormatContext::setFilename(const std::string& filename)
188184
{
189-
strcpy(&_avFormatContext->filename[0], filename.c_str());
185+
_avFormatContext->url = (char*)av_malloc(filename.size());
186+
strcpy(_avFormatContext->url, filename.c_str());
190187
}
191188

192189
void FormatContext::setOutputFormat(const std::string& filename, const std::string& shortName, const std::string& mimeType)
193190
{
194-
AVOutputFormat* oformat = av_guess_format(shortName.c_str(), filename.c_str(), mimeType.c_str());
191+
const AVOutputFormat* oformat = av_guess_format(shortName.c_str(), filename.c_str(), mimeType.c_str());
195192
if(!oformat)
196193
{
197194
std::string msg("Unable to find format for ");

src/AvTranscoder/file/FormatContext.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ class AvExport FormatContext
113113

114114
#ifndef SWIG
115115
AVFormatContext& getAVFormatContext() const { return *_avFormatContext; }
116-
AVOutputFormat& getAVOutputFormat() const { return *_avFormatContext->oformat; }
117-
AVInputFormat& getAVInputFormat() const { return *_avFormatContext->iformat; }
116+
const AVOutputFormat& getAVOutputFormat() const { return *_avFormatContext->oformat; }
117+
const AVInputFormat& getAVInputFormat() const { return *_avFormatContext->iformat; }
118118
AVIOContext& getAVIOContext() const { return *_avFormatContext->pb; }
119119
AVDictionary& getAVMetaData() const { return *_avFormatContext->metadata; }
120120
AVStream& getAVStream(size_t index) const;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy