render_init()/render_terminate() callback functions for each platform
[platform/upstream/libva-intel-driver.git] / src / i965_drv_video.h
index 9515a49..2de9928 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <va/va.h>
 #include <va/va_enc_h264.h>
+#include <va/va_enc_mpeg2.h>
 #include <va/va_vpp.h>
 #include <va/va_backend.h>
 #include <va/va_backend_vpp.h>
 #include "i965_mutext.h"
 #include "object_heap.h"
 #include "intel_driver.h"
+#include "i965_fourcc.h"
 
-#define I965_MAX_PROFILES                       11
+#define I965_MAX_PROFILES                       20
 #define I965_MAX_ENTRYPOINTS                    5
 #define I965_MAX_CONFIG_ATTRIBUTES              10
 #define I965_MAX_IMAGE_FORMATS                  10
-#define I965_MAX_SUBPIC_FORMATS                 4
-#define I965_MAX_DISPLAY_ATTRIBUTES             4
+#define I965_MAX_SUBPIC_FORMATS                 6
+#define I965_MAX_SUBPIC_SUM                     4
+#define I965_MAX_SURFACE_ATTRIBUTES             16
 
 #define INTEL_STR_DRIVER_VENDOR                 "Intel"
 #define INTEL_STR_DRIVER_NAME                   "i965"
 #define I965_SURFACE_FLAG_TOP_FIELD_FIRST       0x00000001
 #define I965_SURFACE_FLAG_BOTTOME_FIELD_FIRST   0x00000002
 
+#define DEFAULT_BRIGHTNESS      0
+#define DEFAULT_CONTRAST        50
+#define DEFAULT_HUE             0
+#define DEFAULT_SATURATION      50
+
 struct i965_surface
 {
-    VAGenericID id;
+    struct object_base *base;
     int type;
     int flags;
 };
@@ -71,6 +79,7 @@ struct i965_kernel
     const uint32_t (*bin)[4];
     int size;
     dri_bo *bo;
+    unsigned int kernel_offset;
 };
 
 struct buffer_store
@@ -100,11 +109,15 @@ struct decode_state
     struct buffer_store *bit_plane;
     struct buffer_store *huffman_table;
     struct buffer_store **slice_datas;
+    struct buffer_store *probability_data;
     VASurfaceID current_render_target;
     int max_slice_params;
     int max_slice_datas;
     int num_slice_params;
     int num_slice_datas;
+
+    struct object_surface *render_object;
+    struct object_surface *reference_objects[16]; /* Up to 2 reference surfaces are valid for MPEG-2,*/
 };
 
 struct encode_state
@@ -128,9 +141,13 @@ struct encode_state
     int num_slice_params_ext;
     int last_packed_header_type;
 
-    struct buffer_store *misc_param[8];
+    struct buffer_store *misc_param[16];
 
     VASurfaceID current_render_target;
+    struct object_surface *input_yuv_object;
+    struct object_surface *reconstructed_object;
+    struct object_buffer *coded_buf_object;
+    struct object_surface *reference_objects[16]; /* Up to 2 reference surfaces are valid for MPEG-2,*/
 };
 
 struct proc_state
@@ -153,10 +170,10 @@ union codec_state
 
 struct hw_context
 {
-    void (*run)(VADriverContextP ctx, 
-                VAProfile profile, 
-                union codec_state *codec_state,
-                struct hw_context *hw_context);
+    VAStatus (*run)(VADriverContextP ctx, 
+                    VAProfile profile, 
+                    union codec_state *codec_state,
+                    struct hw_context *hw_context);
     void (*destroy)(void *);
     struct intel_batchbuffer *batch;
 };
