⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makeann.c

📁 RTP Proxy,用于Voip网络数据的代理传递
💻 C
字号:
/* * Copyright (c) 2004-2006 Maxim Sobolev <sobomax@FreeBSD.org> * Copyright (c) 2006-2007 Sippy Software, Inc., http://www.sippysoft.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: makeann.c,v 1.9 2008/03/18 04:49:19 sobomax Exp $ * */#include <stdint.h>#include <err.h>#include <limits.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include "config.h"#include "g711.h"#ifdef ENABLE_G729#include "g729_encoder.h"#define G729_ENABLED 1#else#define G729_ENABLED 0#endif#ifdef ENABLE_GSM#include "gsm.h"#define GSM_ENABLED 1#else#define GSM_ENABLED 0#endif#include "rtp.h"#if BYTE_ORDER == BIG_ENDIAN#define LE16_2_HOST(x) \ ((((uint16_t)(x)) >> 8) & 0xff) | ((((uint16_t)(x)) & 0xff) << 8)#else#define LE16_2_HOST(x) (x)#endifstatic voidusage(void){    fprintf(stderr, "usage: makeann [-l limit [-L]] infile [outfile_template]\n");    exit(1);}struct efile {    FILE *f;    rtp_type_t pt;    int enabled;    char path[PATH_MAX + 1];};int main(int argc, char **argv){    FILE *infile;    uint8_t lawbuf[160];    int16_t slbuf[160];    int i, j, k, rsize, wsize, loop, limit, rlimit, ch;#ifdef ENABLE_G729    G729_CTX *ctx_g729;#endif#ifdef ENABLE_GSM    gsm ctx_gsm;#endif    const char *template;    struct efile efiles[] = {{NULL, RTP_PCMU, 1}, {NULL, RTP_GSM, GSM_ENABLED},      {NULL, RTP_G729, G729_ENABLED}, {NULL, RTP_PCMA, 1}, {NULL, -1, 0}};    loop = 0;    limit = -1;    while ((ch = getopt(argc, argv, "l:L")) != -1)        switch (ch) {        case 'l':            limit = atoi(optarg);            break;        case 'L':            loop = 1;            break;        case '?':        default:            usage();        }    argc -= optind;    argv += optind;    if (argc < 1 || argc > 2)        usage();    if (loop != 0 && limit == -1)        errx(1, "limit have to be specified in the loop mode");    if (argc == 2)        template = argv[1];    else        template = argv[0];#ifdef ENABLE_G729    ctx_g729 = g729_encoder_new();    if (ctx_g729 == NULL)        errx(1, "can't create G.729 encoder");#endif#ifdef ENABLE_GSM    ctx_gsm = gsm_create();    if (ctx_gsm == NULL)        errx(1, "can't create GSM encoder");#endif    infile = fopen(argv[0], "r");    if (infile == NULL)        err(1, "can't open %s for reading", argv[0]);    for (k = 0; efiles[k].pt != -1; k++) {        if (efiles[k].enabled == 0)            continue;        sprintf(efiles[k].path, "%s.%d", template, efiles[k].pt);        efiles[k].f = fopen(efiles[k].path, "w");        if (efiles[k].f == NULL)            err(1, "can't open %s for writing", efiles[k].path);    }    for (rlimit = limit; limit == -1 || rlimit > 0; rlimit -= i) {        rsize = (limit == -1 || rlimit > 160) ? 160 : rlimit;        i = fread(slbuf, sizeof(slbuf[0]), rsize, infile);        if (i < rsize && feof(infile) && loop != 0) {            rewind(infile);            i += fread(slbuf + i, sizeof(slbuf[0]), rsize - i, infile);        }        if (i == 0)            break;        for (j = 0; j < 160; j++) {            if (j < i)                slbuf[j] = LE16_2_HOST(slbuf[j]);            else                slbuf[j] = 0;        }        for (k = 0; efiles[k].pt != -1; k++) {            if (efiles[k].enabled == 0)                continue;            switch (efiles[k].pt) {            case RTP_PCMU:                SL2ULAW(lawbuf, slbuf, i);                wsize = i;                break;            case RTP_PCMA:                SL2ALAW(lawbuf, slbuf, i);                wsize = i;                break;#ifdef ENABLE_G729            case RTP_G729:                for (j = 0; j < 2; j++)                    g729_encode_frame(ctx_g729, &(slbuf[j * 80]), &(lawbuf[j * 10]));                wsize = 20;                break;#endif#ifdef ENABLE_GSM            case RTP_GSM:                gsm_encode(ctx_gsm, slbuf, lawbuf);                wsize = 33;                break;#endif            default:                abort();            }            if (fwrite(lawbuf, sizeof(lawbuf[0]), wsize, efiles[k].f) < wsize)                errx(1, "can't write to %s", efiles[k].path);        }    }    fclose(infile);    for (k = 0; efiles[k].pt != -1; k++) {        if (efiles[k].enabled == 0)            continue;        fclose(efiles[k].f);    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -