The code passed H264Picture* and Picture*, and assumed the hwaccel_picture_private field was in the same place in both structs. Somehow this happened to work in Libav, but broke in FFmpeg (and probably subtly breaks in Libav too). --- libavcodec/vdpau.c | 8 +++----- libavcodec/vdpau_h264.c | 6 +++--- libavcodec/vdpau_internal.h | 5 +++-- libavcodec/vdpau_mpeg12.c | 4 ++-- libavcodec/vdpau_mpeg4.c | 4 ++-- libavcodec/vdpau_vc1.c | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c index 50a57d0..5d83b44 100644 --- a/libavcodec/vdpau.c +++ b/libavcodec/vdpau.c @@ -38,12 +38,10 @@ * @{ */ -int ff_vdpau_common_start_frame(Picture *pic, +int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx, av_unused const uint8_t *buffer, av_unused uint32_t size) { - struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; - pic_ctx->bitstream_buffers_allocated = 0; pic_ctx->bitstream_buffers_used = 0; pic_ctx->bitstream_buffers = NULL; @@ -71,9 +69,9 @@ int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx) } #endif -int ff_vdpau_add_buffer(Picture *pic, const uint8_t *buf, uint32_t size) +int ff_vdpau_add_buffer(struct vdpau_picture_context *pic_ctx, + const uint8_t *buf, uint32_t size) { - struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; VdpBitstreamBuffer *buffers = pic_ctx->bitstream_buffers; buffers = av_fast_realloc(buffers, &pic_ctx->bitstream_buffers_allocated, diff --git a/libavcodec/vdpau_h264.c b/libavcodec/vdpau_h264.c index fd1c6e8..c71d6b8 100644 --- a/libavcodec/vdpau_h264.c +++ b/libavcodec/vdpau_h264.c @@ -162,7 +162,7 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx, vdpau_h264_set_reference_frames(avctx); - return ff_vdpau_common_start_frame(pic, buffer, size); + return ff_vdpau_common_start_frame(pic_ctx, buffer, size); } static const uint8_t start_code_prefix[3] = { 0x00, 0x00, 0x01 }; @@ -175,11 +175,11 @@ static int vdpau_h264_decode_slice(AVCodecContext *avctx, struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; int val; - val = ff_vdpau_add_buffer(pic, start_code_prefix, 3); + val = ff_vdpau_add_buffer(pic_ctx, start_code_prefix, 3); if (val) return val; - val = ff_vdpau_add_buffer(pic, buffer, size); + val = ff_vdpau_add_buffer(pic_ctx, buffer, size); if (val) return val; diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h index 50c4f5e..94c81ff 100644 --- a/libavcodec/vdpau_internal.h +++ b/libavcodec/vdpau_internal.h @@ -70,9 +70,10 @@ struct vdpau_picture_context { VdpBitstreamBuffer *bitstream_buffers; }; -int ff_vdpau_common_start_frame(Picture *pic, +int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic, const uint8_t *buffer, uint32_t size); int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx); -int ff_vdpau_add_buffer(Picture *pic, const uint8_t *buf, uint32_t buf_size); +int ff_vdpau_add_buffer(struct vdpau_picture_context *pic, const uint8_t *buf, + uint32_t buf_size); #endif /* AVCODEC_VDPAU_INTERNAL_H */ diff --git a/libavcodec/vdpau_mpeg12.c b/libavcodec/vdpau_mpeg12.c index 426d580..e62901a 100644 --- a/libavcodec/vdpau_mpeg12.c +++ b/libavcodec/vdpau_mpeg12.c @@ -75,7 +75,7 @@ static int vdpau_mpeg_start_frame(AVCodecContext *avctx, info->non_intra_quantizer_matrix[i] = s->inter_matrix[i]; } - return ff_vdpau_common_start_frame(pic, buffer, size); + return ff_vdpau_common_start_frame(pic_ctx, buffer, size); } static int vdpau_mpeg_decode_slice(AVCodecContext *avctx, @@ -86,7 +86,7 @@ static int vdpau_mpeg_decode_slice(AVCodecContext *avctx, struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; int val; - val = ff_vdpau_add_buffer(pic, buffer, size); + val = ff_vdpau_add_buffer(pic_ctx, buffer, size); if (val < 0) return val; diff --git a/libavcodec/vdpau_mpeg4.c b/libavcodec/vdpau_mpeg4.c index 17205fe..f328e48 100644 --- a/libavcodec/vdpau_mpeg4.c +++ b/libavcodec/vdpau_mpeg4.c @@ -77,8 +77,8 @@ static int vdpau_mpeg4_start_frame(AVCodecContext *avctx, info->non_intra_quantizer_matrix[i] = s->inter_matrix[i]; } - ff_vdpau_common_start_frame(pic, buffer, size); - return ff_vdpau_add_buffer(pic, buffer, size); + ff_vdpau_common_start_frame(pic_ctx, buffer, size); + return ff_vdpau_add_buffer(pic_ctx, buffer, size); } static int vdpau_mpeg4_decode_slice(av_unused AVCodecContext *avctx, diff --git a/libavcodec/vdpau_vc1.c b/libavcodec/vdpau_vc1.c index b401352..01ad0ae 100644 --- a/libavcodec/vdpau_vc1.c +++ b/libavcodec/vdpau_vc1.c @@ -89,7 +89,7 @@ static int vdpau_vc1_start_frame(AVCodecContext *avctx, info->deblockEnable = v->postprocflag & 1; info->pquant = v->pq; - return ff_vdpau_common_start_frame(pic, buffer, size); + return ff_vdpau_common_start_frame(pic_ctx, buffer, size); } static int vdpau_vc1_decode_slice(AVCodecContext *avctx, @@ -101,7 +101,7 @@ static int vdpau_vc1_decode_slice(AVCodecContext *avctx, struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; int val; - val = ff_vdpau_add_buffer(pic, buffer, size); + val = ff_vdpau_add_buffer(pic_ctx, buffer, size); if (val < 0) return val; -- 1.9.0 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel