diff options
Diffstat (limited to 'i965_drv_video.c')
| -rw-r--r-- | i965_drv_video.c | 143 |
1 files changed, 113 insertions, 30 deletions
diff --git a/i965_drv_video.c b/i965_drv_video.c index e1bceba..aa746f2 100644 --- a/i965_drv_video.c +++ b/i965_drv_video.c @@ -41,6 +41,7 @@ #include "i965_media.h" #include "i965_drv_video.h" #include "i965_defines.h" +#include "i965_encoder.h" #define CONFIG_ID_OFFSET 0x01000000 #define CONTEXT_ID_OFFSET 0x02000000 @@ -49,19 +50,22 @@ #define IMAGE_ID_OFFSET 0x0a000000 #define SUBPIC_ID_OFFSET 0x10000000 -#define HAS_MPEG2(ctx) (IS_G4X((ctx)->intel.device_id) || \ +#define HAS_MPEG2(ctx) (IS_G4X((ctx)->intel.device_id) || \ IS_IRONLAKE((ctx)->intel.device_id) || \ (IS_GEN6((ctx)->intel.device_id) && (ctx)->intel.has_bsd)) #define HAS_H264(ctx) ((IS_GEN6((ctx)->intel.device_id) || \ IS_IRONLAKE((ctx)->intel.device_id)) && \ - (ctx)->intel.has_bsd) + (ctx)->intel.has_bsd) #define HAS_VC1(ctx) (IS_GEN6((ctx)->intel.device_id) && (ctx)->intel.has_bsd) -#define HAS_TILED_SURFACE(ctx) (IS_GEN6((ctx)->intel.device_id) && \ +#define HAS_TILED_SURFACE(ctx) (IS_GEN6((ctx)->intel.device_id) && \ (ctx)->render_state.interleaved_uv) +#define HAS_ENCODER(ctx) (IS_GEN6((ctx)->intel.device_id) && \ + (ctx)->intel.has_bsd) + enum { I965_SURFACETYPE_RGBA = 1, I965_SURFACETYPE_YUV, @@ -181,6 +185,10 @@ i965_QueryConfigEntrypoints(VADriverContextP ctx, case VAProfileH264High: if (HAS_H264(i965)) entrypoint_list[n++] = VAEntrypointVLD; + + if (HAS_ENCODER(i965)) + entrypoint_list[n++] = VAEntrypointEncSlice; + break; case VAProfileVC1Simple: @@ -217,6 +225,10 @@ i965_GetConfigAttributes(VADriverContextP ctx, attrib_list[i].value = VA_RT_FORMAT_YUV420; break; + case VAConfigAttribRateControl: + attrib_list[i].value = VA_RC_VBR; + break; + default: /* Do nothing */ attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; @@ -286,7 +298,8 @@ i965_CreateConfig(VADriverContextP ctx, case VAProfileH264Baseline: case VAProfileH264Main: case VAProfileH264High: - if (HAS_H264(i965) && VAEntrypointVLD == entrypoint) { + if ((HAS_H264(i965) && VAEntrypointVLD == entrypoint) || + (HAS_ENCODER(i965) && VAEntrypointEncSlice == entrypoint)) { vaStatus = VA_STATUS_SUCCESS; } else { vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; @@ -546,7 +559,7 @@ i965_QuerySubpictureFormats(VADriverContextP ctx, static void i965_destroy_subpic(struct object_heap *heap, struct object_base *obj) { -// struct object_subpic *obj_subpic = (struct object_subpic *)obj; + // struct object_subpic *obj_subpic = (struct object_subpic *)obj; object_heap_free(heap, obj); } @@ -682,7 +695,7 @@ i965_DeassociateSubpicture(VADriverContextP ctx, return VA_STATUS_SUCCESS; } -static void +void i965_reference_buffer_store(struct buffer_store **ptr, struct buffer_store *buffer_store) { @@ -694,7 +707,7 @@ i965_reference_buffer_store(struct buffer_store **ptr, } } -static void +void i965_release_buffer_store(struct buffer_store **ptr) { struct buffer_store *buffer_store = *ptr; @@ -790,16 +803,9 @@ i965_CreateContext(VADriverContextP ctx, break; } - obj_context->context_id = contextID; *context = contextID; - memset(&obj_context->decode_state, 0, sizeof(obj_context->decode_state)); - obj_context->decode_state.current_render_target = -1; - obj_context->decode_state.max_slice_params = NUM_SLICES; - obj_context->decode_state.max_slice_datas = NUM_SLICES; - obj_context->decode_state.slice_params = calloc(obj_context->decode_state.max_slice_params, - sizeof(*obj_context->decode_state.slice_params)); - obj_context->decode_state.slice_datas = calloc(obj_context->decode_state.max_slice_datas, - sizeof(*obj_context->decode_state.slice_datas)); + obj_context->flags = flag; + obj_context->context_id = contextID; obj_context->config_id = config_id; obj_context->picture_width = picture_width; obj_context->picture_height = picture_height; @@ -816,7 +822,22 @@ i965_CreateContext(VADriverContextP ctx, obj_context->render_targets[i] = render_targets[i]; } - obj_context->flags = flag; + if (VA_STATUS_SUCCESS == vaStatus) { + if (VAEntrypointEncSlice == obj_config->entrypoint ) { /*encode routin only*/ + memset(&obj_context->encode_state, 0, sizeof(obj_context->encode_state)); + vaStatus = i965_encoder_create_context(ctx, config_id, picture_width, picture_height, + flag, render_targets, num_render_targets, obj_context); + } else { + memset(&obj_context->decode_state, 0, sizeof(obj_context->decode_state)); + obj_context->decode_state.current_render_target = -1; + obj_context->decode_state.max_slice_params = NUM_SLICES; + obj_context->decode_state.max_slice_datas = NUM_SLICES; + obj_context->decode_state.slice_params = calloc(obj_context->decode_state.max_slice_params, + sizeof(*obj_context->decode_state.slice_params)); + obj_context->decode_state.slice_datas = calloc(obj_context->decode_state.max_slice_datas, + sizeof(*obj_context->decode_state.slice_datas)); + } + } /* Error recovery */ if (VA_STATUS_SUCCESS != vaStatus) { @@ -831,9 +852,19 @@ i965_DestroyContext(VADriverContextP ctx, VAContextID context) { struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_context *obj_context = CONTEXT(context); + struct object_config *obj_config; + VAContextID config; assert(obj_context); - i965_destroy_context(&i965->context_heap, (struct object_base *)obj_context); + config = obj_context->config_id; + obj_config = CONFIG(config); + assert(obj_config); + + if (VAEntrypointEncSlice == obj_config->entrypoint ){ + i965_encoder_destroy_context(&i965->context_heap, (struct object_base *)obj_context); + } else { + i965_destroy_context(&i965->context_heap, (struct object_base *)obj_context); + } return VA_STATUS_SUCCESS; } @@ -875,6 +906,10 @@ i965_create_buffer_internal(VADriverContextP ctx, case VAResidualDataBufferType: case VADeblockingParameterBufferType: case VAImageBufferType: + case VAEncCodedBufferType: + case VAEncSequenceParameterBufferType: + case VAEncPictureParameterBufferType: + case VAEncSliceParameterBufferType: /* Ok */ break; @@ -889,6 +924,10 @@ i965_create_buffer_internal(VADriverContextP ctx, return VA_STATUS_ERROR_ALLOCATION_FAILED; } + if (type == VAEncCodedBufferType) { + size += ALIGN(sizeof(VACodedBufferSegment), 64); + } + obj_buffer->max_num_elements = num_elements; obj_buffer->num_elements = num_elements; obj_buffer->size_element = size; @@ -904,14 +943,26 @@ i965_create_buffer_internal(VADriverContextP ctx, if (data) dri_bo_subdata(buffer_store->bo, 0, size * num_elements, data); - } else if (type == VASliceDataBufferType || type == VAImageBufferType) { + } else if (type == VASliceDataBufferType || type == VAImageBufferType || type == VAEncCodedBufferType) { buffer_store->bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", size * num_elements, 64); assert(buffer_store->bo); - if (data) + if (type == VAEncCodedBufferType) { + VACodedBufferSegment *coded_buffer_segment; + dri_bo_map(buffer_store->bo, 1); + coded_buffer_segment = (VACodedBufferSegment *)buffer_store->bo->virtual; + coded_buffer_segment->size = size - ALIGN(sizeof(VACodedBufferSegment), 64); + coded_buffer_segment->bit_offset = 0; + coded_buffer_segment->status = 0; + coded_buffer_segment->buf = NULL; + coded_buffer_segment->next = NULL; + dri_bo_unmap(buffer_store->bo); + } else if (data) { dri_bo_subdata(buffer_store->bo, 0, size * num_elements, data); + } + } else { buffer_store->buffer = malloc(size * num_elements); assert(buffer_store->buffer); @@ -990,6 +1041,12 @@ i965_MapBuffer(VADriverContextP ctx, assert(obj_buffer->buffer_store->bo->virtual); *pbuf = obj_buffer->buffer_store->bo->virtual; + + if (obj_buffer->type == VAEncCodedBufferType) { + VACodedBufferSegment *coded_buffer_segment = (VACodedBufferSegment *)(obj_buffer->buffer_store->bo->virtual); + coded_buffer_segment->buf = (unsigned char *)(obj_buffer->buffer_store->bo->virtual) + ALIGN(sizeof(VACodedBufferSegment), 64); + } + vaStatus = VA_STATUS_SUCCESS; } else if (NULL != obj_buffer->buffer_store->buffer) { *pbuf = obj_buffer->buffer_store->buffer; @@ -1061,6 +1118,11 @@ i965_BeginPicture(VADriverContextP ctx, obj_config = CONFIG(config); assert(obj_config); + if (VAEntrypointEncSlice == obj_config->entrypoint ){ + vaStatus = i965_encoder_begin_picture(ctx, context, render_target); + return vaStatus; + } + switch (obj_config->profile) { case VAProfileMPEG2Simple: case VAProfileMPEG2Main: @@ -1186,12 +1248,23 @@ i965_RenderPicture(VADriverContextP ctx, { struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_context *obj_context; + struct object_config *obj_config; + VAContextID config; int i; VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; obj_context = CONTEXT(context); assert(obj_context); + config = obj_context->config_id; + obj_config = CONFIG(config); + assert(obj_config); + + if (VAEntrypointEncSlice == obj_config->entrypoint ){ + vaStatus = i965_encoder_render_picture(ctx, context, buffers, num_buffers); + return vaStatus; + } + for (i = 0; i < num_buffers; i++) { struct object_buffer *obj_buffer = BUFFER(buffers[i]); assert(obj_buffer); @@ -1235,15 +1308,19 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context) int i; assert(obj_context); + config = obj_context->config_id; + obj_config = CONFIG(config); + assert(obj_config); + + if (VAEntrypointEncSlice == obj_config->entrypoint ){ + return i965_encoder_end_picture(ctx, context); + } + assert(obj_context->decode_state.pic_param); assert(obj_context->decode_state.num_slice_params >= 1); assert(obj_context->decode_state.num_slice_datas >= 1); assert(obj_context->decode_state.num_slice_params == obj_context->decode_state.num_slice_datas); - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - i965_media_decode_picture(ctx, obj_config->profile, &obj_context->decode_state); obj_context->decode_state.current_render_target = -1; obj_context->decode_state.num_slice_params = 0; @@ -1378,6 +1455,9 @@ i965_Init(VADriverContextP ctx) if (i965_render_init(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; + if (HAS_ENCODER(i965) && (i965_encoder_init(ctx) == False)) + return VA_STATUS_ERROR_UNKNOWN; + return VA_STATUS_SUCCESS; } @@ -1520,7 +1600,7 @@ i965_CreateImage(VADriverContextP ctx, *out_image = *image; return VA_STATUS_SUCCESS; -error: + error: i965_DestroyImage(ctx, image_id); return va_status; } @@ -1657,7 +1737,7 @@ VAStatus i965_DeriveImage(VADriverContextP ctx, return VA_STATUS_SUCCESS; -error: + error: i965_DestroyImage(ctx, image_id); return va_status; } @@ -2003,9 +2083,9 @@ i965_PutSurface(VADriverContextP ctx, pp_flag |= I965_PP_FLAG_DEINTERLACING; intel_render_put_surface(ctx, surface, - srcx, srcy, srcw, srch, - destx, desty, destw, desth, - pp_flag); + srcx, srcy, srcw, srch, + destx, desty, destw, desth, + pp_flag); if(obj_surface->subpic != VA_INVALID_ID) { intel_render_put_subpicture(ctx, surface, @@ -2033,6 +2113,9 @@ i965_Terminate(VADriverContextP ctx) { struct i965_driver_data *i965 = i965_driver_data(ctx); + if (HAS_ENCODER(i965) && (i965_encoder_terminate(ctx) == False)) + return VA_STATUS_ERROR_UNKNOWN; + if (i965_render_terminate(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; @@ -2116,7 +2199,7 @@ VA_DRIVER_INIT_FUNC( VADriverContextP ctx ) vtable->vaQueryDisplayAttributes = i965_QueryDisplayAttributes; vtable->vaGetDisplayAttributes = i965_GetDisplayAttributes; vtable->vaSetDisplayAttributes = i965_SetDisplayAttributes; -// vtable->vaDbgCopySurfaceToBuffer = i965_DbgCopySurfaceToBuffer; + // vtable->vaDbgCopySurfaceToBuffer = i965_DbgCopySurfaceToBuffer; i965 = (struct i965_driver_data *)calloc(1, sizeof(*i965)); assert(i965); |
