• Aman Gupta's avatar
    avcodec/videotoolbox: fix decoding of some HEVC videos · 8f146b52
    Aman Gupta authored
    In a normal hwaccel, the AVHWFramesContext sets AVFrame.hw_frames_ctx
    when it initializes a new AVFrame in av_hwframe_get_buffer().
    
    But the VT hwaccel doesn't know what hw_frames_ctx to assign when
    the AVFrame is first created, because it depends on the format of
    the pixbuf that the decoder eventually decides to return. Thus
    newly created AVFrames always have a NULL hw_frames_ctx, and the
    hwaccel would only assign the ctx once a frame was done decoding.
    This worked fine with the H264 decoder, but with the HEVC decoder
    the frame's data may be moved to another empty AVFrame. Since the
    empty AVFrame never had hw_frames_ctx set, a frame with a NULL
    ctx could be returned to the API user.
    
    This patch works around the issue by moving the derived
    hw_frames_ctx from the AVFrame to a new VTHWFrame which now holds
    both the CVPixelBufferRef and the AVBuffer. The hw_frames_ctx
    is only copied to the AVFrame right before it is about to be
    returned to the user in videotoolbox_postproc_frame() (since
    in the case of VT, the hw_frames_ctx is only there for the API
    user anyway).
    
    Fixes playback on macOS and iOS of some hevc videos like
    https://s3.amazonaws.com/tmm1/videotoolbox/germany-hevc-zdf.tsSigned-off-by: 's avatarAman Gupta <aman@tmm1.net>
    8f146b52
videotoolbox.c 40.8 KB