summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog1
-rw-r--r--doc/APIchanges3
-rw-r--r--libavcodec/vdpau.c49
-rw-r--r--libavcodec/vdpau.h69
-rw-r--r--libavcodec/vdpau_internal.h14
-rw-r--r--libavcodec/version.h2
6 files changed, 131 insertions, 7 deletions
diff --git a/Changelog b/Changelog
index b12a8e4584..62d63026d6 100644
--- a/Changelog
+++ b/Changelog
@@ -2,6 +2,7 @@ Entries are sorted chronologically from oldest to youngest within each release,
releases are sorted from youngest to oldest.
version <next>:
+- VDPAU hardware acceleration through normal hwaccel
version 1.1:
diff --git a/doc/APIchanges b/doc/APIchanges
index 95c06749a3..99b1c92983 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -132,6 +132,9 @@ API changes, most recent first:
2012-03-26 - a67d9cf - lavfi 2.66.100
Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
+2013-01-13 - xxxxxxx - lavc 54.36.0 - vdpau.h
+ Add AVVDPAUContext struct for VDPAU hardware-accelerated decoding.
+
2013-01-12 - 169fb94 - lavu 52.4.0 - pixdesc.h
Add AV_PIX_FMT_VDPAU flag.
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 6ac195ec00..20ce97b5fe 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -38,6 +38,55 @@
* @{
*/
+int ff_vdpau_common_start_frame(AVCodecContext *avctx,
+ av_unused const uint8_t *buffer,
+ av_unused uint32_t size)
+{
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+
+ hwctx->bitstream_buffers_used = 0;
+ return 0;
+}
+
+int ff_vdpau_common_end_frame(AVCodecContext *avctx)
+{
+ MpegEncContext * const s = avctx->priv_data;
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+
+ if (hwctx->bitstream_buffers_used) {
+ VdpVideoSurface surf = ff_vdpau_get_surface_id(s->current_picture_ptr);
+
+ hwctx->render(hwctx->decoder, surf, (void *)&hwctx->info,
+ hwctx->bitstream_buffers_used, hwctx->bitstream_buffers);
+
+ ff_draw_horiz_band(s, 0, s->avctx->height);
+ hwctx->bitstream_buffers_used = 0;
+ }
+ return 0;
+}
+
+int ff_vdpau_add_buffer(AVCodecContext *avctx,
+ const uint8_t *buf, uint32_t size)
+{
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+ VdpBitstreamBuffer *buffers = hwctx->bitstream_buffers;
+
+ buffers = av_fast_realloc(buffers, &hwctx->bitstream_buffers_allocated,
+ (hwctx->bitstream_buffers_used + 1) * sizeof(*buffers));
+ if (!buffers)
+ return AVERROR(ENOMEM);
+
+ hwctx->bitstream_buffers = buffers;
+ buffers += hwctx->bitstream_buffers_used++;
+
+ buffers->struct_version = VDP_BITSTREAM_BUFFER_VERSION;
+ buffers->bitstream = buf;
+ buffers->bitstream_bytes = size;
+ return 0;
+}
+
+/* Obsolete non-hwaccel VDPAU support below... */
+
void ff_vdpau_h264_set_reference_frames(MpegEncContext *s)
{
H264Context *h = s->avctx->priv_data;
diff --git a/libavcodec/vdpau.h b/libavcodec/vdpau.h
index 23394b57a3..7933a79172 100644
--- a/libavcodec/vdpau.h
+++ b/libavcodec/vdpau.h
@@ -52,6 +52,68 @@
#include <vdpau/vdpau.h>
#include <vdpau/vdpau_x11.h>
+union VdpPictureInfo {
+ VdpPictureInfoH264 h264;
+ VdpPictureInfoMPEG1Or2 mpeg;
+ VdpPictureInfoVC1 vc1;
+ VdpPictureInfoMPEG4Part2 mpeg4;
+};
+
+/**
+ * This structure is used to share data between the libavcodec library and
+ * the client video application.
+ * The user shall zero-allocate the structure and make it available as
+ * AVCodecContext.hwaccel_context. Members can be set by the user once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ */
+typedef struct AVVDPAUContext {
+ /**
+ * VDPAU decoder handle
+ *
+ * Set by user.
+ */
+ VdpDecoder decoder;
+
+ /**
+ * VDPAU decoder render callback
+ *
+ * Set by the user.
+ */
+ VdpDecoderRender *render;
+
+ /**
+ * VDPAU picture information
+ *
+ * Set by libavcodec.
+ */
+ union VdpPictureInfo info;
+
+ /**
+ * Allocated size of the bitstream_buffers table.
+ *
+ * Set by libavcodec.
+ */
+ int bitstream_buffers_allocated;
+
+ /**
+ * Useful bitstream buffers in the bitstream buffers table.
+ *
+ * Set by libavcodec.
+ */
+ int bitstream_buffers_used;
+
+ /**
+ * Table of bitstream buffers.
+ * The user is responsible for freeing this buffer using av_freep().
+ *
+ * Set by libavcodec.
+ */
+ VdpBitstreamBuffer *bitstream_buffers;
+} AVVDPAUContext;
+
+
/** @brief The videoSurface is used for rendering. */
#define FF_VDPAU_STATE_USED_FOR_RENDER 1
@@ -81,12 +143,7 @@ struct vdpau_render_state {
VdpBitstreamBuffer *bitstream_buffers;
/** picture parameter information for all supported codecs */
- union VdpPictureInfo {
- VdpPictureInfoH264 h264;
- VdpPictureInfoMPEG1Or2 mpeg;
- VdpPictureInfoVC1 vc1;
- VdpPictureInfoMPEG4Part2 mpeg4;
- } info;
+ union VdpPictureInfo info;
};
/* @}*/
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index 0a8d0b6b55..f50ae77016 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -27,6 +27,20 @@
#include <stdint.h>
#include "mpegvideo.h"
+/** Extract VdpVideoSurface from a Picture */
+static inline uintptr_t ff_vdpau_get_surface_id(Picture *pic)
+{
+ return (uintptr_t)pic->f.data[3];
+}
+
+int ff_vdpau_common_start_frame(AVCodecContext *avctx,
+ av_unused const uint8_t *buffer,
+ av_unused uint32_t size);
+int ff_vdpau_common_end_frame(AVCodecContext *avctx);
+int ff_vdpau_add_buffer(AVCodecContext *avctx,
+ const uint8_t *buf, uint32_t buf_size);
+
+
void ff_vdpau_add_data_chunk(MpegEncContext *s, const uint8_t *buf,
int buf_size);
diff --git a/libavcodec/version.h b/libavcodec/version.h
index f9d87f40b1..f8b474d68d 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
#include "libavutil/avutil.h"
#define LIBAVCODEC_VERSION_MAJOR 54
-#define LIBAVCODEC_VERSION_MINOR 86
+#define LIBAVCODEC_VERSION_MINOR 87
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \