本文整理汇总了C++中pj_memcpy函数的典型用法代码示例。如果您正苦于以下问题:C++ pj_memcpy函数的具体用法?C++ pj_memcpy怎么用?C++ pj_memcpy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pj_memcpy函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: and_factory_create_stream
/* API: create stream */
static pj_status_t and_factory_create_stream(
pjmedia_vid_dev_factory *ff,
pjmedia_vid_dev_param *param,
const pjmedia_vid_dev_cb *cb,
void *user_data,
pjmedia_vid_dev_stream **p_vid_strm)
{
and_factory *f = (and_factory*)ff;
pj_pool_t *pool;
and_stream *strm;
and_dev_info *adi;
const pjmedia_video_format_detail *vfd;
const pjmedia_video_format_info *vfi;
pjmedia_video_apply_fmt_param vafp;
pj_uint32_t and_fmt;
unsigned convert_to_i420 = 0;
pj_status_t status = PJ_SUCCESS;
JNIEnv *jni_env;
pj_bool_t with_attach;
jobject jcam;
PJ_ASSERT_RETURN(f && param && p_vid_strm, PJ_EINVAL);
PJ_ASSERT_RETURN(param->fmt.type == PJMEDIA_TYPE_VIDEO &&
param->fmt.detail_type == PJMEDIA_FORMAT_DETAIL_VIDEO &&
param->dir == PJMEDIA_DIR_CAPTURE,
PJ_EINVAL);
pj_bzero(&vafp, sizeof(vafp));
adi = &f->dev_info[param->cap_id];
vfd = pjmedia_format_get_video_format_detail(¶m->fmt, PJ_TRUE);
vfi = pjmedia_get_video_format_info(NULL, param->fmt.id);
if (param->fmt.id == PJMEDIA_FORMAT_I420 && adi->forced_i420) {
/* Not really support I420, need to convert it from YV12/NV21 */
if (adi->has_nv21) {
and_fmt = pj_fmt_to_and(PJMEDIA_FORMAT_NV21);
convert_to_i420 = 1;
} else if (adi->has_yv12) {
and_fmt = pj_fmt_to_and(PJMEDIA_FORMAT_YV12);
convert_to_i420 = 2;
} else
pj_assert(!"Bug!");
} else {
and_fmt = pj_fmt_to_and(param->fmt.id);
}
if (!vfi || !and_fmt)
return PJMEDIA_EVID_BADFORMAT;
vafp.size = vfd->size;
if (vfi->apply_fmt(vfi, &vafp) != PJ_SUCCESS)
return PJMEDIA_EVID_BADFORMAT;
/* Create and Initialize stream descriptor */
pool = pj_pool_create(f->pf, "and-dev", 512, 512, NULL);
PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);
strm = PJ_POOL_ZALLOC_T(pool, and_stream);
pj_memcpy(&strm->param, param, sizeof(*param));
strm->pool = pool;
strm->factory = f;
pj_memcpy(&strm->vid_cb, cb, sizeof(*cb));
strm->user_data = user_data;
pj_memcpy(&strm->vafp, &vafp, sizeof(vafp));
strm->ts_inc = PJMEDIA_SPF2(param->clock_rate, &vfd->fps, 1);
/* Allocate buffer for YV12 -> I420 conversion */
if (convert_to_i420) {
pj_assert(vfi->plane_cnt > 1);
strm->convert_to_i420 = convert_to_i420;
strm->convert_buf = pj_pool_alloc(pool, vafp.plane_bytes[1]);
}
/* Native preview */
if (param->flags & PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW) {
}
with_attach = jni_get_env(&jni_env);
/* Instantiate PjCamera */
strm->cam_size.w = (vfd->size.w > vfd->size.h? vfd->size.w: vfd->size.h);
strm->cam_size.h = (vfd->size.w > vfd->size.h? vfd->size.h: vfd->size.w);
jcam = (*jni_env)->NewObject(jni_env, jobjs.cam.cls, jobjs.cam.m_init,
adi->dev_idx, /* idx */
strm->cam_size.w, /* w */
strm->cam_size.h, /* h */
and_fmt, /* fmt */
vfd->fps.num*1000/
vfd->fps.denum, /* fps */
(jlong)(intptr_t)strm, /* user data */
NULL /* SurfaceView */
);
if (jcam == NULL) {
PJ_LOG(3, (THIS_FILE, "Unable to create PjCamera instance"));
status = PJMEDIA_EVID_SYSERR;
goto on_return;
}
strm->jcam = (jobject)(*jni_env)->NewGlobalRef(jni_env, jcam);
(*jni_env)->DeleteLocalRef(jni_env, jcam);
//.........这里部分代码省略.........
示例2: PJ_DEF
/*
* Convert text to IPv4/IPv6 address.
*/
PJ_DEF(pj_status_t) pj_inet_pton(int af, const pj_str_t *src, void *dst)
{
char tempaddr[PJ_INET6_ADDRSTRLEN];
PJ_ASSERT_RETURN(af==PJ_AF_INET || af==PJ_AF_INET6, PJ_EAFNOTSUP);
PJ_ASSERT_RETURN(src && src->slen && dst, PJ_EINVAL);
/* Initialize output with PJ_IN_ADDR_NONE for IPv4 (to be
* compatible with pj_inet_aton()
*/
if (af==PJ_AF_INET) {
((pj_in_addr*)dst)->s_addr = PJ_INADDR_NONE;
}
/* Caution:
* this function might be called with cp->slen >= 46
* (i.e. when called with hostname to check if it's an IP addr).
*/
if (src->slen >= PJ_INET6_ADDRSTRLEN) {
return PJ_ENAMETOOLONG;
}
pj_memcpy(tempaddr, src->ptr, src->slen);
tempaddr[src->slen] = '\0';
#if defined(PJ_SOCK_HAS_INET_PTON) && PJ_SOCK_HAS_INET_PTON != 0
/*
* Implementation using inet_pton()
*/
if (inet_pton(af, tempaddr, dst) != 1) {
pj_status_t status = pj_get_netos_error();
if (status == PJ_SUCCESS)
status = PJ_EUNKNOWN;
return status;
}
return PJ_SUCCESS;
#elif defined(PJ_WIN32) || defined(PJ_WIN64) || defined(PJ_WIN32_WINCE)
/*
* Implementation on Windows, using WSAStringToAddress().
* Should also work on Unicode systems.
*/
{
PJ_DECL_UNICODE_TEMP_BUF(wtempaddr,PJ_INET6_ADDRSTRLEN)
pj_sockaddr sock_addr;
int addr_len = sizeof(sock_addr);
int rc;
sock_addr.addr.sa_family = (pj_uint16_t)af;
rc = WSAStringToAddress(
PJ_STRING_TO_NATIVE(tempaddr,wtempaddr,sizeof(wtempaddr)),
af, NULL, (LPSOCKADDR)&sock_addr, &addr_len);
if (rc != 0) {
/* If you get rc 130022 Invalid argument (WSAEINVAL) with IPv6,
* check that you have IPv6 enabled (install it in the network
* adapter).
*/
pj_status_t status = pj_get_netos_error();
if (status == PJ_SUCCESS)
status = PJ_EUNKNOWN;
return status;
}
if (sock_addr.addr.sa_family == PJ_AF_INET) {
pj_memcpy(dst, &sock_addr.ipv4.sin_addr, 4);
return PJ_SUCCESS;
} else if (sock_addr.addr.sa_family == PJ_AF_INET6) {
pj_memcpy(dst, &sock_addr.ipv6.sin6_addr, 16);
return PJ_SUCCESS;
} else {
pj_assert(!"Shouldn't happen");
return PJ_EBUG;
}
}
#elif !defined(PJ_HAS_IPV6) || PJ_HAS_IPV6==0
/* IPv6 support is disabled, just return error without raising assertion */
return PJ_EIPV6NOTSUP;
#else
pj_assert(!"Not supported");
return PJ_EIPV6NOTSUP;
#endif
}
示例3: PJ_DEF
/*
* pj_ioqueue_register_sock()
*/
PJ_DEF(pj_status_t) pj_ioqueue_register_sock( pj_pool_t *pool,
pj_ioqueue_t *ioqueue,
pj_sock_t sock,
void *user_data,
const pj_ioqueue_callback *cb,
pj_ioqueue_key_t **key )
{
HANDLE hioq;
pj_ioqueue_key_t *rec;
u_long value;
int rc;
PJ_ASSERT_RETURN(pool && ioqueue && cb && key, PJ_EINVAL);
pj_lock_acquire(ioqueue->lock);
#if PJ_IOQUEUE_HAS_SAFE_UNREG
/* Scan closing list first to release unused keys.
* Must do this with lock acquired.
*/
scan_closing_keys(ioqueue);
/* If safe unregistration is used, then get the key record from
* the free list.
*/
if (pj_list_empty(&ioqueue->free_list)) {
pj_lock_release(ioqueue->lock);
return PJ_ETOOMANY;
}
rec = ioqueue->free_list.next;
pj_list_erase(rec);
/* Set initial reference count to 1 */
pj_assert(pj_atomic_get(rec->ref_count) == 0);
pj_atomic_inc(rec->ref_count);
rec->closing = 0;
#else
rec = pj_pool_zalloc(pool, sizeof(pj_ioqueue_key_t));
#endif
/* Build the key for this socket. */
rec->ioqueue = ioqueue;
rec->hnd = (HANDLE)sock;
rec->hnd_type = HND_IS_SOCKET;
rec->user_data = user_data;
pj_memcpy(&rec->cb, cb, sizeof(pj_ioqueue_callback));
/* Set concurrency for this handle */
rc = pj_ioqueue_set_concurrency(rec, ioqueue->default_concurrency);
if (rc != PJ_SUCCESS) {
pj_lock_release(ioqueue->lock);
return rc;
}
#if PJ_HAS_TCP
rec->connecting = 0;
#endif
/* Set socket to nonblocking. */
value = 1;
rc = ioctlsocket(sock, FIONBIO, &value);
if (rc != 0) {
pj_lock_release(ioqueue->lock);
return PJ_RETURN_OS_ERROR(WSAGetLastError());
}
/* Associate with IOCP */
hioq = CreateIoCompletionPort((HANDLE)sock, ioqueue->iocp, (DWORD)rec, 0);
if (!hioq) {
pj_lock_release(ioqueue->lock);
return PJ_RETURN_OS_ERROR(GetLastError());
}
*key = rec;
#if PJ_IOQUEUE_HAS_SAFE_UNREG
pj_list_push_back(&ioqueue->active_list, rec);
#endif
pj_lock_release(ioqueue->lock);
return PJ_SUCCESS;
}
示例4: wmme_dev_thread
//.........这里部分代码省略.........
/* Write to the device. */
mr = waveOutWrite(wmme_strm->hWave.Out,
&(wmme_strm->WaveHdr[wmme_strm->dwBufIdx]),
sizeof(WAVEHDR));
if (mr != MMSYSERR_NOERROR)
{
status = PJ_STATUS_FROM_OS(mr);
break;
}
/* Increment position. */
if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx)
wmme_strm->dwBufIdx = 0;
wmme_strm->timestamp.u64 += strm->samples_per_frame /
strm->channel_count;
}
}
else
{
struct wmme_stream *wmme_strm = &strm->rec_strm;
MMRESULT mr = MMSYSERR_NOERROR;
status = PJ_SUCCESS;
/*
* Windows Multimedia has indicated that it has some frames ready
* in the capture buffer. Get as much frames as possible to
* prevent overflows.
*/
#if 0
{
static DWORD tc = 0;
DWORD now = GetTickCount();
DWORD i = 0;
DWORD bits = 0;
if (tc == 0) tc = now;
for (i = 0; i < wmme_strm->dwMaxBufIdx; ++i)
{
bits = bits << 4;
bits |= wmme_strm->WaveHdr[i].dwFlags & WHDR_DONE;
}
PJ_LOG(5,(THIS_FILE, "Record Signal> Index: %d, Delta: %4.4d, "
"Flags: %6.6x\n",
wmme_strm->dwBufIdx,
now - tc,
bits));
tc = now;
}
#endif
while (wmme_strm->WaveHdr[wmme_strm->dwBufIdx].dwFlags & WHDR_DONE)
{
char* buffer = (char*)
wmme_strm->WaveHdr[wmme_strm->dwBufIdx].lpData;
unsigned cap_len =
wmme_strm->WaveHdr[wmme_strm->dwBufIdx].dwBytesRecorded;
/*
PJ_LOG(5,(THIS_FILE, "Read %d bytes from buffer %d", cap_len,
wmme_strm->dwBufIdx));
*/
if (cap_len < bytes_per_frame)
pj_bzero(buffer + cap_len, bytes_per_frame - cap_len);
/* Copy the audio data out of the wave buffer. */
pj_memcpy(strm->buffer, buffer, bytes_per_frame);
/* Re-add the buffer to the device. */
mr = waveInAddBuffer(wmme_strm->hWave.In,
&(wmme_strm->WaveHdr[wmme_strm->dwBufIdx]),
sizeof(WAVEHDR));
if (mr != MMSYSERR_NOERROR) {
status = PJ_STATUS_FROM_OS(mr);
break;
}
/* Call callback */
status = (*strm->rec_cb)(strm->user_data,
wmme_strm->timestamp.u32.lo,
strm->buffer,
bytes_per_frame);
if (status != PJ_SUCCESS)
break;
/* Increment position. */
if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx)
wmme_strm->dwBufIdx = 0;
wmme_strm->timestamp.u64 += strm->samples_per_frame /
strm->channel_count;
}
}
}
PJ_LOG(5,(THIS_FILE, "WMME: thread stopping.."));
return 0;
}
示例5: PJ_DEF
/*
* Create server subscription.
*/
PJ_DEF(pj_status_t) pjsip_pres_create_uas( pjsip_dialog *dlg,
const pjsip_evsub_user *user_cb,
pjsip_rx_data *rdata,
pjsip_evsub **p_evsub )
{
pjsip_accept_hdr *accept;
pjsip_event_hdr *event;
content_type_e content_type = CONTENT_TYPE_NONE;
pjsip_evsub *sub;
pjsip_pres *pres;
char obj_name[PJ_MAX_OBJ_NAME];
pj_status_t status;
/* Check arguments */
PJ_ASSERT_RETURN(dlg && rdata && p_evsub, PJ_EINVAL);
/* Must be request message */
PJ_ASSERT_RETURN(rdata->msg_info.msg->type == PJSIP_REQUEST_MSG,
PJSIP_ENOTREQUESTMSG);
/* Check that request is SUBSCRIBE */
PJ_ASSERT_RETURN(pjsip_method_cmp(&rdata->msg_info.msg->line.req.method,
&pjsip_subscribe_method)==0,
PJSIP_SIMPLE_ENOTSUBSCRIBE);
/* Check that Event header contains "presence" */
event = (pjsip_event_hdr*)
pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &STR_EVENT, NULL);
if (!event) {
return PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_BAD_REQUEST);
}
if (pj_stricmp(&event->event_type, &STR_PRESENCE) != 0) {
return PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_BAD_EVENT);
}
/* Check that request contains compatible Accept header. */
accept = (pjsip_accept_hdr*)
pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_ACCEPT, NULL);
if (accept) {
unsigned i;
for (i=0; i<accept->count; ++i) {
if (pj_stricmp(&accept->values[i], &STR_APP_PIDF_XML)==0) {
content_type = CONTENT_TYPE_PIDF;
break;
} else if (pj_stricmp(&accept->values[i], &STR_APP_XPIDF_XML)==0) {
content_type = CONTENT_TYPE_XPIDF;
break;
}
}
if (i==accept->count) {
/* Nothing is acceptable */
return PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_NOT_ACCEPTABLE);
}
} else {
/* No Accept header.
* Treat as "application/pidf+xml"
*/
content_type = CONTENT_TYPE_PIDF;
}
/* Lock dialog */
pjsip_dlg_inc_lock(dlg);
/* Create server subscription */
status = pjsip_evsub_create_uas( dlg, &pres_user, rdata, 0, &sub);
if (status != PJ_SUCCESS)
goto on_return;
/* Create server presence subscription */
pres = PJ_POOL_ZALLOC_T(dlg->pool, pjsip_pres);
pres->dlg = dlg;
pres->sub = sub;
pres->content_type = content_type;
if (user_cb)
pj_memcpy(&pres->user_cb, user_cb, sizeof(pjsip_evsub_user));
pj_ansi_snprintf(obj_name, PJ_MAX_OBJ_NAME, "pres%p", dlg->pool);
pres->status_pool = pj_pool_create(dlg->pool->factory, obj_name,
512, 512, NULL);
pj_ansi_snprintf(obj_name, PJ_MAX_OBJ_NAME, "tmpres%p", dlg->pool);
pres->tmp_pool = pj_pool_create(dlg->pool->factory, obj_name,
512, 512, NULL);
/* Attach to evsub */
pjsip_evsub_set_mod_data(sub, mod_presence.id, pres);
/* Done: */
*p_evsub = sub;
on_return:
pjsip_dlg_dec_lock(dlg);
return status;
}
示例6: pjsip_endpt_create_tdata
pjsip_tx_data *PJUtils::clone_tdata(pjsip_tx_data *tdata)
{
pjsip_tx_data *cloned_tdata;
pj_status_t status;
status = pjsip_endpt_create_tdata(stack_data.endpt, &cloned_tdata);
if (status != PJ_SUCCESS)
{
return NULL;
}
// Always increment ref counter to 1.
pjsip_tx_data_add_ref(cloned_tdata);
// Clone the message from the supplied tdata.
cloned_tdata->msg = pjsip_msg_clone(cloned_tdata->pool, tdata->msg);
if (cloned_tdata->msg == NULL)
{
pjsip_tx_data_dec_ref(cloned_tdata);
cloned_tdata = NULL;
}
// Copy the trail identifier to the cloned message.
set_trail(cloned_tdata, get_trail(tdata));
if (tdata->msg->type == PJSIP_REQUEST_MSG)
{
// Substitute the branch value in the top Via header with a unique
// branch identifier.
pjsip_via_hdr *via = (pjsip_via_hdr*)
pjsip_msg_find_hdr(cloned_tdata->msg, PJSIP_H_VIA, NULL);
via->branch_param.ptr = (char*)
pj_pool_alloc(cloned_tdata->pool, PJSIP_MAX_BRANCH_LEN);
via->branch_param.slen = PJSIP_RFC3261_BRANCH_LEN;
pj_memcpy(via->branch_param.ptr,
PJSIP_RFC3261_BRANCH_ID, PJSIP_RFC3261_BRANCH_LEN);
pj_str_t tmp;
tmp.ptr = via->branch_param.ptr + PJSIP_RFC3261_BRANCH_LEN + 2;
// I have absolutely no idea what the following two lines do, but it
// doesn't seem to work without them!
*(tmp.ptr-2) = (pj_int8_t)(via->branch_param.slen+73);
*(tmp.ptr-1) = (pj_int8_t)(via->branch_param.slen+99);
pj_generate_unique_string( &tmp );
via->branch_param.slen = PJSIP_MAX_BRANCH_LEN;
}
// If the original message already had a specified transport set this
// on the clone. (Must use pjsip_tx_data_set_transport to ensure
// reference counts get updated.)
if (tdata->tp_sel.type == PJSIP_TPSELECTOR_TRANSPORT)
{
pjsip_tx_data_set_transport(cloned_tdata, &tdata->tp_sel);
}
// If the message has any addr in dest_info, copy that
if (tdata->dest_info.addr.count != 0) {
pj_memcpy(&cloned_tdata->dest_info, &tdata->dest_info, sizeof(cloned_tdata->dest_info));
}
return cloned_tdata;
}
示例7: on_request_complete
/*
* Callback upon request completion.
*/
static void on_request_complete(pj_stun_session *stun_sess,
pj_status_t status,
void *token,
pj_stun_tx_data *tdata,
const pj_stun_msg *response,
const pj_sockaddr_t *src_addr,
unsigned src_addr_len)
{
nat_detect_session *sess;
pj_stun_sockaddr_attr *mattr = NULL;
pj_stun_changed_addr_attr *ca = NULL;
pj_uint32_t *tsx_id;
int cmp;
unsigned test_id;
PJ_UNUSED_ARG(token);
PJ_UNUSED_ARG(tdata);
PJ_UNUSED_ARG(src_addr);
PJ_UNUSED_ARG(src_addr_len);
sess = (nat_detect_session*) pj_stun_session_get_user_data(stun_sess);
pj_grp_lock_acquire(sess->grp_lock);
/* Find errors in the response */
if (status == PJ_SUCCESS) {
/* Check error message */
if (PJ_STUN_IS_ERROR_RESPONSE(response->hdr.type)) {
pj_stun_errcode_attr *eattr;
int err_code;
eattr = (pj_stun_errcode_attr*)
pj_stun_msg_find_attr(response, PJ_STUN_ATTR_ERROR_CODE, 0);
if (eattr != NULL)
err_code = eattr->err_code;
else
err_code = PJ_STUN_SC_SERVER_ERROR;
status = PJ_STATUS_FROM_STUN_CODE(err_code);
} else {
/* Get MAPPED-ADDRESS or XOR-MAPPED-ADDRESS */
mattr = (pj_stun_sockaddr_attr*)
pj_stun_msg_find_attr(response, PJ_STUN_ATTR_XOR_MAPPED_ADDR, 0);
if (mattr == NULL) {
mattr = (pj_stun_sockaddr_attr*)
pj_stun_msg_find_attr(response, PJ_STUN_ATTR_MAPPED_ADDR, 0);
}
if (mattr == NULL) {
status = PJNATH_ESTUNNOMAPPEDADDR;
}
/* Get CHANGED-ADDRESS attribute */
ca = (pj_stun_changed_addr_attr*)
pj_stun_msg_find_attr(response, PJ_STUN_ATTR_CHANGED_ADDR, 0);
if (ca == NULL) {
status = PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_SERVER_ERROR);
}
}
}
/* Save the result */
tsx_id = (pj_uint32_t*) tdata->msg->hdr.tsx_id;
test_id = tsx_id[2];
if (test_id >= ST_MAX) {
PJ_LOG(4,(sess->pool->obj_name, "Invalid transaction ID %u in response",
test_id));
end_session(sess, PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_SERVER_ERROR),
PJ_STUN_NAT_TYPE_ERR_UNKNOWN);
goto on_return;
}
PJ_LOG(5,(sess->pool->obj_name, "Completed %s, status=%d",
test_names[test_id], status));
sess->result[test_id].complete = PJ_TRUE;
sess->result[test_id].status = status;
if (status == PJ_SUCCESS) {
pj_memcpy(&sess->result[test_id].ma, &mattr->sockaddr.ipv4,
sizeof(pj_sockaddr_in));
pj_memcpy(&sess->result[test_id].ca, &ca->sockaddr.ipv4,
sizeof(pj_sockaddr_in));
}
/* Send Test 1B only when Test 2 completes. Must not send Test 1B
* before Test 2 completes to avoid creating mapping on the NAT.
*/
if (!sess->result[ST_TEST_1B].executed &&
sess->result[ST_TEST_2].complete &&
//.........这里部分代码省略.........
示例8: platform_strerror
/*
* platform_strerror()
*
* Platform specific error message. This file is called by pj_strerror()
* in errno.c
*/
int platform_strerror( pj_os_err_type os_errcode,
char *buf, pj_size_t bufsize)
{
pj_size_t len = 0;
PJ_DECL_UNICODE_TEMP_BUF(wbuf,128);
pj_assert(buf != NULL);
pj_assert(bufsize >= 0);
/*
* MUST NOT check stack here.
* This function might be called from PJ_CHECK_STACK() itself!
//PJ_CHECK_STACK();
*/
if (!len) {
#if defined(PJ_HAS_ERROR_STRING) && (PJ_HAS_ERROR_STRING!=0)
int i;
for (i = 0; gaErrorList[i].msg; ++i) {
if (gaErrorList[i].code == os_errcode) {
len = strlen(gaErrorList[i].msg);
if ((pj_size_t)len >= bufsize) {
len = bufsize-1;
}
pj_memcpy(buf, gaErrorList[i].msg, len);
buf[len] = '\0';
break;
}
}
#endif /* PJ_HAS_ERROR_STRING */
}
if (!len) {
#if PJ_NATIVE_STRING_IS_UNICODE
len = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
os_errcode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
wbuf,
sizeof(wbuf),
NULL);
if (len) {
pj_unicode_to_ansi(wbuf, len, buf, bufsize);
}
#else
len = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
os_errcode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
buf,
(int)bufsize,
NULL);
buf[bufsize-1] = '\0';
#endif
if (len) {
/* Remove trailing newlines. */
while (len && (buf[len-1] == '\n' || buf[len-1] == '\r')) {
buf[len-1] = '\0';
--len;
}
}
}
if (!len) {
len = pj_ansi_snprintf( buf, bufsize, "Win32 error code %u",
(unsigned)os_errcode);
if (len < 0 || len >= (int)bufsize)
len = bufsize-1;
buf[len] = '\0';
}
return (int)len;
}
示例9: print_media_desc
static int print_media_desc( pjmedia_sdp_media *m, char *buf, int len)
{
char *p = buf;
char *end = buf+len;
unsigned i;
int printed;
/* check length for the "m=" line. */
if (len < m->desc.media.slen+m->desc.transport.slen+12+24) {
return -1;
}
*p++ = 'm'; /* m= */
*p++ = '=';
pj_memcpy(p, m->desc.media.ptr, m->desc.media.slen);
p += m->desc.media.slen;
*p++ = ' ';
printed = pj_utoa(m->desc.port, p);
p += printed;
if (m->desc.port_count > 1) {
*p++ = '/';
printed = pj_utoa(m->desc.port_count, p);
p += printed;
}
*p++ = ' ';
pj_memcpy(p, m->desc.transport.ptr, m->desc.transport.slen);
p += m->desc.transport.slen;
for (i=0; i<m->desc.fmt_count; ++i) {
*p++ = ' ';
pj_memcpy(p, m->desc.fmt[i].ptr, m->desc.fmt[i].slen);
p += m->desc.fmt[i].slen;
}
*p++ = '\r';
*p++ = '\n';
/* print connection info, if present. */
if (m->conn) {
printed = print_connection_info(m->conn, p, (int)(end-p));
if (printed < 0) {
return -1;
}
p += printed;
}
/* print optional bandwidth info. */
for (i=0; i<m->bandw_count; ++i) {
printed = (int)print_bandw(m->bandw[i], p, end-p);
if (printed < 0) {
return -1;
}
p += printed;
}
/* print attributes. */
for (i=0; i<m->attr_count; ++i) {
printed = (int)print_attr(m->attr[i], p, end-p);
if (printed < 0) {
return -1;
}
p += printed;
}
return (int)(p-buf);
}
示例10: xml_print_node
/* This is a recursive function. */
static int xml_print_node( const pj_xml_node *node, int indent,
char *buf, pj_size_t len )
{
int i;
char *p = buf;
pj_xml_attr *attr;
pj_xml_node *sub_node;
#define SIZE_LEFT() ((int)(len - (p-buf)))
PJ_CHECK_STACK();
/* Print name. */
if (SIZE_LEFT() < node->name.slen + indent + 5)
return -1;
for (i=0; i<indent; ++i)
*p++ = ' ';
*p++ = '<';
pj_memcpy(p, node->name.ptr, node->name.slen);
p += node->name.slen;
/* Print attributes. */
attr = node->attr_head.next;
while (attr != &node->attr_head) {
if (SIZE_LEFT() < attr->name.slen + attr->value.slen + 4)
return -1;
*p++ = ' ';
/* Attribute name. */
pj_memcpy(p, attr->name.ptr, attr->name.slen);
p += attr->name.slen;
/* Attribute value. */
if (attr->value.slen) {
*p++ = '=';
*p++ = '"';
pj_memcpy(p, attr->value.ptr, attr->value.slen);
p += attr->value.slen;
*p++ = '"';
}
attr = attr->next;
}
/* Check for empty node. */
if (node->content.slen==0 &&
node->node_head.next==(pj_xml_node*)&node->node_head)
{
*p++ = ' ';
*p++ = '/';
*p++ = '>';
return p-buf;
}
/* Enclosing '>' */
if (SIZE_LEFT() < 1) return -1;
*p++ = '>';
/* Print sub nodes. */
sub_node = node->node_head.next;
while (sub_node != (pj_xml_node*)&node->node_head) {
int printed;
if (SIZE_LEFT() < indent + 3)
return -1;
//*p++ = '\r';
*p++ = '\n';
printed = xml_print_node(sub_node, indent + 1, p, SIZE_LEFT());
if (printed < 0)
return -1;
p += printed;
sub_node = sub_node->next;
}
/* Content. */
if (node->content.slen) {
if (SIZE_LEFT() < node->content.slen) return -1;
pj_memcpy(p, node->content.ptr, node->content.slen);
p += node->content.slen;
}
/* Enclosing node. */
if (node->node_head.next != (pj_xml_node*)&node->node_head) {
if (SIZE_LEFT() < node->name.slen + 5 + indent)
return -1;
//*p++ = '\r';
*p++ = '\n';
for (i=0; i<indent; ++i)
*p++ = ' ';
} else {
if (SIZE_LEFT() < node->name.slen + 3)
return -1;
}
*p++ = '<';
*p++ = '/';
//.........这里部分代码省略.........
示例11: do_test
static int do_test(const char *title,
const struct registrar_cfg *srv_cfg,
const struct client *client_cfg,
const pj_str_t *registrar_uri,
unsigned contact_cnt,
const pj_str_t contacts[],
unsigned expires,
pj_bool_t leave_session,
pjsip_regc **p_regc)
{
pjsip_regc *regc;
unsigned i;
const pj_str_t aor = pj_str("<sip:[email protected]>");
pjsip_tx_data *tdata;
pj_status_t status;
PJ_LOG(3,(THIS_FILE, " %s", title));
/* Modify registrar settings */
pj_memcpy(®istrar.cfg, srv_cfg, sizeof(*srv_cfg));
pj_bzero(&client_result, sizeof(client_result));
client_result.destroy_on_cb = client_cfg->destroy_on_cb;
status = pjsip_regc_create(endpt, &client_result, &client_cb, ®c);
if (status != PJ_SUCCESS)
return -100;
status = pjsip_regc_init(regc, registrar_uri, &aor, &aor, contact_cnt,
contacts, expires ? expires : 60);
if (status != PJ_SUCCESS) {
pjsip_regc_destroy(regc);
return -110;
}
if (client_cfg->auth) {
pjsip_cred_info cred;
pj_bzero(&cred, sizeof(cred));
cred.realm = pj_str("*");
cred.scheme = pj_str("digest");
cred.username = pj_str("user");
cred.data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
cred.data = pj_str("password");
status = pjsip_regc_set_credentials(regc, 1, &cred);
if (status != PJ_SUCCESS) {
pjsip_regc_destroy(regc);
return -115;
}
}
/* Register */
status = pjsip_regc_register(regc, PJ_TRUE, &tdata);
if (status != PJ_SUCCESS) {
pjsip_regc_destroy(regc);
return -120;
}
status = pjsip_regc_send(regc, tdata);
/* That's it, wait until the callback is sent */
for (i=0; i<600 && !client_result.done; ++i) {
flush_events(100);
}
if (!client_result.done) {
PJ_LOG(3,(THIS_FILE, " error: test has timed out"));
pjsip_regc_destroy(regc);
return -200;
}
/* Destroy the regc, we're done with the test, unless we're
* instructed to leave the session open.
*/
if (!leave_session && !client_cfg->destroy_on_cb)
pjsip_regc_destroy(regc);
/* Compare results with expected results */
if (client_result.error != client_cfg->error) {
PJ_LOG(3,(THIS_FILE, " error: expecting err=%d, got err=%d",
client_cfg->error, client_result.error));
return -210;
}
if (client_result.code != client_cfg->code &&
client_cfg->code != 502 && client_cfg->code != 503 &&
client_result.code != 502 && client_result.code != 503)
{
PJ_LOG(3,(THIS_FILE, " error: expecting code=%d, got code=%d",
client_cfg->code, client_result.code));
return -220;
}
if (client_result.expiration != client_cfg->expiration) {
PJ_LOG(3,(THIS_FILE, " error: expecting expiration=%d, got expiration=%d",
client_cfg->expiration, client_result.expiration));
return -240;
}
if (client_result.contact_cnt != client_cfg->contact_cnt) {
PJ_LOG(3,(THIS_FILE, " error: expecting contact_cnt=%d, got contact_cnt=%d",
client_cfg->contact_cnt, client_result.contact_cnt));
//.........这里部分代码省略.........
示例12: PJ_DEF
//.........这里部分代码省略.........
local_af = pj_AF_INET();
} else if (pj_stricmp(&local_conn->addr_type, &ID_IP6)==0) {
local_af = pj_AF_INET6();
}
}
if (local_af==pj_AF_UNSPEC()) {
/* Unsupported address family */
return PJ_SUCCESS;
}
/* Set remote address: */
status = pj_sockaddr_init(local_af, &local_addr, &local_conn->addr,
local_m->desc.port);
if (status != PJ_SUCCESS) {
/* Invalid IP address. */
return PJMEDIA_EINVALIDIP;
}
/* Local and remote address family must match */
if (local_af != rem_af)
return PJ_EAFNOTSUP;
/* Media direction: */
if (local_m->desc.port == 0 ||
pj_sockaddr_has_addr(&local_addr)==PJ_FALSE ||
pj_sockaddr_has_addr(&si->rem_addr)==PJ_FALSE ||
pjmedia_sdp_media_find_attr(local_m, &STR_INACTIVE, NULL)!=NULL)
{
/* Inactive stream. */
si->dir = PJMEDIA_DIR_NONE;
} else if (pjmedia_sdp_media_find_attr(local_m, &STR_SENDONLY, NULL)!=NULL) {
/* Send only stream. */
si->dir = PJMEDIA_DIR_ENCODING;
} else if (pjmedia_sdp_media_find_attr(local_m, &STR_RECVONLY, NULL)!=NULL) {
/* Recv only stream. */
si->dir = PJMEDIA_DIR_DECODING;
} else {
/* Send and receive stream. */
si->dir = PJMEDIA_DIR_ENCODING_DECODING;
}
/* No need to do anything else if stream is rejected */
if (local_m->desc.port == 0) {
return PJ_SUCCESS;
}
/* If "rtcp" attribute is present in the SDP, set the RTCP address
* from that attribute. Otherwise, calculate from RTP address.
*/
attr = pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,
"rtcp", NULL);
if (attr) {
pjmedia_sdp_rtcp_attr rtcp;
status = pjmedia_sdp_attr_get_rtcp(attr, &rtcp);
if (status == PJ_SUCCESS) {
if (rtcp.addr.slen) {
status = pj_sockaddr_init(rem_af, &si->rem_rtcp, &rtcp.addr,
(pj_uint16_t)rtcp.port);
} else {
pj_sockaddr_init(rem_af, &si->rem_rtcp, NULL,
(pj_uint16_t)rtcp.port);
pj_memcpy(pj_sockaddr_get_addr(&si->rem_rtcp),
pj_sockaddr_get_addr(&si->rem_addr),
pj_sockaddr_get_addr_len(&si->rem_addr));
}
}
}
if (!pj_sockaddr_has_addr(&si->rem_rtcp)) {
int rtcp_port;
pj_memcpy(&si->rem_rtcp, &si->rem_addr, sizeof(pj_sockaddr));
rtcp_port = pj_sockaddr_get_port(&si->rem_addr) + 1;
pj_sockaddr_set_port(&si->rem_rtcp, (pj_uint16_t)rtcp_port);
}
/* Get codec info and param */
status = get_video_codec_info_param(si, pool, NULL, local_m, rem_m);
/* Leave SSRC to random. */
si->ssrc = pj_rand();
/* Set default jitter buffer parameter. */
si->jb_init = si->jb_max = si->jb_min_pre = si->jb_max_pre = -1;
return status;
}
示例13: and_stream_set_cap
/* API: set capability */
static pj_status_t and_stream_set_cap(pjmedia_vid_dev_stream *s,
pjmedia_vid_dev_cap cap,
const void *pval)
{
and_stream *strm = (and_stream*)s;
JNIEnv *jni_env;
pj_bool_t with_attach;
pj_status_t status = PJ_SUCCESS;
PJ_ASSERT_RETURN(s && pval, PJ_EINVAL);
switch (cap) {
case PJMEDIA_VID_DEV_CAP_SWITCH:
{
pjmedia_vid_dev_switch_param *p = (pjmedia_vid_dev_switch_param*)
pval;
and_dev_info *adi;
int res;
/* Just return if current and target device are the same */
if (strm->param.cap_id == p->target_id)
return PJ_SUCCESS;
/* Verify target capture ID */
if (p->target_id < 0 || p->target_id >= strm->factory->dev_count)
return PJ_EINVAL;
/* Ok, let's do the switch */
adi = &strm->factory->dev_info[p->target_id];
PJ_LOG(4, (THIS_FILE, "Switching camera to %s..", adi->info.name));
/* Call PjCamera::Start() method */
with_attach = jni_get_env(&jni_env);
res = (*jni_env)->CallIntMethod(jni_env, strm->jcam,
jobjs.cam.m_switch, adi->dev_idx);
if (res < 0) {
PJ_LOG(3, (THIS_FILE, "Failed to switch camera (err=%d)",
res));
status = PJMEDIA_EVID_SYSERR;
} else {
strm->param.cap_id = p->target_id;
/* If successful, set the orientation as well */
and_stream_set_cap(s, PJMEDIA_VID_DEV_CAP_ORIENTATION,
&strm->param.orient);
}
jni_detach_env(with_attach);
break;
}
case PJMEDIA_VID_DEV_CAP_ORIENTATION:
{
pjmedia_orient orient = *(pjmedia_orient *)pval;
pjmedia_orient eff_ori;
and_dev_info *adi;
pj_assert(orient >= PJMEDIA_ORIENT_UNKNOWN &&
orient <= PJMEDIA_ORIENT_ROTATE_270DEG);
if (orient == PJMEDIA_ORIENT_UNKNOWN)
return PJ_EINVAL;
pj_memcpy(&strm->param.orient, pval,
sizeof(strm->param.orient));
if (!strm->conv.conv) {
status = pjmedia_vid_dev_conv_create_converter(
&strm->conv, strm->pool,
&strm->param.fmt,
strm->cam_size,
strm->param.fmt.det.vid.size,
PJ_TRUE,
MAINTAIN_ASPECT_RATIO);
if (status != PJ_SUCCESS)
return status;
}
eff_ori = strm->param.orient;
adi = &strm->factory->dev_info[strm->param.cap_id];
/* Normalize the orientation for back-facing camera */
if (!adi->facing) {
if (eff_ori == PJMEDIA_ORIENT_ROTATE_90DEG)
eff_ori = PJMEDIA_ORIENT_ROTATE_270DEG;
else if (eff_ori == PJMEDIA_ORIENT_ROTATE_270DEG)
eff_ori = PJMEDIA_ORIENT_ROTATE_90DEG;
}
pjmedia_vid_dev_conv_set_rotation(&strm->conv, eff_ori);
PJ_LOG(4, (THIS_FILE, "Video capture orientation set to %d",
strm->param.orient));
break;
}
default:
status = PJMEDIA_EVID_INVCAP;
break;
}
//.........这里部分代码省略.........
示例14: pj_vpx_codec_encode_more
static pj_status_t pj_vpx_codec_encode_more(pjmedia_vid_codec *codec,
unsigned out_size, pjmedia_frame *output, pj_bool_t *has_more) {
vpx_private *vpx = (vpx_private*) codec->codec_data;
const vpx_codec_cx_pkt_t *pkt;
/* Default return */
*has_more = PJ_FALSE;
output->size = 0;
output->type = PJMEDIA_FRAME_TYPE_NONE;
if (vpx->enc_frame_len == 0) {
/*
* For now we assume that we have only one cx data here
* Which is probably fine as we do not ask encoder to bufferize
*/
//PJ_LOG(4, (THIS_FILE, "Encode one frame at %p", vpx->enc_iter));
pkt = vpx_codec_get_cx_data(&vpx->encoder, &vpx->enc_iter);
if (pkt == NULL ) {
if (!vpx->encoder.err) {
PJ_LOG(3, (THIS_FILE, "Encoder packet dropped"));
return PJ_SUCCESS;
} else {
PJ_LOG(1, (THIS_FILE, "Failed to get cx datas : %s", vpx_codec_err_to_string(vpx->encoder.err)));
return PJMEDIA_CODEC_EFAILED;
}
} else if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) {
pj_memcpy(vpx->enc_buf, pkt->data.frame.buf, pkt->data.frame.sz);
vpx->enc_frame_len = pkt->data.frame.sz;
vpx->enc_processed = 0;
vpx->enc_buf_is_keyframe = !!(pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? PJ_TRUE : PJ_FALSE;
//PJ_LOG(4, (THIS_FILE, "Encoded with 0 byte : %d", ((pj_uint8_t*)(vpx->enc_buf))[0]));
} else {
PJ_LOG(6, (THIS_FILE, "Vpx packet kind %d not taken into account", pkt->kind));
return PJ_SUCCESS;
}
}
// TODO we should support if iter not over too
if(vpx->enc_frame_len > 0) {
//PJ_LOG(4, (THIS_FILE, "We have an enc_frame : %d; max : %d", vpx->enc_frame_len, vpx->param.enc_mtu));
/* Reserve 1 octet for vp8 packetization info */
unsigned max_size = vpx->param.enc_mtu - 1;
unsigned remaining_size = vpx->enc_frame_len - vpx->enc_processed;
/* TODO : we could equally distributed packets sizes */
unsigned payload_len = PJ_MIN(remaining_size, max_size);
pj_uint8_t* p = (pj_uint8_t*) output->buf;
pj_uint8_t* s = (pj_uint8_t*) vpx->enc_buf;
//PJ_LOG(4, (THIS_FILE, "Payload : %d", payload_len));
output->type = PJMEDIA_FRAME_TYPE_VIDEO;
output->bit_info = 0;
if (vpx->enc_buf_is_keyframe) {
output->bit_info |= PJMEDIA_VID_FRM_KEYFRAME;
}
/* Set vp8 packetization info */
p[0] = 0;
if(vpx->enc_processed == 0)
p[0] |= 0x10;
if(!vpx->enc_buf_is_keyframe)
p[0] |= 0x20;
pj_memcpy( (p + 1), (s + vpx->enc_processed), payload_len);
output->size = payload_len + 1;
vpx->enc_processed += payload_len;
*has_more = !(vpx->enc_processed == vpx->enc_frame_len);
}
//PJ_LOG(4, (THIS_FILE, "Encoded size %d", output->size));
return PJ_SUCCESS;
}
示例15: print_session
static int print_session(const pjmedia_sdp_session *ses,
char *buf, pj_ssize_t len)
{
char *p = buf;
char *end = buf+len;
unsigned i;
int printed;
/* Check length for v= and o= lines. */
if (len < 5+
2+ses->origin.user.slen+18+
ses->origin.net_type.slen+ses->origin.addr.slen + 2)
{
return -1;
}
/* SDP version (v= line) */
pj_memcpy(p, "v=0\r\n", 5);
p += 5;
/* Owner (o=) line. */
*p++ = 'o';
*p++ = '=';
pj_memcpy(p, ses->origin.user.ptr, ses->origin.user.slen);
p += ses->origin.user.slen;
*p++ = ' ';
printed = pj_utoa(ses->origin.id, p);
p += printed;
*p++ = ' ';
printed = pj_utoa(ses->origin.version, p);
p += printed;
*p++ = ' ';
pj_memcpy(p, ses->origin.net_type.ptr, ses->origin.net_type.slen);
p += ses->origin.net_type.slen;
*p++ = ' ';
pj_memcpy(p, ses->origin.addr_type.ptr, ses->origin.addr_type.slen);
p += ses->origin.addr_type.slen;
*p++ = ' ';
pj_memcpy(p, ses->origin.addr.ptr, ses->origin.addr.slen);
p += ses->origin.addr.slen;
*p++ = '\r';
*p++ = '\n';
/* Session name (s=) line. */
if ((end-p) < 8+ses->name.slen) {
return -1;
}
*p++ = 's';
*p++ = '=';
pj_memcpy(p, ses->name.ptr, ses->name.slen);
p += ses->name.slen;
*p++ = '\r';
*p++ = '\n';
/* Connection line (c=) if exist. */
if (ses->conn) {
printed = print_connection_info(ses->conn, p, (int)(end-p));
if (printed < 1) {
return -1;
}
p += printed;
}
/* print optional bandwidth info. */
for (i=0; i<ses->bandw_count; ++i) {
printed = (int)print_bandw(ses->bandw[i], p, end-p);
if (printed < 1) {
return -1;
}
p += printed;
}
/* Time */
if ((end-p) < 24) {
return -1;
}
*p++ = 't';
*p++ = '=';
printed = pj_utoa(ses->time.start, p);
p += printed;
*p++ = ' ';
printed = pj_utoa(ses->time.stop, p);
p += printed;
*p++ = '\r';
*p++ = '\n';
/* Print all attribute (a=) lines. */
for (i=0; i<ses->attr_count; ++i) {
printed = (int)print_attr(ses->attr[i], p, end-p);
if (printed < 0) {
return -1;
}
p += printed;
}
/* Print media (m=) lines. */
for (i=0; i<ses->media_count; ++i) {
printed = print_media_desc(ses->media[i], p, (int)(end-p));
if (printed < 0) {
return -1;
//.........这里部分代码省略.........