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:
Kári Tristan Helgason
2017-12-01 13:48:48 +01:00
committed by Commit Bot
parent ba700f642b
commit 86de7e898a

View File

@ -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.