Based on the code by Rémi Denis-Courmont <[email protected]> from VLC.
---
doc/APIchanges | 3 +++
libavcodec/vdpau.c | 43 +++++++++++++++++++++++++++++++++++++++++++
libavcodec/vdpau.h | 14 ++++++++++++++
3 files changed, 60 insertions(+)
diff --git a/doc/APIchanges b/doc/APIchanges
index 519709e..6d0a164 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil: 2012-10-22
API changes, most recent first:
+2013-11-xx - xxxxxxx - lavc 55.25.0 - vdpau.h
+ Add av_vdpau_get_profile().
+
2013-11-xx - xxxxxxx - lavc 55.25.0 - avcodec.h
Add ITU-R BT.2020 and other not yet included values to color primaries,
transfer characteristics and colorspaces.
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 9bcbc2e..cc0bcff 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -90,4 +90,47 @@ int ff_vdpau_add_buffer(Picture *pic, const uint8_t *buf,
uint32_t size)
return 0;
}
+int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile)
+{
+#define PROFILE(prof) \
+do { \
+ *profile = prof; \
+ return 0; \
+} while (0)
+
+ switch (avctx->codec_id) {
+ case AV_CODEC_ID_MPEG1VIDEO:
PROFILE(VDP_DECODER_PROFILE_MPEG1);
+ case AV_CODEC_ID_MPEG2VIDEO:
+ switch (avctx->profile) {
+ case FF_PROFILE_MPEG2_MAIN:
PROFILE(VDP_DECODER_PROFILE_MPEG2_MAIN);
+ case FF_PROFILE_MPEG2_SIMPLE:
PROFILE(VDP_DECODER_PROFILE_MPEG2_SIMPLE);
+ default: return AVERROR(EINVAL);
+ }
+ case AV_CODEC_ID_H263:
PROFILE(VDP_DECODER_PROFILE_MPEG4_PART2_ASP);
+ case AV_CODEC_ID_MPEG4:
+ switch (avctx->profile) {
+ case FF_PROFILE_MPEG4_SIMPLE:
PROFILE(VDP_DECODER_PROFILE_MPEG4_PART2_SP);
+ case FF_PROFILE_MPEG4_ADVANCED_SIMPLE:
PROFILE(VDP_DECODER_PROFILE_MPEG4_PART2_ASP);
+ default: return AVERROR(EINVAL);
+ }
+ case AV_CODEC_ID_H264:
+ switch (avctx->profile) {
+ case FF_PROFILE_H264_CONSTRAINED_BASELINE:
+ case FF_PROFILE_H264_BASELINE:
PROFILE(VDP_DECODER_PROFILE_H264_BASELINE);
+ case FF_PROFILE_H264_MAIN:
PROFILE(VDP_DECODER_PROFILE_H264_MAIN);
+ case FF_PROFILE_H264_HIGH:
PROFILE(VDP_DECODER_PROFILE_H264_HIGH);
+ default: return AVERROR(EINVAL);
+ }
+ case AV_CODEC_ID_WMV3:
+ case AV_CODEC_ID_VC1:
+ switch (avctx->profile) {
+ case FF_PROFILE_VC1_SIMPLE:
PROFILE(VDP_DECODER_PROFILE_VC1_SIMPLE);
+ case FF_PROFILE_VC1_MAIN:
PROFILE(VDP_DECODER_PROFILE_VC1_MAIN);
+ case FF_PROFILE_VC1_ADVANCED:
PROFILE(VDP_DECODER_PROFILE_VC1_ADVANCED);
+ default: return AVERROR(EINVAL);
+ }
+ }
+ return AVERROR(EINVAL);
+}
+
/* @}*/
diff --git a/libavcodec/vdpau.h b/libavcodec/vdpau.h
index 4035f63..bf8c8e8 100644
--- a/libavcodec/vdpau.h
+++ b/libavcodec/vdpau.h
@@ -54,6 +54,7 @@
#include "libavutil/attributes.h"
+#include "avcodec.h"
#include "version.h"
#if FF_API_BUFS_VDPAU
@@ -125,6 +126,19 @@ typedef struct AVVDPAUContext {
#endif
} AVVDPAUContext;
+/**
+ * Get a decoder profile that should be used for initializing a VDPAU decoder.
+ * Should be called from the AVCodecContext.get_format() callback.
+ *
+ * @param avctx the codec context being used for decoding the stream
+ * @param profile a pointer into which the result will be written on success.
+ * The contents of profile are undefined if this function
returns
+ * an error.
+ *
+ * @return 0 on success (non-negative), a negative AVERROR on failure.
+ */
+int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile);
+
#if FF_API_CAP_VDPAU
/** @brief The videoSurface is used for rendering. */
#define FF_VDPAU_STATE_USED_FOR_RENDER 1
--
1.7.10.4
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel