static VAStatus vsp_vp8_process_seqence_param( psb_driver_data_p driver_data, context_VPP_p ctx, object_buffer_p obj_buffer) { VAStatus vaStatus = VA_STATUS_SUCCESS; vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; int i; int ref_frame_width, ref_frame_height, ref_chroma_height, ref_size; VAEncSequenceParameterBufferVP8 *va_seq = (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data; struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param; struct VssVp8encSequenceParameterBuffer *seq_to_firmware = (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p; struct ref_frame_surface *ref = (struct ref_frame_surface*)cmdbuf->ref_param_p; seq->frame_width = va_seq->frame_width; seq->frame_height = va_seq->frame_height; seq->rc_target_bitrate = va_seq->bits_per_second / 1000; seq->max_intra_rate = 100 * ctx->max_frame_size / (va_seq->bits_per_second / seq->frame_rate); /* FIXME: API doc says max 5000, but for current default test vector we still use 6000 */ seq->kf_mode = va_seq->kf_auto; /* AUTO */ seq->kf_max_dist = va_seq->kf_max_dist; seq->kf_min_dist = va_seq->kf_min_dist; seq->error_resilient = va_seq->error_resilient; ref_frame_width = (seq->frame_width + 2 * 32 + 63) & (~63); ref_frame_height = (seq->frame_height + 2 * 32 + 63) & (~63); ref_chroma_height = (ref_frame_height / 2 + 63) & (~63); ref_size = ref_frame_width * (ref_frame_height + ref_chroma_height); for (i = 0; i < 4; i++) { seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i]; seq->ref_frame_buffers[i].width = ref_frame_width; seq->ref_frame_buffers[i].height = ref_frame_height; } for (i = 0; i < 4; i++) { object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]); if (!ref_surf) return VA_STATUS_ERROR_UNKNOWN; ref_surf->is_ref_surface = 2; if (ref_surf->psb_surface->size < ref_size) { /* re-alloc buffer */ ref_surf->psb_surface->size = ref_size; psb_buffer_destroy(&ref_surf->psb_surface->buf); vaStatus = psb_buffer_create(driver_data, ref_surf->psb_surface->size, psb_bt_surface, &ref_surf->psb_surface->buf); if (VA_STATUS_SUCCESS != vaStatus) return VA_STATUS_ERROR_ALLOCATION_FAILED; } vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base), 0, &(ref_surf->psb_surface->buf), cmdbuf->param_mem_loc, seq); } *seq_to_firmware = *seq; vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem, VssVp8encSetSequenceParametersCommand, ctx->seq_param_offset, sizeof(struct VssVp8encSequenceParameterBuffer)); ctx->vp8_seq_cmd_send = 1; return vaStatus; }
static VAStatus vsp_vp8_process_picture_param( psb_driver_data_p driver_data, context_VPP_p ctx, object_buffer_p obj_buffer, VASurfaceID surface_id) { VAStatus vaStatus = VA_STATUS_SUCCESS; vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; VAEncPictureParameterBufferVP8 *va_pic = (VAEncPictureParameterBufferVP8 *) obj_buffer->buffer_data; struct VssVp8encPictureParameterBuffer *pic = (struct VssVp8encPictureParameterBuffer *)cmdbuf->pic_param_p; struct VssVp8encSequenceParameterBuffer *seq = (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p; int ref_frame_width, ref_frame_height; vp8_fw_pic_flags flags; ref_frame_width = (ctx->vp8_seq_param.frame_width + 2 * 32 + 63) & (~63); ref_frame_height = (ctx->vp8_seq_param.frame_height + 2 * 32 + 63) & (~63); //map parameters object_buffer_p pObj = BUFFER(va_pic->coded_buf); //tobe modified if (!pObj) return VA_STATUS_ERROR_UNKNOWN; object_surface_p src_surface = SURFACE(surface_id); pic->input_frame.surface_id = surface_id; pic->input_frame.irq = 1; pic->input_frame.height = ctx->vp8_seq_param.frame_height; pic->input_frame.width = ctx->vp8_seq_param.frame_width; /* NOTE: In VIED API doc, stride must be the nearest integer multiple of 32 */ /* use vaCreateSurfaceWithAttribute with VAExternalMemoryNULL to create surface*/ //pic->input_frame.stride = (ctx->frame_width + 31) & (~31); pic->input_frame.stride = ctx->obj_context->current_render_target->psb_surface->stride; pic->input_frame.format = 0; /* TODO: Specify NV12 = 0 */ pic->recon_frame.irq = 0; pic->recon_frame.width = ref_frame_width; pic->recon_frame.height = ref_frame_height; pic->version = 0; flags.value = 0; flags.bits.force_kf = va_pic->ref_flags.bits.force_kf; flags.bits.no_ref_last = va_pic->ref_flags.bits.no_ref_last; flags.bits.no_ref_gf = va_pic->ref_flags.bits.no_ref_gf; flags.bits.no_ref_arf = va_pic->ref_flags.bits.no_ref_arf; flags.bits.upd_last = va_pic->pic_flags.bits.refresh_last; flags.bits.upd_gf = va_pic->pic_flags.bits.copy_buffer_to_golden; flags.bits.upd_arf = va_pic->pic_flags.bits.copy_buffer_to_alternate; flags.bits.no_upd_last = !va_pic->pic_flags.bits.refresh_last; flags.bits.no_upd_gf = !va_pic->pic_flags.bits.refresh_golden_frame; flags.bits.no_upd_arf = !va_pic->pic_flags.bits.refresh_alternate_frame; flags.bits.upd_entropy = va_pic->pic_flags.bits.refresh_entropy_probs; if (ctx->temporal_layer_number > 1) flags.bits.upd_entropy = 0; pic->pic_flags = flags.value; pic->prev_frame_dropped = 0; /* Not yet used */ pic->cpuused = 5; pic->sharpness = va_pic->sharpness_level; pic->num_token_partitions = va_pic->pic_flags.bits.num_token_partitions; /* 2^2 = 4 partitions */ pic->encoded_frame_size = pObj->size & ~31; pic->encoded_frame_base = (uint32_t)pObj->buffer_data; { vsp_cmdbuf_reloc_pic_param(&(pic->encoded_frame_base), ctx->pic_param_offset, pObj->psb_buffer, cmdbuf->param_mem_loc, pic); } { object_surface_p cur_surf = SURFACE(surface_id); if (!cur_surf) return VA_STATUS_ERROR_UNKNOWN; vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base), 0, &(cur_surf->psb_surface->buf), cmdbuf->param_mem_loc, pic); vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base_uv), pic->input_frame.stride * ctx->obj_context->current_render_target->height, &(cur_surf->psb_surface->buf), cmdbuf->param_mem_loc, pic); } *cmdbuf->cmd_idx++ = CONTEXT_VP8_ID; *cmdbuf->cmd_idx++ = VssVp8encEncodeFrameCommand; VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_param_offset, &cmdbuf->param_mem); *cmdbuf->cmd_idx++ = sizeof(struct VssVp8encPictureParameterBuffer); *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf(pObj->psb_buffer->drm_buf)) ; *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((&cmdbuf->param_mem)->drm_buf)); return vaStatus; }
static VAStatus vsp_vp8_process_seqence_param( psb_driver_data_p driver_data, context_VPP_p ctx, object_buffer_p obj_buffer) { VAStatus vaStatus = VA_STATUS_SUCCESS; vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; int i; int ref_frame_width, ref_frame_height; VAEncSequenceParameterBufferVP8 *va_seq = (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data; struct VssVp8encSequenceParameterBuffer *seq = (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p; ref_frame_surface *ref = (struct ref_frame_surface*)cmdbuf->ref_param_p; ctx->frame_width = va_seq->frame_width; ctx->frame_height = va_seq->frame_height; /*cmd structures initializations*/ seq->frame_width = va_seq->frame_width; seq->frame_height = va_seq->frame_height; seq->rc_target_bitrate = va_seq->bits_per_second / 1000; seq->max_intra_rate = 0; seq->rc_undershoot_pct = ctx->rc_undershoot; seq->rc_overshoot_pct = 100; /* FIXME: API doc says max 5000, but for current default test vector we still use 6000 */ seq->rc_buf_sz = ctx->buffer_size; seq->rc_buf_initial_sz = ctx->initial_buffer_fullness; seq->rc_buf_optimal_sz = ctx->optimal_buffer_fullness; seq->rc_min_quantizer = ctx->min_qp; seq->rc_max_quantizer = ctx->max_qp; seq->kf_max_dist = va_seq->kf_max_dist; seq->kf_min_dist = va_seq->kf_min_dist; seq->frame_rate = ctx->frame_rate; seq->error_resilient = va_seq->error_resilient; seq->num_token_partitions = 2; // (log2: 2^2 = 4) seq->rc_end_usage = (ctx->rc_mode == VA_RC_CBR) ? VP8_ENC_CBR_HRD : VP8_ENC_CBR; /* CBR */ seq->kf_mode = va_seq->kf_auto; /* AUTO */ seq->cyclic_intra_refresh = 0; seq->concatenate_partitions = 1; //Make 0 not to concatenate partitions ref_frame_width = (ctx->frame_width + 2 * 32 + 63) & (~63); ref_frame_height = (ctx->frame_height + 2 * 32 + 63) & (~63); int chroma_height = (ref_frame_height / 2 + 63) & (~63); int ref_size = ref_frame_width * (ref_frame_height + chroma_height); seq->recon_buffer_mode = vss_vp8enc_seq_param_recon_buffer_mode_per_seq; for (i = 0; i < 4; i++) { seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i]; seq->ref_frame_buffers[i].width = ref_frame_width; seq->ref_frame_buffers[i].height = ref_frame_height; } for (i = 0; i < 4; i++) { object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]); if (!ref_surf) return VA_STATUS_ERROR_UNKNOWN; ref_surf->is_ref_surface = 2; if (ref_surf->psb_surface->size < ref_size) { /* re-alloc buffer */ ref_surf->psb_surface->size = ref_size; psb_buffer_destroy(&ref_surf->psb_surface->buf); vaStatus = psb_buffer_create(driver_data, ref_surf->psb_surface->size, psb_bt_surface, &ref_surf->psb_surface->buf); if (VA_STATUS_SUCCESS != vaStatus) return VA_STATUS_ERROR_ALLOCATION_FAILED; } vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base), 0, &(ref_surf->psb_surface->buf), cmdbuf->param_mem_loc, seq); } ctx->frame_rate = seq->frame_rate; ctx->bits_per_second = va_seq->bits_per_second; ctx->vp8_seq_param = * seq; vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem, VssVp8encSetSequenceParametersCommand, ctx->seq_param_offset, sizeof(struct VssVp8encSequenceParameterBuffer)); ctx->vp8_seq_cmd_send = 1; return vaStatus; }