From 4fd24838faa385e3d963d834ebee4b110543e5c8 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Mon, 7 Feb 2022 19:37:06 -0800 Subject: [PATCH] FFmpeg Input: Fix format changes Format changes should only occur on whole packet intervals. Signed-off-by: Christopher Snowhill --- Plugins/FFMPEG/FFMPEGDecoder.m | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Plugins/FFMPEG/FFMPEGDecoder.m b/Plugins/FFMPEG/FFMPEGDecoder.m index 0914c1f68..b23e67a79 100644 --- a/Plugins/FFMPEG/FFMPEGDecoder.m +++ b/Plugins/FFMPEG/FFMPEGDecoder.m @@ -553,6 +553,24 @@ int64_t ffmpeg_seek(void *opaque, int64_t offset, int whence) { seekBytesSkip -= minSkipped; } + int _channels = codecCtx->channels; + uint32_t _channelConfig = (uint32_t)codecCtx->channel_layout; + float _frequency = codecCtx->sample_rate; + + if(_channels != channels || + _channelConfig != channelConfig || + _frequency != frequency) { + if(bytesRead > 0) { + break; + } else { + channels = _channels; + channelConfig = _channelConfig; + frequency = _frequency; + [self willChangeValueForKey:@"properties"]; + [self didChangeValueForKey:@"properties"]; + } + } + int toConsume = FFMIN((dataSize - bytesConsumedFromDecodedFrame), (bytesToRead - bytesRead)); // copy decoded samples to Cog's buffer @@ -575,20 +593,6 @@ int64_t ffmpeg_seek(void *opaque, int64_t offset, int whence) { bytesRead += toConsume; } - int _channels = codecCtx->channels; - uint32_t _channelConfig = (uint32_t)codecCtx->channel_layout; - float _frequency = codecCtx->sample_rate; - - if(_channels != channels || - _channelConfig != channelConfig || - _frequency != frequency) { - channels = _channels; - channelConfig = _channelConfig; - frequency = _frequency; - [self willChangeValueForKey:@"properties"]; - [self didChangeValueForKey:@"properties"]; - } - int framesReadNow = bytesRead / frameSize; if(totalFrames && (framesRead + framesReadNow > totalFrames)) framesReadNow = (int)(totalFrames - framesRead);