mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-27 13:10:37 +00:00
vdpau: don't assume Picture and H264Picture are the same
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). Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
82bb304801
commit
7948a51b5c
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user