Skip to content

Commit c2228ef

Browse files
author
Clement Champetier
committed
Frame: has an AVPacket to manage data
Avoid copies of data when call copyData.
1 parent 7bd3b50 commit c2228ef

File tree

14 files changed

+133
-118
lines changed

14 files changed

+133
-118
lines changed

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ bool AudioDecoder::decodeNextFrame( Frame& frameBuffer )
7272

7373
if( decodedSize )
7474
{
75-
if( audioBuffer.getSize() != decodedSize )
76-
audioBuffer.getBuffer().resize( decodedSize, 0 );
75+
audioBuffer.resize( decodedSize );
7776

7877
// @todo manage cases with data of frame not only on data[0] (use _frame.linesize)
7978
unsigned char* const src = _frame->data[0];
@@ -109,8 +108,7 @@ bool AudioDecoder::decodeNextFrame( Frame& frameBuffer, const size_t subStreamIn
109108

110109
if( decodedSize )
111110
{
112-
if( audioBuffer.getSize() != decodedSize )
113-
audioBuffer.getBuffer().resize( decodedSize, 0 );
111+
audioBuffer.resize( decodedSize );
114112

115113
// @todo manage cases with data of frame not only on data[0] (use _frame.linesize)
116114
unsigned char* src = _frame->data[0];
@@ -136,19 +134,12 @@ bool AudioDecoder::decodeNextFrame()
136134
{
137135
CodedData data;
138136

139-
AVPacket packet;
140-
av_init_packet( &packet );
141-
142137
bool nextPacketRead = _inputStream->readNextPacket( data );
143-
144-
packet.stream_index = _inputStream->getStreamIndex();
145-
packet.data = nextPacketRead ? data.getPtr(): NULL;
146-
packet.size = data.getSize();
147-
148-
int ret = avcodec_decode_audio4( &_inputStream->getAudioCodec().getAVCodecContext(), _frame, &got_frame, &packet );
149-
av_free_packet( &packet );
138+
if( ! nextPacketRead ) // error or end of file
139+
return false;
150140

151-
if( ! nextPacketRead && ret == 0 && got_frame == 0 ) // error or end of file
141+
int ret = avcodec_decode_audio4( &_inputStream->getAudioCodec().getAVCodecContext(), _frame, &got_frame, &data.getAVPacket() );
142+
if( ret == 0 && got_frame == 0 ) // no frame could be decompressed
152143
return false;
153144

154145
if( ret < 0 )

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ bool AudioGenerator::decodeNextFrame( Frame& frameBuffer )
3333
int fillChar = 0;
3434

3535
AudioFrame intermediateBuffer( _frameDesc );
36-
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
36+
intermediateBuffer.resize( _frameDesc.getDataSize() );
3737
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
3838

3939
AudioTransform audioTransform;

src/AvTranscoder/decoder/VideoDecoder.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,10 @@ bool VideoDecoder::decodeNextFrame( Frame& frameBuffer )
6666
if( ! decodedSize )
6767
return false;
6868

69-
if( imageBuffer.getBuffer().size() != decodedSize )
70-
imageBuffer.getBuffer().resize( decodedSize );
69+
imageBuffer.resize( decodedSize );
7170

7271
// Copy pixel data from an AVPicture into one contiguous buffer.
73-
avpicture_layout( (AVPicture*)_frame, (AVPixelFormat)_frame->format, _frame->width, _frame->height, &imageBuffer.getBuffer()[0], frameBuffer.getBuffer().size() );
72+
avpicture_layout( (AVPicture*)_frame, (AVPixelFormat)_frame->format, _frame->width, _frame->height, imageBuffer.getPtr(), frameBuffer.getSize() );
7473

7574
return true;
7675
}
@@ -87,19 +86,12 @@ bool VideoDecoder::decodeNextFrame()
8786
{
8887
CodedData data;
8988

90-
AVPacket packet;
91-
av_init_packet( &packet );
92-
9389
bool nextPacketRead = _inputStream->readNextPacket( data );
94-
95-
packet.stream_index = _inputStream->getStreamIndex();
96-
packet.data = nextPacketRead ? data.getPtr(): NULL;
97-
packet.size = data.getSize();
98-
99-
int ret = avcodec_decode_video2( &_inputStream->getVideoCodec().getAVCodecContext(), _frame, &got_frame, &packet );
100-
av_free_packet( &packet );
90+
if( ! nextPacketRead ) // error or end of file
91+
return false;
10192

102-
if( ! nextPacketRead && ret == 0 && got_frame == 0 ) // error or end of file
93+
int ret = avcodec_decode_video2( &_inputStream->getVideoCodec().getAVCodecContext(), _frame, &got_frame, &data.getAVPacket() );
94+
if( ret == 0 && got_frame == 0 ) // no frame could be decompressed
10395
return false;
10496

10597
if( ret < 0 )

src/AvTranscoder/decoder/VideoGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ bool VideoGenerator::decodeNextFrame( Frame& frameBuffer )
3737
desc.setPixelFormat( "rgb24" );
3838

3939
VideoFrame intermediateBuffer( desc );
40-
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
40+
intermediateBuffer.resize( _frameDesc.getDataSize() );
4141
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
4242

4343
VideoTransform videoTransform;

src/AvTranscoder/encoder/AudioEncoder.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ bool AudioEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
6262
throw std::runtime_error( "EncodeFrame error: avcodec fill audio frame - " + std::string( err ) );
6363
}
6464

65-
AVPacket packet;
66-
av_init_packet( &packet );
67-
68-
packet.size = 0;
69-
packet.data = NULL;
65+
AVPacket& packet = codedFrame.getAVPacket();
7066
packet.stream_index = 0;
7167

7268
if( ( avCodecContext.coded_frame ) &&
@@ -84,20 +80,22 @@ bool AudioEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
8480
#if LIBAVCODEC_VERSION_MAJOR > 53
8581
int gotPacket = 0;
8682
int ret = avcodec_encode_audio2( &avCodecContext, &packet, frame, &gotPacket );
87-
if( ret == 0 && gotPacket == 1 )
83+
if( ret != 0 && gotPacket == 0 )
8884
{
89-
codedFrame.copyData( packet.data, packet.size );
85+
char err[AV_ERROR_MAX_STRING_SIZE];
86+
av_strerror( ret, err, sizeof(err) );
87+
throw std::runtime_error( "EncodeFrame error: avcodec encode audio frame - " + std::string( err ) );
9088
}
9189
#else
9290
int ret = avcodec_encode_audio( &avCodecContext, packet.data, packet.size, frame );
93-
if( ret > 0 )
91+
if( ret < 0 )
9492
{
95-
codedFrame.copyData( packet.data, packet.size );
93+
char err[AV_ERROR_MAX_STRING_SIZE];
94+
av_strerror( ret, err, sizeof(err) );
95+
throw std::runtime_error( "EncodeFrame error: avcodec encode audio frame - " + std::string( err ) );
9696
}
9797
#endif
9898

99-
av_free_packet( &packet );
100-
10199
#if LIBAVCODEC_VERSION_MAJOR > 54
102100
av_frame_free( &frame );
103101
return ret == 0 && gotPacket == 1;
@@ -116,30 +114,28 @@ bool AudioEncoder::encodeFrame( Frame& codedFrame )
116114
{
117115
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
118116

119-
AVPacket packet;
120-
av_init_packet( &packet );
121-
122-
packet.size = 0;
123-
packet.data = NULL;
117+
AVPacket& packet = codedFrame.getAVPacket();
124118
packet.stream_index = 0;
125119

126120
#if LIBAVCODEC_VERSION_MAJOR > 53
127121
int gotPacket = 0;
128122
int ret = avcodec_encode_audio2( &avCodecContext, &packet, NULL, &gotPacket );
129-
if( ret == 0 && gotPacket == 1 )
123+
if( ret != 0 && gotPacket == 0 )
130124
{
131-
codedFrame.copyData( packet.data, packet.size );
125+
char err[AV_ERROR_MAX_STRING_SIZE];
126+
av_strerror( ret, err, sizeof(err) );
127+
throw std::runtime_error( "EncodeFrame error: avcodec encode last audio frame - " + std::string( err ) );
132128
}
133-
av_free_packet( &packet );
134129
return ret == 0 && gotPacket == 1;
135130

136131
#else
137132
int ret = avcodec_encode_audio( &avCodecContext, packet.data, packet.size, NULL );
138-
if( ret > 0 )
133+
if( ret < 0 )
139134
{
140-
codedFrame.copyData( packet.data, packet.size );
135+
char err[AV_ERROR_MAX_STRING_SIZE];
136+
av_strerror( ret, err, sizeof(err) );
137+
throw std::runtime_error( "EncodeFrame error: avcodec encode last audio frame - " + std::string( err ) );
141138
}
142-
av_free_packet( &packet );
143139
return ret == 0;
144140

145141
#endif

src/AvTranscoder/encoder/VideoEncoder.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,7 @@ bool VideoEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
4848
frame->format = avCodecContext.pix_fmt;
4949
avpicture_fill( (AVPicture*)frame, const_cast< unsigned char * >( sourceImageFrame.getPtr() ), avCodecContext.pix_fmt, avCodecContext.width, avCodecContext.height );
5050

51-
AVPacket packet;
52-
av_init_packet( &packet );
53-
// avcodec_encode_video allocate packet
54-
packet.size = 0;
55-
packet.data = NULL;
51+
AVPacket& packet = codedFrame.getAVPacket();
5652
packet.stream_index = 0;
5753

5854
if( ( avCodecContext.coded_frame ) &&
@@ -70,19 +66,22 @@ bool VideoEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
7066
#if LIBAVCODEC_VERSION_MAJOR > 53
7167
int gotPacket = 0;
7268
int ret = avcodec_encode_video2( &avCodecContext, &packet, frame, &gotPacket );
73-
if( ret == 0 && gotPacket == 1 )
69+
if( ret != 0 && gotPacket == 0 )
7470
{
75-
codedFrame.copyData( packet.data, packet.size );
71+
char err[AV_ERROR_MAX_STRING_SIZE];
72+
av_strerror( ret, err, sizeof(err) );
73+
throw std::runtime_error( "EncodeFrame error: avcodec encode video frame - " + std::string( err ) );
7674
}
7775
#else
7876
int ret = avcodec_encode_video( &avCodecContext, packet.data, packet.size, frame );
79-
if( ret > 0 )
77+
if( ret < 0 )
8078
{
81-
codedFrame.copyData( packet.data, packet.size );
79+
char err[AV_ERROR_MAX_STRING_SIZE];
80+
av_strerror( ret, err, sizeof(err) );
81+
throw std::runtime_error( "EncodeFrame error: avcodec encode video frame - " + std::string( err ) );
8282
}
8383
#endif
8484

85-
av_free_packet( &packet );
8685
#if LIBAVCODEC_VERSION_MAJOR > 54
8786
av_frame_free( &frame );
8887
return ret == 0 && gotPacket == 1;
@@ -101,29 +100,27 @@ bool VideoEncoder::encodeFrame( Frame& codedFrame )
101100
{
102101
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
103102

104-
AVPacket packet;
105-
av_init_packet( &packet );
106-
// avcodec_encode_video allocate packet
107-
packet.size = 0;
108-
packet.data = NULL;
103+
AVPacket& packet = codedFrame.getAVPacket();
109104
packet.stream_index = 0;
110105

111106
#if LIBAVCODEC_VERSION_MAJOR > 53
112107
int gotPacket = 0;
113108
int ret = avcodec_encode_video2( &avCodecContext, &packet, NULL, &gotPacket );
114-
if( ret == 0 && gotPacket == 1 )
109+
if( ret != 0 && gotPacket == 0 )
115110
{
116-
codedFrame.copyData( packet.data, packet.size );
111+
char err[AV_ERROR_MAX_STRING_SIZE];
112+
av_strerror( ret, err, sizeof(err) );
113+
throw std::runtime_error( "EncodeFrame error: avcodec encode last video frame - " + std::string( err ) );
117114
}
118-
av_free_packet( &packet );
119115
return ret == 0 && gotPacket == 1;
120116
#else
121117
int ret = avcodec_encode_video( &avCodecContext, packet.data, packet.size, NULL );
122-
if( ret > 0 )
118+
if( ret < 0 )
123119
{
124-
codedFrame.copyData( packet.data, packet.size );
120+
char err[AV_ERROR_MAX_STRING_SIZE];
121+
av_strerror( ret, err, sizeof(err) );
122+
throw std::runtime_error( "EncodeFrame error: avcodec encode last video frame - " + std::string( err ) );
125123
}
126-
av_free_packet( &packet );
127124
return ret == 0;
128125
#endif
129126
}

src/AvTranscoder/file/InputFile.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,31 +115,28 @@ FileProperties InputFile::analyseFile( const std::string& filename, IProgress& p
115115

116116
bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex )
117117
{
118-
AVPacket packet;
119118
bool nextPacketFound = false;
120119
while( ! nextPacketFound )
121120
{
122-
av_init_packet( &packet );
123-
int ret = av_read_frame( &_formatContext.getAVFormatContext(), &packet );
121+
int ret = av_read_frame( &_formatContext.getAVFormatContext(), &data.getAVPacket() );
124122
if( ret < 0 ) // error or end of file
125123
{
126-
av_free_packet( &packet );
127124
return false;
128125
}
129126

130127
// if the packet stream is the expected one
131-
// copy and return the packet data
132-
if( packet.stream_index == (int)streamIndex )
128+
// return the packet data
129+
int packetStreamIndex = data.getAVPacket().stream_index;
130+
if( packetStreamIndex == (int)streamIndex )
133131
{
134-
data.copyData( packet.data, packet.size );
135132
nextPacketFound = true;
136133
}
137134
// else add the packet data to the stream cache
138135
else
139136
{
140-
_inputStreams.at( packet.stream_index )->addPacket( packet );
137+
_inputStreams.at( packetStreamIndex )->addPacket( data.getAVPacket() );
138+
data.clear();
141139
}
142-
av_free_packet( &packet );
143140
}
144141
return true;
145142
}

src/AvTranscoder/frame/AudioFrame.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,10 @@ class AvExport AudioFrame : public Frame
8181
{
8282
public:
8383
AudioFrame( const AudioFrameDesc& ref )
84-
: _audioFrameDesc( ref )
84+
: Frame( ref.getDataSize() )
85+
, _audioFrameDesc( ref )
8586
, _nbSamples( 0 )
86-
{
87-
_dataBuffer = DataBuffer( ref.getDataSize(), (unsigned char) 0 );
88-
}
87+
{}
8988

9089
const AudioFrameDesc& desc() const { return _audioFrameDesc; }
9190

0 commit comments

Comments
 (0)