Add a way for RTCVideoDecoderH264 to signal decode errors.
This means we will properly request a new keyframe if decoding fails. Bug: webrtc:8600 Change-Id: Id213686f016c5418bf04b2ee68bd19dbbe1ea954 Reviewed-on: https://webrtc-review.googlesource.com/28101 Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Commit-Queue: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21036}
This commit is contained in:
committed by
Commit Bot
parent
ba700f642b
commit
86de7e898a
@ -36,9 +36,13 @@ struct RTCFrameDecodeParams {
|
||||
int64_t timestamp;
|
||||
};
|
||||
|
||||
@interface RTCVideoDecoderH264 ()
|
||||
- (void)setError:(OSStatus)error;
|
||||
@end
|
||||
|
||||
// This is the callback function that VideoToolbox calls when decode is
|
||||
// complete.
|
||||
void decompressionOutputCallback(void *decoder,
|
||||
void decompressionOutputCallback(void *decoderRef,
|
||||
void *params,
|
||||
OSStatus status,
|
||||
VTDecodeInfoFlags infoFlags,
|
||||
@ -48,6 +52,8 @@ void decompressionOutputCallback(void *decoder,
|
||||
std::unique_ptr<RTCFrameDecodeParams> decodeParams(
|
||||
reinterpret_cast<RTCFrameDecodeParams *>(params));
|
||||
if (status != noErr) {
|
||||
RTCVideoDecoderH264 *decoder = (__bridge RTCVideoDecoderH264 *)decoderRef;
|
||||
[decoder setError:status];
|
||||
RTC_LOG(LS_ERROR) << "Failed to decode frame. Status: " << status;
|
||||
return;
|
||||
}
|
||||
@ -66,12 +72,14 @@ void decompressionOutputCallback(void *decoder,
|
||||
CMVideoFormatDescriptionRef _videoFormat;
|
||||
VTDecompressionSessionRef _decompressionSession;
|
||||
RTCVideoDecoderCallback _callback;
|
||||
OSStatus _error;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
#if defined(WEBRTC_IOS)
|
||||
[RTCUIApplicationStatusObserver prepareForUse];
|
||||
_error = noErr;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -95,6 +103,12 @@ void decompressionOutputCallback(void *decoder,
|
||||
renderTimeMs:(int64_t)renderTimeMs {
|
||||
RTC_DCHECK(inputImage.buffer);
|
||||
|
||||
if (_error != noErr) {
|
||||
RTC_LOG(LS_WARNING) << "Last frame decode failed.";
|
||||
_error = noErr;
|
||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||
}
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
if (![[RTCUIApplicationStatusObserver sharedInstance] isApplicationActive]) {
|
||||
// Ignore all decode requests when app isn't active. In this state, the
|
||||
@ -163,6 +177,10 @@ void decompressionOutputCallback(void *decoder,
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
- (void)setError:(OSStatus)error {
|
||||
_error = error;
|
||||
}
|
||||
|
||||
- (NSInteger)releaseDecoder {
|
||||
// Need to invalidate the session so that callbacks no longer occur and it
|
||||
// is safe to null out the callback.
|
||||
|
||||
Reference in New Issue
Block a user