Skip to content

Commit

Permalink
avcodec/videotoolbox: fix decoding of some hevc videos
Browse files Browse the repository at this point in the history
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 44b1612
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions libavcodec/videotoolbox.c
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down

0 comments on commit 44b1612

Please sign in to comment.