Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}