Skip to content
Permalink
Browse files

avcodec/videotoolbox: fix decoding of some hevc videos

See https://s3.amazonaws.com/tmm1/videotoolbox/germany-hevc-zdf.ts

Although videotoolbox_buffer_create() sets frame->hw_frames_ctx,
by the time videotoolbox_postproc_frame() is called, some frames
randomly have frame->hw_frames_ctx == NULL. I don't really
understand what's going on, and why this only affects some frames
and only in some hevc videos.

This patch attempts to detect the missing hw_frames_ctx and reset
it in the post_process callback. This is obviously a huge hack, but
it does fix playback of the affected samples.
  • Loading branch information
tmm1 committed May 4, 2018
1 parent e0734f7 commit 44b16120009050dd0255bbd3f3ecbd7a9b501bbd
Showing with 6 additions and 0 deletions.
  1. +6 −0 libavcodec/videotoolbox.c
@@ -73,6 +73,7 @@ static int videotoolbox_buffer_copy(VTContext *vtctx,

static int videotoolbox_postproc_frame(void *avctx, AVFrame *frame)
{
VTContext *vtctx = ((AVCodecContext *)avctx)->internal->hwaccel_priv_data;
CVPixelBufferRef ref = *(CVPixelBufferRef *)frame->buf[0]->data;

if (!ref) {
@@ -83,6 +84,11 @@ static int videotoolbox_postproc_frame(void *avctx, AVFrame *frame)

frame->data[3] = (uint8_t*)ref;

if (!frame->hw_frames_ctx)
frame->hw_frames_ctx = av_buffer_ref(vtctx->cached_hw_frames_ctx);
if (!frame->hw_frames_ctx)
return AVERROR(ENOMEM);

return 0;
}

0 comments on commit 44b1612

Please sign in to comment.