mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-25 15:45:38 +00:00
VideoFFmpegComponent now prioritizes audio by dropping video frames if the computer can't keep up.
This commit is contained in:
parent
e4ee4855df
commit
3b4bb74ac0
|
@ -239,8 +239,8 @@ void VideoFFmpegComponent::frameProcessing()
|
|||
{
|
||||
mWindow->increaseVideoPlayerCount();
|
||||
|
||||
bool videoFilter;
|
||||
bool audioFilter;
|
||||
bool videoFilter = false;
|
||||
bool audioFilter = false;
|
||||
|
||||
videoFilter = setupVideoFilters();
|
||||
|
||||
|
@ -527,9 +527,22 @@ void VideoFFmpegComponent::readFrames()
|
|||
if (!avcodec_send_packet(mVideoCodecContext, mPacket) &&
|
||||
!avcodec_receive_frame(mVideoCodecContext, mVideoFrame)) {
|
||||
|
||||
int returnValue = 0;
|
||||
|
||||
// We have a video frame that needs conversion to RGBA format.
|
||||
int returnValue = av_buffersrc_add_frame_flags(
|
||||
mVBufferSrcContext, mVideoFrame, AV_BUFFERSRC_FLAG_KEEP_REF);
|
||||
// Prioritize audio by dropping video frames if the audio frame queue
|
||||
// gets too small, i.e. if the computer can't keep up the processing.
|
||||
if ((!mAudioCodecContext || !mDecodedFrame ||
|
||||
mAudioFrameCount < mAudioTargetQueueSize) ||
|
||||
mAudioFrameQueue.size() > 3) {
|
||||
returnValue = av_buffersrc_add_frame_flags(
|
||||
mVBufferSrcContext, mVideoFrame, AV_BUFFERSRC_FLAG_KEEP_REF);
|
||||
}
|
||||
else {
|
||||
LOG(LogDebug)
|
||||
<< "VideoFFmpegComponent::readFrames(): Dropped video frame as "
|
||||
"the audio buffer was too small";
|
||||
}
|
||||
|
||||
if (returnValue < 0) {
|
||||
LOG(LogError) << "VideoFFmpegComponent::readFrames(): "
|
||||
|
|
|
@ -145,14 +145,13 @@ private:
|
|||
// Used for audio and video synchronization.
|
||||
std::chrono::high_resolution_clock::time_point mTimeReference;
|
||||
|
||||
int mAudioFrameCount;
|
||||
int mVideoFrameCount;
|
||||
|
||||
double mAccumulatedTime;
|
||||
bool mStartTimeAccumulation;
|
||||
bool mDecodedFrame;
|
||||
bool mEndOfVideo;
|
||||
|
||||
// These are only used for debugging.
|
||||
int mAudioFrameCount;
|
||||
int mVideoFrameCount;
|
||||
};
|
||||
|
||||
#endif // ES_CORE_COMPONENTS_VIDEO_FFMPEG_COMPONENT_H
|
||||
|
|
Loading…
Reference in a new issue