On Wed, Dec 10, 2014 at 2:20 PM, Rémi Denis-Courmont <[email protected]> wrote: > Since the VDPAU pixel format does not distinguish between different > VDPAU video surface chroma types, we need another way to pass this > data to the application. > > Originally VDPAU in libavcodec only supported decoding to 8-bits YUV > with 4:2:0 chroma sampling. Correspondingly, applications assumed that > libavcodec expected VDP_CHROMA_TYPE_420 video surfaces for output. > However some of the new HEVC profiles proposed for addition to VDPAU > would require different depth and/or sampling: > http://lists.freedesktop.org/archives/vdpau/2014-July/000167.html > ...as would loess AVC profiles:
nit: typo > http://lists.freedesktop.org/archives/vdpau/2014-November/000241.html > > To preserve backward binary compatibility with existing applications, > a new av_vdpau_bind_context() flag is introduced in a further change. > --- > doc/APIchanges | 3 +++ > libavcodec/vdpau.c | 25 +++++++++++++++++++++---- > libavcodec/vdpau.h | 20 ++++++++++++++++++++ > libavcodec/version.h | 2 +- > 4 files changed, 45 insertions(+), 5 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 3d1b72f..066779a 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -13,6 +13,9 @@ libavutil: 2014-08-09 > > API changes, most recent first: > > +201x-xx-xx - xxxxxxx - lavc 56.7.0 - vdpau.h > + Add av_vdpau_get_surface_parameters(). > + > 2014-11-xx - xxxxxxx - lavf 56.06.3 - avformat.h > Add AVFormatContext.avoid_negative_ts. > > diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c > index ccb3352..edf09f1 100644 > --- a/libavcodec/vdpau.c > +++ b/libavcodec/vdpau.c > @@ -64,6 +64,21 @@ static int vdpau_error(VdpStatus status) > } > } > > +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType > *type, > + uint32_t *width, uint32_t *height) > +{ > + /* XXX: only 8-bits YCbCr 4:2:0 is supported yet */ > + if (type) > + *type = VDP_CHROMA_TYPE_420; > + /* See <vdpau/vdpau.h> for per-type alignment constraints. */ > + if (width) > + *width = (avctx->coded_width + 1) & ~1; > + if (height) > + *height = (avctx->coded_height + 3) & ~3; > + > + return 0; > +} this function seems to never fail, maybe it's fine to make it void? > + > int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, > int level) > { > @@ -76,9 +91,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, > VdpDecoderProfile profile, > VdpStatus status; > VdpBool supported; > uint32_t max_level, max_mb, max_width, max_height; > - /* See vdpau/vdpau.h for alignment constraints. */ > - uint32_t width = (avctx->coded_width + 1) & ~1; > - uint32_t height = (avctx->coded_height + 3) & ~3; > + VdpChromaType type; > + uint32_t width; > + uint32_t height; > > vdctx->width = UINT32_MAX; > vdctx->height = UINT32_MAX; > @@ -107,7 +122,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, > VdpDecoderProfile profile, > else > surface_query_caps = func; > > - status = surface_query_caps(vdctx->device, VDP_CHROMA_TYPE_420, > &supported, > + av_vdpau_get_surface_parameters(avctx, &type, &width, &height); > + > + status = surface_query_caps(vdctx->device, type, &supported, > &max_width, &max_height); > if (status != VDP_STATUS_OK) > return vdpau_error(status); > diff --git a/libavcodec/vdpau.h b/libavcodec/vdpau.h > index 24c3b02..4244d15 100644 > --- a/libavcodec/vdpau.h > +++ b/libavcodec/vdpau.h > @@ -151,6 +151,26 @@ int av_vdpau_bind_context(AVCodecContext *avctx, > VdpDevice device, > VdpGetProcAddress *get_proc_address, unsigned > flags); > > /** > + * Gets the parameters to create an adequate VDPAU video surface for the > codec > + * context using VDPAU hardware decoding acceleration. > + * > + * @note Behavior is undefined if the context was not succesfully bound to a nit typo > + * VDPAU device using av_vdpau_bind_context(). > + * > + * @param avctx the codec context being used for decoding the stream > + * @param type storage space for the VDPAU video surface chroma type > + * (or NULL to ignore) > + * @param width storage space for the VDPAU video surface pixel width > + * (or NULL to ignore) > + * @param height storage space for the VDPAU video surface pixel height > + * (or NULL to ignore) > + * > + * @return 0 on success, a negative AVERROR code on failure. > + */ > +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType > *type, > + uint32_t *width, uint32_t *height); > + > +/** > * Allocate an AVVDPAUContext. > * > * @return Newly-allocated AVVDPAUContext or NULL on failure. > diff --git a/libavcodec/version.h b/libavcodec/version.h > index fd774a7..f51c9d7 100644 > --- a/libavcodec/version.h > +++ b/libavcodec/version.h > @@ -29,7 +29,7 @@ > #include "libavutil/version.h" > > #define LIBAVCODEC_VERSION_MAJOR 56 > -#define LIBAVCODEC_VERSION_MINOR 6 > +#define LIBAVCODEC_VERSION_MINOR 7 > #define LIBAVCODEC_VERSION_MICRO 0 > > #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ overall seems good, thanks -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
