1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Merge commit 'c220a60f92dde9c7c118fc4deddff5c1f617cda9'

* commit 'c220a60f92dde9c7c118fc4deddff5c1f617cda9':
  vdpau: add helper for surface chroma type and size

Conflicts:
	libavcodec/vdpau.c
	libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-12-27 13:06:25 +01:00
commit d7aaeea540
4 changed files with 71 additions and 5 deletions

View File

@ -15,6 +15,9 @@ libavutil: 2014-08-09
API changes, most recent first: API changes, most recent first:
201x-xx-xx - xxxxxxx - lavc 56.10.0 - vdpau.h
Add av_vdpau_get_surface_parameters().
201x-xx-xx - xxxxxxx - lavc 56.9.0 - avcodec.h 201x-xx-xx - xxxxxxx - lavc 56.9.0 - avcodec.h
Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context(). Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context().

View File

@ -71,6 +71,46 @@ AVVDPAUContext *av_alloc_vdpaucontext(void)
MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2) MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2)
int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
VdpChromaType *type,
uint32_t *width, uint32_t *height)
{
VdpChromaType t;
uint32_t w = avctx->coded_width;
uint32_t h = avctx->coded_height;
/* See <vdpau/vdpau.h> for per-type alignment constraints. */
switch (avctx->sw_pix_fmt) {
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
t = VDP_CHROMA_TYPE_420;
w = (w + 1) & ~1;
h = (h + 3) & ~3;
break;
case AV_PIX_FMT_YUV422P:
case AV_PIX_FMT_YUVJ422P:
t = VDP_CHROMA_TYPE_422;
w = (w + 1) & ~1;
h = (h + 1) & ~1;
break;
case AV_PIX_FMT_YUV444P:
case AV_PIX_FMT_YUVJ444P:
t = VDP_CHROMA_TYPE_444;
h = (h + 1) & ~1;
break;
default:
return AVERROR(ENOSYS);
}
if (type)
*type = t;
if (width)
*width = w;
if (height)
*height = h;
return 0;
}
int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
int level) int level)
{ {
@ -83,9 +123,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
VdpStatus status; VdpStatus status;
VdpBool supported; VdpBool supported;
uint32_t max_level, max_mb, max_width, max_height; uint32_t max_level, max_mb, max_width, max_height;
/* See vdpau/vdpau.h for alignment constraints. */ VdpChromaType type;
uint32_t width = (avctx->coded_width + 1) & ~1; uint32_t width;
uint32_t height = (avctx->coded_height + 3) & ~3; uint32_t height;
vdctx->width = UINT32_MAX; vdctx->width = UINT32_MAX;
vdctx->height = UINT32_MAX; vdctx->height = UINT32_MAX;
@ -112,6 +152,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
else if (level < 0) else if (level < 0)
return AVERROR(ENOTSUP); return AVERROR(ENOTSUP);
if (av_vdpau_get_surface_parameters(avctx, &type, &width, &height))
return AVERROR(ENOSYS);
status = vdctx->get_proc_address(vdctx->device, status = vdctx->get_proc_address(vdctx->device,
VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES, VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES,
&func); &func);
@ -120,7 +163,7 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
else else
surface_query_caps = func; surface_query_caps = func;
status = surface_query_caps(vdctx->device, VDP_CHROMA_TYPE_420, &supported, status = surface_query_caps(vdctx->device, type, &supported,
&max_width, &max_height); &max_width, &max_height);
if (status != VDP_STATUS_OK) if (status != VDP_STATUS_OK)
return vdpau_error(status); return vdpau_error(status);

View File

@ -169,6 +169,26 @@ void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2);
int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
VdpGetProcAddress *get_proc_address, unsigned flags); 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 successfully bound to a
* 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. * Allocate an AVVDPAUContext.
* *

View File

@ -29,7 +29,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56 #define LIBAVCODEC_VERSION_MAJOR 56
#define LIBAVCODEC_VERSION_MINOR 18 #define LIBAVCODEC_VERSION_MINOR 19
#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \