예제 #1
0
u32 ddl_encode_frame(u32 *ddl_handle,
     struct ddl_frame_data_tag *input_frame,
     struct ddl_frame_data_tag *output_bit, void *client_data)
{
	struct ddl_client_context *ddl =
	    (struct ddl_client_context *)ddl_handle;
	struct ddl_context *ddl_context = ddl_get_context();

	if (vidc_msg_timing)
		ddl_set_core_start_time(__func__, ENC_OP_TIME);

	if (!DDL_IS_INITIALIZED(ddl_context)) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Not_inited");
		return VCD_ERR_ILLEGAL_OP;
	}
	if (DDL_IS_BUSY(ddl_context)) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Ddl_busy");
		return VCD_ERR_BUSY;
	}
	if (!ddl || ddl->decoding) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Bad_handle");
		return VCD_ERR_BAD_HANDLE;
	}
	if (!input_frame ||
	    !input_frame->vcd_frm.physical ||
	    ddl->codec_data.encoder.input_buf_req.sz !=
	    input_frame->vcd_frm.data_len) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Bad_input_params");
		return VCD_ERR_ILLEGAL_PARM;
	}
	if ((((u32) input_frame->vcd_frm.physical +
		   input_frame->vcd_frm.offset) &
		  (DDL_STREAMBUF_ALIGN_GUARD_BYTES)
	    )
	    ) {
		VIDC_LOGERR_STRING
		    ("ddl_enc_frame:Un_aligned_yuv_start_address");
		return VCD_ERR_ILLEGAL_PARM;
	}
	if (!output_bit ||
	    !output_bit->vcd_frm.physical ||
	    !output_bit->vcd_frm.alloc_len) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Bad_output_params");
		return VCD_ERR_ILLEGAL_PARM;
	}
	if ((ddl->codec_data.encoder.output_buf_req.sz +
	     output_bit->vcd_frm.offset) >
	    output_bit->vcd_frm.alloc_len) {
		VIDC_LOGERR_STRING
		    ("ddl_enc_frame:offset_large, Exceeds_min_buf_size");
	}
	if (!DDLCLIENT_STATE_IS(ddl, DDL_CLIENT_WAIT_FOR_FRAME)) {
		VIDC_LOGERR_STRING("ddl_enc_frame:Wrong_state");
		return VCD_ERR_ILLEGAL_OP;
	}

	DDL_BUSY(ddl_context);

	ddl_context->current_ddl = ddl;
	ddl_context->client_data = client_data;

	ddl->input_frame = *input_frame;
	ddl->output_frame = *output_bit;

	ddl_encode_frame_run(ddl);
	return VCD_S_SUCCESS;
}
예제 #2
0
u32 ddl_encode_frame(u32 *ddl_handle,
                     struct ddl_frame_data_type_tag *p_input_frame,
                     struct ddl_frame_data_type_tag *p_output_bit, void *p_client_data)
{
    struct ddl_client_context_type *p_ddl =
        (struct ddl_client_context_type *)ddl_handle;
    struct ddl_context_type *p_ddl_context = ddl_get_context();

#ifdef CORE_TIMING_INFO
    ddl_get_core_start_time(1);
#endif

    if (!DDL_IS_INITIALIZED(p_ddl_context)) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Not_inited");
        return VCD_ERR_ILLEGAL_OP;
    }
    if (DDL_IS_BUSY(p_ddl_context)) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Ddl_busy");
        return VCD_ERR_BUSY;
    }
    if (NULL == p_ddl || TRUE == p_ddl->b_decoding) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Bad_handle");
        return VCD_ERR_BAD_HANDLE;
    }
    if (NULL == p_input_frame ||
            NULL == p_input_frame->vcd_frm.p_physical ||
            p_ddl->codec_data.encoder.input_buf_req.n_size !=
            p_input_frame->vcd_frm.n_data_len) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Bad_input_params");
        return VCD_ERR_ILLEGAL_PARM;
    }
    if (0 != (((u32) p_input_frame->vcd_frm.p_physical +
               p_input_frame->vcd_frm.n_offset) &
              (DDL_STREAMBUF_ALIGN_GUARD_BYTES)
             )
       ) {
        VIDC_LOGERR_STRING
        ("ddl_enc_frame:Un_aligned_yuv_start_address");
        return VCD_ERR_ILLEGAL_PARM;
    }
    if (NULL == p_output_bit ||
            NULL == p_output_bit->vcd_frm.p_physical ||
            0 == p_output_bit->vcd_frm.n_alloc_len) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Bad_output_params");
        return VCD_ERR_ILLEGAL_PARM;
    }
    if ((p_ddl->codec_data.encoder.output_buf_req.n_size +
            p_output_bit->vcd_frm.n_offset) >
            p_output_bit->vcd_frm.n_alloc_len) {
        VIDC_LOGERR_STRING
        ("ddl_enc_frame:n_offset_large, Exceeds_min_buf_size");
    }
    if (!DDLCLIENT_STATE_IS(p_ddl, DDL_CLIENT_WAIT_FOR_FRAME)) {
        VIDC_LOGERR_STRING("ddl_enc_frame:Wrong_state");
        return VCD_ERR_ILLEGAL_OP;
    }

    DDL_BUSY(p_ddl_context);

    p_ddl_context->p_current_ddl = p_ddl;
    p_ddl_context->p_client_data = p_client_data;

    p_ddl->input_frame = *p_input_frame;
    p_ddl->output_frame = *p_output_bit;

    ddl_encode_frame_run(p_ddl);
    return VCD_S_SUCCESS;
}