At least the new videotoolbox decoder does not actually set a frame if end_frame fails. This causes the API to return success and signals that a picture was decoded, even though AVFrame->data[0] is NULL.
Fix this by propagating end_frame errors. --- Untested. I'm hoping that the errors will be propagated down to the decode API call correctly. --- libavcodec/h264_picture.c | 3 ++- libavcodec/hevc.c | 5 ++++- libavcodec/mpeg12dec.c | 9 +++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index 81d90d7..04bbf02 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -172,7 +172,8 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup) } if (avctx->hwaccel) { - if (avctx->hwaccel->end_frame(avctx) < 0) + err = avctx->hwaccel->end_frame(avctx); + if (err < 0) av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); } diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index 7f79189..d8da18d 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -2896,9 +2896,12 @@ static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, return ret; if (avctx->hwaccel) { - if (s->ref && avctx->hwaccel->end_frame(avctx) < 0) + if (s->ref && (ret = avctx->hwaccel->end_frame(avctx)) < 0) { av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); + ff_hevc_unref_frame(s, s->ref, ~0); + return ret; + } } else { /* verify the SEI checksum */ if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded && diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 1250d53..453cd6a 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1723,9 +1723,11 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) if (s->avctx->hwaccel && (s->avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) { - if (s->avctx->hwaccel->end_frame(s->avctx) < 0) + if ((ret = s->avctx->hwaccel->end_frame(s->avctx)) < 0) { av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode first field\n"); + return ret; + } } for (i = 0; i < 4; i++) { @@ -2082,9 +2084,12 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) return 0; if (s->avctx->hwaccel) { - if (s->avctx->hwaccel->end_frame(s->avctx) < 0) + int ret = s->avctx->hwaccel->end_frame(s->avctx); + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); + return ret; + } } /* end of slice reached */ -- 2.5.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel