Skip to content

Commit 0fe7c8a

Browse files
committed
Merge pull request #245 from cchampet/fix_encodingLastFrames
Fix encoding of last frames
2 parents 14164d6 + cdf2697 commit 0fe7c8a

File tree

5 files changed

+44
-72
lines changed

5 files changed

+44
-72
lines changed

src/AvTranscoder/encoder/AudioEncoder.cpp

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ bool AudioEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame)
9696
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
9797

9898
AVPacket& packet = codedFrame.getAVPacket();
99-
packet.stream_index = 0;
100-
10199
if((avCodecContext.coded_frame) && (avCodecContext.coded_frame->pts != (int)AV_NOPTS_VALUE))
102100
{
103101
packet.pts = avCodecContext.coded_frame->pts;
@@ -108,55 +106,38 @@ bool AudioEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame)
108106
packet.flags |= AV_PKT_FLAG_KEY;
109107
}
110108

111-
#if LIBAVCODEC_VERSION_MAJOR > 53
112-
int gotPacket = 0;
113-
int ret = avcodec_encode_audio2(&avCodecContext, &packet, &sourceFrame.getAVFrame(), &gotPacket);
114-
if(ret != 0 && gotPacket == 0)
115-
{
116-
throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " +
117-
getDescriptionFromErrorCode(ret));
118-
}
119-
#else
120-
int ret = avcodec_encode_audio(&avCodecContext, packet.data, packet.size, &sourceFrame.getAVFrame());
121-
if(ret < 0)
122-
{
123-
throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " +
124-
getDescriptionFromErrorCode(ret));
125-
}
126-
#endif
127-
128-
#if LIBAVCODEC_VERSION_MAJOR > 53
129-
return ret == 0 && gotPacket == 1;
130-
#endif
131-
return ret == 0;
109+
return encode(&sourceFrame.getAVFrame(), packet);
132110
}
133111

134112
bool AudioEncoder::encodeFrame(CodedData& codedFrame)
135113
{
136-
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
114+
return encode(NULL, codedFrame.getAVPacket());
115+
}
137116

138-
AVPacket& packet = codedFrame.getAVPacket();
139-
packet.stream_index = 0;
117+
bool AudioEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData)
118+
{
119+
// Be sure that data of AVPacket is NULL so that the encoder will allocate it
120+
encodedData.data = NULL;
140121

122+
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
141123
#if LIBAVCODEC_VERSION_MAJOR > 53
142124
int gotPacket = 0;
143-
int ret = avcodec_encode_audio2(&avCodecContext, &packet, NULL, &gotPacket);
144-
if(ret != 0 && gotPacket == 0)
125+
const int ret = avcodec_encode_audio2(&avCodecContext, &encodedData, decodedData, &gotPacket);
126+
if(ret != 0)
145127
{
146-
throw std::runtime_error("Encode audio frame error: avcodec encode last audio frame - " +
128+
throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " +
147129
getDescriptionFromErrorCode(ret));
148130
}
149-
return ret == 0 && gotPacket == 1;
150-
131+
return gotPacket == 1;
151132
#else
152-
int ret = avcodec_encode_audio(&avCodecContext, packet.data, packet.size, NULL);
133+
const int ret = avcodec_encode_audio(&avCodecContext, encodedData.data, encodedData.size, decodedData);
153134
if(ret < 0)
154135
{
155-
throw std::runtime_error("Encode audio frame error: avcodec encode last audio frame - " +
136+
throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " +
156137
getDescriptionFromErrorCode(ret));
157138
}
158-
return ret == 0;
159-
139+
return true;
160140
#endif
161141
}
142+
162143
}

src/AvTranscoder/encoder/AudioEncoder.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class AvExport AudioEncoder : public IEncoder
2424
ICodec& getCodec() { return _codec; }
2525
AudioCodec& getAudioCodec() { return _codec; }
2626

27+
private:
28+
bool encode(const AVFrame* decodedData, AVPacket& encodedData);
29+
2730
private:
2831
AudioCodec _codec;
2932
};

src/AvTranscoder/encoder/IEncoder.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,18 @@ class AvExport IEncoder
2323

2424
/**
2525
* @brief Encode a new frame, and get coded frame
26-
* @param sourceFrame frame need to be encoded
27-
* @param codedFrame data of the coded frame if present (first frames can be delayed)
26+
* @param sourceFrame: frame that needs to be encoded
27+
* @param codedFrame: output encoded coded data (first frames can be delayed)
2828
* @return status of encoding
29+
* @throw runtime_error if the encoded process failed.
2930
*/
3031
virtual bool encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) = 0;
3132

