summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/vdpau.c25
-rw-r--r--libavcodec/vdpau_h264.c10
-rw-r--r--libavcodec/vdpau_internal.h2
3 files changed, 25 insertions, 12 deletions
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 581eadae36..0a4b7965f7 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -72,23 +72,36 @@ int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,
return 0;
}
+int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
+ struct vdpau_picture_context *pic_ctx)
+{
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+ VdpVideoSurface surf = ff_vdpau_get_surface_id(frame);
+ VdpStatus status;
+
+ status = hwctx->render(hwctx->decoder, surf, (void *)&pic_ctx->info,
+ pic_ctx->bitstream_buffers_used,
+ pic_ctx->bitstream_buffers);
+
+ av_freep(&pic_ctx->bitstream_buffers);
+ return vdpau_error(status);
+}
+
#if CONFIG_H263_VDPAU_HWACCEL || CONFIG_MPEG1_VDPAU_HWACCEL || \
CONFIG_MPEG2_VDPAU_HWACCEL || CONFIG_MPEG4_VDPAU_HWACCEL || \
CONFIG_VC1_VDPAU_HWACCEL || CONFIG_WMV3_VDPAU_HWACCEL
int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx)
{
- AVVDPAUContext *hwctx = avctx->hwaccel_context;
MpegEncContext *s = avctx->priv_data;
Picture *pic = s->current_picture_ptr;
struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
- VdpVideoSurface surf = ff_vdpau_get_surface_id(pic->f);
+ int val;
- hwctx->render(hwctx->decoder, surf, (void *)&pic_ctx->info,
- pic_ctx->bitstream_buffers_used, pic_ctx->bitstream_buffers);
+ val = ff_vdpau_common_end_frame(avctx, pic->f, pic_ctx);
+ if (val < 0)
+ return val;
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
- av_freep(&pic_ctx->bitstream_buffers);
-
return 0;
}
#endif
diff --git a/libavcodec/vdpau_h264.c b/libavcodec/vdpau_h264.c
index 32e9c28706..838a6700ff 100644
--- a/libavcodec/vdpau_h264.c
+++ b/libavcodec/vdpau_h264.c
@@ -189,18 +189,16 @@ static int vdpau_h264_decode_slice(AVCodecContext *avctx,
static int vdpau_h264_end_frame(AVCodecContext *avctx)
{
- AVVDPAUContext *hwctx = avctx->hwaccel_context;
H264Context *h = avctx->priv_data;
H264Picture *pic = h->cur_pic_ptr;
struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
- VdpVideoSurface surf = ff_vdpau_get_surface_id(&pic->f);
+ int val;
- hwctx->render(hwctx->decoder, surf, (void *)&pic_ctx->info,
- pic_ctx->bitstream_buffers_used, pic_ctx->bitstream_buffers);
+ val = ff_vdpau_common_end_frame(avctx, &pic->f, pic_ctx);
+ if (val < 0)
+ return val;
ff_h264_draw_horiz_band(h, 0, h->avctx->height);
- av_freep(&pic_ctx->bitstream_buffers);
-
return 0;
}
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index 2443e0a911..3f55ee7dc9 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -72,6 +72,8 @@ struct vdpau_picture_context {
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic,
const uint8_t *buffer, uint32_t size);
+int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
+ struct vdpau_picture_context *pic);
int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx);
int ff_vdpau_add_buffer(struct vdpau_picture_context *pic, const uint8_t *buf,
uint32_t buf_size);