@@ -165,7 +182,7 @@ struct object_context
 {
     struct object_base base;
     VAContextID context_id;
-    VAConfigID config_id;
+    struct object_config *obj_config;
     VASurfaceID *render_targets;               //input->encode, output->decode
     int num_render_targets;
     int picture_width;
@@ -189,12 +206,15 @@ struct object_surface
 {
     struct object_base base;
     VASurfaceStatus status;
-    VASubpictureID subpic;
-    int width;
-    int height;
+    VASubpictureID subpic[I965_MAX_SUBPIC_SUM];
+    struct object_subpic *obj_subpic[I965_MAX_SUBPIC_SUM];
+    unsigned int subpic_render_idx;
+
+    int width;          /* the pitch of plane 0 in bytes in horizontal direction */
+    int height;         /* the pitch of plane 0 in bytes in vertical direction */
     int size;
-    int orig_width;
-    int orig_height;
+    int orig_width;     /* the width of plane 0 in pixels */
+    int orig_height;    /* the height of plane 0 in pixels */
     int flags;
     unsigned int fourcc;    
     dri_bo *bo;
@@ -209,6 +229,10 @@ struct object_surface
     int cb_cr_width;
     int cb_cr_height;
     int cb_cr_pitch;
+    /* user specified attributes see: VASurfaceAttribExternalBuffers/VA_SURFACE_ATTRIB_MEM_TYPE_VA */
+    uint32_t user_disable_tiling : 1;
+    uint32_t user_h_stride_set   : 1;
+    uint32_t user_v_stride_set   : 1;
 };
 
 struct object_buffer 
@@ -234,23 +258,58 @@ struct object_subpic
 {
     struct object_base base;
     VAImageID image;
+    struct object_image *obj_image;
     VARectangle src_rect;
     VARectangle dst_rect;
     unsigned int format;
     int width;
     int height;
     int pitch;
+    float global_alpha;
     dri_bo *bo;
     unsigned int flags;
 };
 
+#define I965_RING_NULL  0
+#define I965_RING_BSD   1
+#define I965_RING_BLT   2
+#define I965_RING_VEBOX 3
+
+struct i965_filter
+{
+    VAProcFilterType type;
+    int ring;
+};
+
 struct hw_codec_info
 {
     struct hw_context *(*dec_hw_context_init)(VADriverContextP, struct object_config *);
     struct hw_context *(*enc_hw_context_init)(VADriverContextP, struct object_config *);
     struct hw_context *(*proc_hw_context_init)(VADriverContextP, struct object_config *);
+    bool (*render_init)(VADriverContextP);
+
     int max_width;
     int max_height;
+
+    unsigned int has_mpeg2_decoding:1;
+    unsigned int has_mpeg2_encoding:1;
+    unsigned int has_h264_decoding:1;
+    unsigned int has_h264_encoding:1;
+    unsigned int has_vc1_decoding:1;
+    unsigned int has_vc1_encoding:1;
+    unsigned int has_jpeg_decoding:1;
+    unsigned int has_jpeg_encoding:1;
+    unsigned int has_vpp:1;
+    unsigned int has_accelerated_getimage:1;
+    unsigned int has_accelerated_putimage:1;
+    unsigned int has_tiled_surface:1;
+    unsigned int has_di_motion_adptive:1;
+    unsigned int has_di_motion_compensated:1;
+    unsigned int has_vp8_decoding:1;
+    unsigned int has_vp8_encoding:1;
+
+    unsigned int num_filters;
+    struct i965_filter filters[VAProcFilterCount];
 };
 
 
@@ -265,15 +324,23 @@ struct i965_driver_data
     struct object_heap buffer_heap;
     struct object_heap image_heap;
     struct object_heap subpic_heap;
-    struct hw_codec_info *codec_info;
+    const struct hw_codec_info *codec_info;
 
     _I965Mutex render_mutex;
     _I965Mutex pp_mutex;
     struct intel_batchbuffer *batch;
+    struct intel_batchbuffer *pp_batch;
     struct i965_render_state render_state;
     void *pp_context;
     char va_vendor[256];
-    
+    VADisplayAttribute *display_attributes;
+    unsigned int num_display_attributes;
+    VADisplayAttribute *rotation_attrib;
+    VADisplayAttribute *brightness_attrib;
+    VADisplayAttribute *contrast_attrib;
+    VADisplayAttribute *hue_attrib;
+    VADisplayAttribute *saturation_attrib;
     VAContextID current_context_id;
 
     /* VA/DRI (X11) specific data */
@@ -309,7 +376,7 @@ i965_driver_data(VADriverContextP ctx)
     return (struct i965_driver_data *)(ctx->pDriverData);
 }
 
-void 
+VAStatus
 i965_check_alloc_surface_bo(VADriverContextP ctx,
                             struct object_surface *obj_surface,
                             int tiled,
@@ -319,7 +386,43 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
 int
 va_enc_packed_type_to_idx(int packed_type);
 
-/* reserve 1 byte for internal using */
-#define I965_CODEDBUFFER_SIZE   ALIGN(sizeof(VACodedBufferSegment) + 1, 64)
+/* reserve 2 byte for internal using */
+#define CODEC_H264      0
+#define CODEC_MPEG2     1
+
+#define H264_DELIMITER0 0x00
+#define H264_DELIMITER1 0x00
+#define H264_DELIMITER2 0x00
+#define H264_DELIMITER3 0x00
+#define H264_DELIMITER4 0x00
+
+#define MPEG2_DELIMITER0        0x00
+#define MPEG2_DELIMITER1        0x00
+#define MPEG2_DELIMITER2        0x00
+#define MPEG2_DELIMITER3        0x00
+#define MPEG2_DELIMITER4        0xb0
+
+struct i965_coded_buffer_segment
+{
+    VACodedBufferSegment base;
+    unsigned char mapped;
+    unsigned char codec;
+};
+
+#define I965_CODEDBUFFER_HEADER_SIZE   ALIGN(sizeof(struct i965_coded_buffer_segment), 64)
+
+extern VAStatus i965_MapBuffer(VADriverContextP ctx,
+               VABufferID buf_id,       /* in */
+               void **pbuf);            /* out */
+
+extern VAStatus i965_UnmapBuffer(VADriverContextP ctx, VABufferID buf_id);
+
+extern VAStatus i965_DestroySurfaces(VADriverContextP ctx,
+                     VASurfaceID *surface_list,
+                     int num_surfaces);
+
+#define I965_SURFACE_MEM_NATIVE             0
+#define I965_SURFACE_MEM_GEM_FLINK          1
+#define I965_SURFACE_MEM_DRM_PRIME          2
 
 #endif /* _I965_DRV_VIDEO_H_ */