void pjmedia_vid_dev_conv_destroy_converter(pjmedia_vid_dev_conv *conv) { if (conv->conv) { pjmedia_converter_destroy(conv->conv); conv->conv = NULL; } }
/* * Remove a destination media port from the video tee. */ pj_status_t pjmedia_vid_tee_remove_dst_port(pjmedia_port *vid_tee, pjmedia_port *port) { vid_tee_port *tee = (vid_tee_port*)vid_tee; unsigned i; PJ_ASSERT_RETURN(vid_tee && vid_tee->info.signature==TEE_PORT_SIGN, PJ_EINVAL); for (i = 0; i < tee->dst_port_cnt; ++i) { if (tee->dst_ports[i].dst == port) { if (tee->tee_conv[i].conv) pjmedia_converter_destroy(tee->tee_conv[i].conv); pj_array_erase(tee->dst_ports, sizeof(tee->dst_ports[0]), tee->dst_port_cnt, i); pj_array_erase(tee->tee_conv, sizeof(tee->tee_conv[0]), tee->dst_port_cnt, i); --tee->dst_port_cnt; return PJ_SUCCESS; } } return PJ_ENOTFOUND; }
static pj_status_t create_converter(pjmedia_vid_port *vp) { if (vp->conv.conv) { pjmedia_converter_destroy(vp->conv.conv); vp->conv.conv = NULL; } /* Instantiate converter if necessary */ if (vp->conv.conv_param.src.id != vp->conv.conv_param.dst.id || (vp->conv.conv_param.src.det.vid.size.w != vp->conv.conv_param.dst.det.vid.size.w) || (vp->conv.conv_param.src.det.vid.size.h != vp->conv.conv_param.dst.det.vid.size.h)) { pj_status_t status; /* Yes, we need converter */ status = pjmedia_converter_create(NULL, vp->pool, &vp->conv.conv_param, &vp->conv.conv); if (status != PJ_SUCCESS) { PJ_PERROR(4,(THIS_FILE, status, "Error creating converter")); return status; } } if (vp->conv.conv || (vp->role==ROLE_ACTIVE && (vp->dir & PJMEDIA_DIR_ENCODING))) { pj_status_t status; const pjmedia_video_format_info *vfi; pjmedia_video_apply_fmt_param vafp; /* Allocate buffer for conversion */ vfi = pjmedia_get_video_format_info(NULL, vp->conv.conv_param.dst.id); if (!vfi) return PJMEDIA_EBADFMT; pj_bzero(&vafp, sizeof(vafp)); vafp.size = vp->conv.conv_param.dst.det.vid.size; status = vfi->apply_fmt(vfi, &vafp); if (status != PJ_SUCCESS) return PJMEDIA_EBADFMT; if (vafp.framebytes > vp->conv.conv_buf_size) { vp->conv.conv_buf = pj_pool_alloc(vp->pool, vafp.framebytes); vp->conv.conv_buf_size = vafp.framebytes; } } vp->conv.usec_ctr = 0; vp->conv.usec_src = PJMEDIA_PTIME(&vp->conv.conv_param.src.det.vid.fps); vp->conv.usec_dst = PJMEDIA_PTIME(&vp->conv.conv_param.dst.det.vid.fps); return PJ_SUCCESS; }
static pj_status_t create_converter(pjmedia_vid_port *vp) { /* Instantiate converter if necessary */ if (vp->conv_param.src.id != vp->conv_param.dst.id || vp->conv_param.src.det.vid.size.w != vp->conv_param.dst.det.vid.size.w || vp->conv_param.src.det.vid.size.h != vp->conv_param.dst.det.vid.size.h) { pj_status_t status; /* Yes, we need converter */ const pjmedia_video_format_info *vfi; pjmedia_video_apply_fmt_param vafp; if (vp->conv) { pjmedia_converter_destroy(vp->conv); vp->conv = NULL; } status = pjmedia_converter_create(NULL, vp->pool, &vp->conv_param, &vp->conv); if (status != PJ_SUCCESS) { PJ_PERROR(4,(THIS_FILE, status, "Error creating converter")); return status; } /* Allocate buffer for conversion */ vfi = pjmedia_get_video_format_info(NULL, vp->conv_param.dst.id); if (!vfi) return PJMEDIA_EBADFMT; pj_bzero(&vafp, sizeof(vafp)); vafp.size = vp->conv_param.dst.det.vid.size; status = vfi->apply_fmt(vfi, &vafp); if (status != PJ_SUCCESS) return PJMEDIA_EBADFMT; if (vafp.framebytes > vp->conv_buf_size) { vp->conv_buf = pj_pool_alloc(vp->pool, vafp.framebytes); vp->conv_buf_size = vafp.framebytes; } } return PJ_SUCCESS; }