3233
/**
33-
* @brief Get delayed encoded frames
34-
* @param codedFrame data of the coded frame if present (first frames can be delayed)
34+
* @brief Get the frames remaining into the encoder
35+
* @param codedFrame: output encoded data
3536
* @return status of encoding
37+
* @throw runtime_error if the encoded process failed.
3638
*/
3739
virtual bool encodeFrame(CodedData& codedFrame) = 0;
3840

src/AvTranscoder/encoder/VideoEncoder.cpp

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ bool VideoEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame)
109109
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
110110

111111
AVPacket& packet = codedFrame.getAVPacket();
112-
packet.stream_index = 0;
113-
114112
if((avCodecContext.coded_frame) && (avCodecContext.coded_frame->pts != (int)AV_NOPTS_VALUE))
115113
{
116114
packet.pts = avCodecContext.coded_frame->pts;
@@ -121,53 +119,38 @@ bool VideoEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame)
121119
packet.flags |= AV_PKT_FLAG_KEY;
122120
}
123121

124-
#if LIBAVCODEC_VERSION_MAJOR > 53
125-
int gotPacket = 0;
126-
int ret = avcodec_encode_video2(&avCodecContext, &packet, &sourceFrame.getAVFrame(), &gotPacket);
127-
if(ret != 0 && gotPacket == 0)
128-
{
129-
throw std::runtime_error("Encode video frame error: avcodec encode video frame - " +
130-
getDescriptionFromErrorCode(ret));
131-
}
132-
#else
133-
int ret = avcodec_encode_video(&avCodecContext, packet.data, packet.size, &sourceFrame.getAVFrame());
134-
if(ret < 0)
135-
{
136-
throw std::runtime_error("Encode video frame error: avcodec encode video frame - " +
137-
getDescriptionFromErrorCode(ret));
138-
}
139-
#endif
140-
141-
#if LIBAVCODEC_VERSION_MAJOR > 53
142-
return ret == 0 && gotPacket == 1;
143-
#endif
144-
return ret == 0;
122+
return encode(&sourceFrame.getAVFrame(), packet);
145123
}
146124

147125
bool VideoEncoder::encodeFrame(CodedData& codedFrame)
148126
{
149-
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
127+
return encode(NULL, codedFrame.getAVPacket());
128+
}
150129

151-
AVPacket& packet = codedFrame.getAVPacket();
152-
packet.stream_index = 0;
130+
bool VideoEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData)
131+
{
132+
// Be sure that data of AVPacket is NULL so that the encoder will allocate it
133+
encodedData.data = NULL;
153134

135+
AVCodecContext& avCodecContext = _codec.getAVCodecContext();
154136
#if LIBAVCODEC_VERSION_MAJOR > 53
155137
int gotPacket = 0;
156-
int ret = avcodec_encode_video2(&avCodecContext, &packet, NULL, &gotPacket);
157-
if(ret != 0 && gotPacket == 0)
138+
const int ret = avcodec_encode_video2(&avCodecContext, &encodedData, decodedData, &gotPacket);
139+
if(ret != 0)
158140
{
159-
throw std::runtime_error("Encode video frame error: avcodec encode last video frame - " +
141+
throw std::runtime_error("Encode video frame error: avcodec encode video frame - " +
160142
getDescriptionFromErrorCode(ret));
161143
}
162-
return ret == 0 && gotPacket == 1;
144+
return gotPacket == 1;
163145
#else
164-
int ret = avcodec_encode_video(&avCodecContext, packet.data, packet.size, NULL);
146+
const int ret = avcodec_encode_video(&avCodecContext, encodedData.data, encodedData.size, decodedData);
165147
if(ret < 0)
166148
{
167-
throw std::runtime_error("Encode video frame error: avcodec encode last video frame - " +
149+
throw std::runtime_error("Encode video frame error: avcodec encode video frame - " +
168150
getDescriptionFromErrorCode(ret));
169151
}
170-
return ret == 0;
152+
return true;
171153
#endif
172154
}
155+
173156
}

src/AvTranscoder/encoder/VideoEncoder.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class AvExport VideoEncoder : public IEncoder
2424
ICodec& getCodec() { return _codec; }
2525
VideoCodec& getVideoCodec() { return _codec; }
2626

27+
private:
28+
bool encode(const AVFrame* decodedData, AVPacket& encodedData);
29+
2730
private:
2831
VideoCodec _codec;
2932
};

0 commit comments

Comments
 (0)