コード例 #1
0
ファイル: vid_tee.c プロジェクト: zndxlx/pjsip_r
/*
 * Add a destination media port to the video tee. Create a converter if
 * necessary.
 */
pj_status_t pjmedia_vid_tee_add_dst_port2(pjmedia_port *vid_tee,
						  unsigned option,
						  pjmedia_port *port)
{
    vid_tee_port *tee = (vid_tee_port*)vid_tee;
    pjmedia_video_format_detail *vfd;
    
    PJ_ASSERT_RETURN(vid_tee && vid_tee->info.signature==TEE_PORT_SIGN,
		     PJ_EINVAL);
    
    if (tee->dst_port_cnt >= tee->dst_port_maxcnt)
	return PJ_ETOOMANY;
    
    pj_bzero(&tee->tee_conv[tee->dst_port_cnt], sizeof(tee->tee_conv[0]));
    
    /* Check if we need to create a converter. */
    vfd = pjmedia_format_get_video_format_detail(&port->info.fmt, PJ_TRUE);
    if (vid_tee->info.fmt.id != port->info.fmt.id ||
        vfd->size.w != vid_tee->info.fmt.det.vid.size.w ||
	vfd->size.h != vid_tee->info.fmt.det.vid.size.h)
    {
        const pjmedia_video_format_info *vfi;
        pjmedia_video_apply_fmt_param vafp;
        pjmedia_conversion_param conv_param;
        pj_status_t status;

        vfi = pjmedia_get_video_format_info(NULL, port->info.fmt.id);
        if (vfi == NULL)
            return PJMEDIA_EBADFMT;

        pj_bzero(&vafp, sizeof(vafp));
        vafp.size = port->info.fmt.det.vid.size;
        status = vfi->apply_fmt(vfi, &vafp);
        if (status != PJ_SUCCESS)
            return status;
        
        realloc_buf(tee, (option & PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC)?
                    2: 1, vafp.framebytes);
        
        pjmedia_format_copy(&conv_param.src, &vid_tee->info.fmt);
	pjmedia_format_copy(&conv_param.dst, &port->info.fmt);
        
        status = pjmedia_converter_create(
                     NULL, tee->pool, &conv_param,
                     &tee->tee_conv[tee->dst_port_cnt].conv);
        if (status != PJ_SUCCESS)
            return status;
        
        tee->tee_conv[tee->dst_port_cnt].conv_buf_size = vafp.framebytes;
    } else {
        realloc_buf(tee, (option & PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC)?
                    1: 0, tee->buf_size);        
    }
    
    tee->dst_ports[tee->dst_port_cnt].dst = port;
    tee->dst_ports[tee->dst_port_cnt].option = option;
    ++tee->dst_port_cnt;
    
    return PJ_SUCCESS;
}
コード例 #2
0
void handle_read(struct cloner *cloner)
{
	int ret;
#define OPS(x,y) ((x<<16)|(y&0xffff))
	switch(cloner->cmd->read.ops) {
#ifdef CONFIG_JZ_MMC
	case OPS(MMC,0):
	case OPS(MMC,1):
	case OPS(MMC,2):
		realloc_buf(cloner, ((cloner->cmd->read.length + 0x200) & (~(0x200 - 1))));
		ret = mmc_read_x((cloner->cmd->read.ops & 0xffff),
				cloner->read_req->buf,
				cloner->cmd->read.partation + cloner->cmd->read.offset,
				cloner->cmd->read.length);
		break;
#endif
	default:
		ret = clmg_read(cloner);
		break;
	}

	if (ret < 0)
		cloner->ack = ret;
	else
		cloner->ack = 0;
	if (cloner->args->transfer_data_chk)
		cloner->crc = local_crc32(0xffffffff, cloner->read_req->buf, cloner->cmd->read.length);
	//printf("handle read cloner->crc %x\n", cloner->crc);

	/*always transfer data*/
	cloner->read_req->length = cloner->cmd->read.length;
	//usb_ep_queue(cloner->ep_in, cloner->read_req, 0);
#undef OPS
}
コード例 #3
0
ファイル: vid_tee.c プロジェクト: zndxlx/pjsip_r
/*
 * Add a destination media port to the video tee.
 */
