Browse Source

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>
tags/n2.3
wm4 Anton Khirnov 11 years ago
parent
commit
7948a51b5c
6 changed files with 15 additions and 16 deletions
  1. +3
    -5
      libavcodec/vdpau.c
  2. +3
    -3
      libavcodec/vdpau_h264.c
  3. +3
    -2
      libavcodec/vdpau_internal.h
  4. +2
    -2
      libavcodec/vdpau_mpeg12.c
  5. +2
    -2
      libavcodec/vdpau_mpeg4.c
  6. +2
    -2
      libavcodec/vdpau_vc1.c

+ 3
- 5
libavcodec/vdpau.c View File

@@ -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,


+ 3
- 3
libavcodec/vdpau_h264.c View File

@@ -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;



+ 3
- 2
libavcodec/vdpau_internal.h View File

@@ -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 */

+ 2
- 2
libavcodec/vdpau_mpeg12.c View File

@@ -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;



+ 2
- 2
libavcodec/vdpau_mpeg4.c View File

@@ -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,


+ 2
- 2
libavcodec/vdpau_vc1.c View File

@@ -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…
Cancel
Save