/* * 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; }
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 }
/* * 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; }
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; }
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; }
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; } }
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; }