summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorU. Artie Eoff <ullysses.a.eoff@intel.com>2016-06-07 13:28:02 -0700
committerXiang, Haihao <haihao.xiang@intel.com>2016-06-08 08:46:07 +0800
commit39ebba0d61657a7c306cc8fd1c5780f3bfc8ba30 (patch)
tree10810a125077be30c772b01701419b31251830e9
parent7a3d0ed927323c98db762c94cd9c20319fa152b7 (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.c32
-rw-r--r--src/i965_drv_video.h9
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;