pj_status_t pjmedia_vid_tee_add_dst_port(pjmedia_port *vid_tee,
						 unsigned option,
						 pjmedia_port *port)
{
    vid_tee_port *tee = (vid_tee_port*)vid_tee;
    pjmedia_video_format_detail *vfd;

    PJ_ASSERT_RETURN(vid_tee && vid_tee->info.signature==TEE_PORT_SIGN,
		     PJ_EINVAL);

    if (tee->dst_port_cnt >= tee->dst_port_maxcnt)
	return PJ_ETOOMANY;
    
    if (vid_tee->info.fmt.id != port->info.fmt.id)
	return PJMEDIA_EBADFMT;

    vfd = pjmedia_format_get_video_format_detail(&port->info.fmt, PJ_TRUE);
    if (vfd->size.w != vid_tee->info.fmt.det.vid.size.w ||
	vfd->size.h != vid_tee->info.fmt.det.vid.size.h)
    {
        return PJMEDIA_EBADFMT;
    }
    
    realloc_buf(tee, (option & PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC)?
                1: 0, tee->buf_size);

    pj_bzero(&tee->tee_conv[tee->dst_port_cnt], sizeof(tee->tee_conv[0]));
    tee->dst_ports[tee->dst_port_cnt].dst = port;
    tee->dst_ports[tee->dst_port_cnt].option = option;
    ++tee->dst_port_cnt;

    return PJ_SUCCESS;
}
コード例 #4
0
ファイル: binrpc_api.c プロジェクト: Gaoithe/openimscore_ims
static inline int char2buffer(unsigned char** buf, int* buf_len, int* pos, 
			      char data)
{
	if (*buf_len < 1) {
		if(realloc_buf(buf, buf_len, 1) != 0) {
			return FATAL_ERROR;
		}
	}
	
	(*buf)[*pos] = data;
	++(*pos);
	--(*buf_len);
	
	return 0;
}
コード例 #5
0
ファイル: binrpc_api.c プロジェクト: Gaoithe/openimscore_ims
static inline int str2buffer(unsigned char** buf, int* buf_len, int* pos, 
			     char* data, int data_len)
{
	if (*buf_len < data_len) {
		if(realloc_buf(buf, buf_len, data_len) != 0) {
			return FATAL_ERROR;
		}
	}
	
	memcpy(&(*buf)[*pos], data, data_len);
	*pos += data_len;
	*buf_len -= data_len;
	
	return 0;
}
コード例 #6
0
void handle_cmd(struct usb_ep *ep,struct usb_request *req)
{
	struct cloner *cloner = req->context;
	if(req->status == -ECONNRESET) {
		cloner->ack = -ECONNRESET;
		return;
	}

	if (req->actual != req->length) {
		printf("cmd transfer length is err req->actual = %d, req->length = %d\n",
				req->actual,req->length);
		cloner->ack = -EIO;
		return;
	}

	union cmd *cmd = req->buf;
	debug_cond(BURNNER_DEBUG,"handle_cmd type=%x\n",cloner->cmd_type);
	switch(cloner->cmd_type) {
		case VR_UPDATE_CFG:
			cloner->args_req->length = cmd->update.length;
			usb_ep_queue(cloner->ep_out, cloner->args_req, 0);
			break;
		case VR_WRITE:
			realloc_buf(cloner, cmd->write.length);
			cloner->write_req->length = cmd->write.length;
			usb_ep_queue(cloner->ep_out, cloner->write_req, 0);
			break;
		case VR_INIT:
			if(!cloner->inited) {
				cloner->ack = -EBUSY;
				cloner_init(cloner);
				cloner->inited = 1;
				cloner->ack = 0;
			}
			break;
		case VR_READ:
			handle_read(cloner);
			break;
		case VR_GET_CRC:
			if (!cloner->ack)
				usb_ep_queue(cloner->ep_in, cloner->read_req, 0);
			break;
		case VR_SYNC_TIME:
			cloner->ack = rtc_set(&cloner->cmd->rtc);
			break;
		case VR_CHECK:
			cloner->ack = handle_check(cloner);
			break;
	    case VR_GET_CHIP_ID:
		case VR_GET_USER_ID:
		case VR_GET_ACK:
		case VR_GET_CPU_INFO:
		case VR_SET_DATA_ADDR:
		case VR_SET_DATA_LEN:
			break;
		case VR_REBOOT:
#ifdef CONFIG_FPGA
			mdelay(1000);
			do_udc_reset();
			mdelay(10000);
#endif
			do_reset(NULL,0,0,NULL);
			break;
		case VR_POWEROFF:
			burner_set_reset_tag();
			do_reset(NULL,0,0,NULL);
			break;
	}
}
コード例 #7
0
ファイル: binrpc_api.c プロジェクト: Gaoithe/openimscore_ims
int binrpc_response_to_text(
	struct binrpc_response_handle *resp_handle,
	unsigned char** txt_rsp, int* txt_rsp_len, char delimiter)
{
	unsigned char* p;
	unsigned char* end;
	struct binrpc_val val;
	int ret;
	int rec;
	int pos;
	
	pos = 0;
	
	if (!resp_handle) {
		goto error;
	}

	resp_handle->in_pkt.offset = resp_handle->in_pkt.in_struct = resp_handle->in_pkt.in_array = 0;
	
	p=resp_handle->reply_buf;
	end=p+resp_handle->in_pkt.tlen;
	rec=0;
	
	if (*txt_rsp == NULL) {
		*txt_rsp_len = 0;
		if (realloc_buf(txt_rsp, txt_rsp_len, 0) != 0) {
			goto error;
		} 
	}
	
	/* read body */
	while(p<end){
		val.type=BINRPC_T_ALL;
		val.name.s=0;
		val.name.len=0;
		p = binrpc_read_record(&resp_handle->in_pkt, p, end, &val, &ret);
		if (ret < 0) {
			if (ret == E_BINRPC_EOP) {
				printf("end of message detected\n");
				break;
			}
			snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1,
					"ERROR while parsing the record %d,"
					" @%d: %02x : %s", rec,	resp_handle->in_pkt.offset, *p, binrpc_error(ret));
			goto error;
		}
		rec++;
		if (val2buffer(&val, txt_rsp, txt_rsp_len, &pos) != 0) {
			goto error;
		}
		
		if(char2buffer(txt_rsp, txt_rsp_len, &pos, delimiter) != 0) {
			goto error;
		}
	}
	
	/* rewrite last char - we don't need delimiter there */
	(*txt_rsp)[pos-1] = '\0';   
	/*
	if(char2buffer(txt_rsp, txt_rsp_len, &pos, '\0') != 0) {
		goto error;
	}
	*/
	return 0;
error:
	return FATAL_ERROR;
}