diff options
author | U. Artie Eoff <ullysses.a.eoff@intel.com> | 2016-06-07 13:28:02 -0700 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2016-06-08 08:46:07 +0800 |
commit | 39ebba0d61657a7c306cc8fd1c5780f3bfc8ba30 (patch) | |
tree | 10810a125077be30c772b01701419b31251830e9 | |
parent | 7a3d0ed927323c98db762c94cd9c20319fa152b7 (diff) |
i965_drv: add support for per-codec max resolution
Add a functor to hw_codec_info to allow each hw instance to report
maximum resolution on a per-codec basis.
Signed-off-by: U. Artie Eoff <ullysses.a.eoff@intel.com>
-rw-r--r-- | src/i965_drv_video.c | 32 | ||||
-rw-r--r-- | src/i965_drv_video.h | 9 |
2 files changed, 36 insertions, 5 deletions
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index efac5a5..66cdb9e 100644 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -2130,6 +2130,20 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj) object_heap_free(heap, obj); } +static inline void +max_resolution(struct i965_driver_data *i965, + struct object_config *obj_config, + int *w, /* out */ + int *h) /* out */ +{ + if (i965->codec_info->max_resolution) { + i965->codec_info->max_resolution(i965, obj_config, w, h); + } else { + *w = i965->codec_info->max_width; + *h = i965->codec_info->max_height; + } +} + VAStatus i965_CreateContext(VADriverContextP ctx, VAConfigID config_id, @@ -2147,14 +2161,18 @@ i965_CreateContext(VADriverContextP ctx, VAStatus vaStatus = VA_STATUS_SUCCESS; int contextID; int i; + int max_width; + int max_height; if (NULL == obj_config) { vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; return vaStatus; } - if (picture_width > i965->codec_info->max_width || - picture_height > i965->codec_info->max_height) { + max_resolution(i965, obj_config, &max_width, &max_height); + + if (picture_width > max_width || + picture_height > max_height) { vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; return vaStatus; } @@ -5485,7 +5503,9 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx, struct object_config *obj_config; int i = 0; VASurfaceAttrib *attribs = NULL; - + int max_width; + int max_height; + if (config == VA_INVALID_ID) return VA_STATUS_ERROR_INVALID_CONFIG; @@ -5873,16 +5893,18 @@ i965_QuerySurfaceAttributes(VADriverContextP ctx, attribs[i].value.value.p = NULL; /* ignore */ i++; + max_resolution(i965, obj_config, &max_width, &max_height); + attribs[i].type = VASurfaceAttribMaxWidth; attribs[i].value.type = VAGenericValueTypeInteger; attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE; - attribs[i].value.value.i = i965->codec_info->max_width; + attribs[i].value.value.i = max_width; i++; attribs[i].type = VASurfaceAttribMaxHeight; attribs[i].value.type = VAGenericValueTypeInteger; attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE; - attribs[i].value.value.i = i965->codec_info->max_height; + attribs[i].value.value.i = max_height; i++; if (i > *num_attribs) { diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h index b8d61a1..47e27d0 100644 --- a/src/i965_drv_video.h +++ b/src/i965_drv_video.h @@ -354,6 +354,8 @@ struct i965_filter int ring; }; +struct i965_driver_data; + struct hw_codec_info { struct hw_context *(*dec_hw_context_init)(VADriverContextP, struct object_config *); @@ -363,6 +365,13 @@ struct hw_codec_info void (*post_processing_context_init)(VADriverContextP, void *, struct intel_batchbuffer *); void (*preinit_hw_codec)(VADriverContextP, struct hw_codec_info *); + /** + * Allows HW info to support per-codec max resolution. If this functor is + * not initialized, then @max_width and @max_height will be used as the + * default maximum resolution for all codecs on this HW info. + */ + void (*max_resolution)(struct i965_driver_data *, struct object_config *, int *, int *); + int max_width; int max_height; int min_linear_wpitch; |