Ejemplo n.º 1
0
XenkoCelt::~XenkoCelt()
{
	if (encoder_) opus_custom_encoder_destroy(encoder_);
	encoder_ = nullptr;
	if (decoder_) opus_custom_decoder_destroy(decoder_);
	decoder_ = nullptr;
	if (mode_) opus_custom_mode_destroy(mode_);
	mode_ = nullptr;
}
Ejemplo n.º 2
0
void netjack_detach( netjack_driver_state_t *netj )
{
    JSList * node;

    for (node = netj->capture_ports; node; node = jack_slist_next (node))
        jack_port_unregister (netj->client,
                              ((jack_port_t *) node->data));

    jack_slist_free (netj->capture_ports);
    netj->capture_ports = NULL;

    for (node = netj->capture_srcs; node; node = jack_slist_next (node)) {
#if HAVE_CELT
        if( netj->bitdepth == CELT_MODE ) {
            CELTDecoder * decoder = node->data;
            celt_decoder_destroy(decoder);
        } else
#endif
#if HAVE_OPUS
        if ( netj->bitdepth == OPUS_MODE ) {
            OpusCustomDecoder * decoder = node->data;
            opus_custom_decoder_destroy(decoder);
        } else
#endif
        {
#if HAVE_SAMPLERATE
            SRC_STATE * src = node->data;
            src_delete(src);
#endif
        }
    }
    jack_slist_free (netj->capture_srcs);
    netj->playback_srcs = NULL;

    for (node = netj->playback_ports; node; node = jack_slist_next (node))
        jack_port_unregister (netj->client,
                              ((jack_port_t *) node->data));

    jack_slist_free (netj->playback_ports);
    netj->playback_ports = NULL;

    for (node = netj->playback_srcs; node; node = jack_slist_next (node)) {
#if HAVE_CELT
        if( netj->bitdepth == CELT_MODE ) {
            CELTEncoder * encoder = node->data;
            celt_encoder_destroy(encoder);
        } else
#endif
#if HAVE_OPUS
        if ( netj->bitdepth == OPUS_MODE ) {
            OpusCustomEncoder * encoder = node->data;
            opus_custom_encoder_destroy(encoder);
        } else
#endif
        {
#if HAVE_SAMPLERATE
            SRC_STATE * src = node->data;
            src_delete(src);
#endif
        }
    }
    jack_slist_free (netj->playback_srcs);
    netj->playback_srcs = NULL;

#if HAVE_CELT
    if( netj->bitdepth == CELT_MODE )
        celt_mode_destroy(netj->celt_mode);
#endif
#if HAVE_OPUS
    if( netj->bitdepth == OPUS_MODE )
        opus_custom_mode_destroy(netj->opus_mode);
#endif
}
Ejemplo n.º 3
0
int main(int argc, char *argv[])
{
    int err;
    char *inFile, *outFile;
    FILE *fin, *fout;
    OpusCustomMode *mode=NULL;
    OpusCustomEncoder *enc;
    OpusCustomDecoder *dec;
    int len;
    opus_int32 frame_size, channels, rate;
    int bytes_per_packet;
    unsigned char data[MAX_PACKET];
    int complexity;
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
    int i;
    double rmsd = 0;
#endif
    int count = 0;
    opus_int32 skip;
    opus_int16 *in, *out;
    if (argc != 9 && argc != 8 && argc != 7)
    {
        fprintf (stderr, "Usage: test_opus_custom <rate> <channels> <frame size> "
                 " <bytes per packet> [<complexity> [packet loss rate]] "
                 "<input> <output>\n");
        return 1;
    }

    rate = (opus_int32)atol(argv[1]);
    channels = atoi(argv[2]);
    frame_size = atoi(argv[3]);
    mode = opus_custom_mode_create(rate, frame_size, NULL);
    if (mode == NULL)
    {
        fprintf(stderr, "failed to create a mode\n");
        return 1;
    }

    bytes_per_packet = atoi(argv[4]);
    if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET)
    {
        fprintf (stderr, "bytes per packet must be between 0 and %d\n",
                 MAX_PACKET);
        return 1;
    }

    inFile = argv[argc-2];
    fin = fopen(inFile, "rb");
    if (!fin)
    {
        fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
        return 1;
    }
    outFile = argv[argc-1];
    fout = fopen(outFile, "wb+");
    if (!fout)
    {
        fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
        fclose(fin);
        return 1;
    }

    enc = opus_custom_encoder_create(mode, channels, &err);
    if (err != 0)
    {
        fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err));
        fclose(fin);
        fclose(fout);
        return 1;
    }
    dec = opus_custom_decoder_create(mode, channels, &err);
    if (err != 0)
    {
        fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err));
        fclose(fin);
        fclose(fout);
        return 1;
    }
    opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip));

    if (argc>7)
    {
        complexity=atoi(argv[5]);
        opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity));
    }

    in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
    out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));

    while (!feof(fin))
    {
        int ret;
        err = fread(in, sizeof(short), frame_size*channels, fin);
        if (feof(fin))
            break;
        len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet);
        if (len <= 0)
            fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len));

        /* This is for simulating bit errors */
#if 0
        int errors = 0;
        int eid = 0;
        /* This simulates random bit error */
        for (i=0; i<len*8; i++)
        {
            if (rand()%atoi(argv[8])==0)
            {
                if (i<64)
                {
                    errors++;
                    eid = i;
                }
                data[i/8] ^= 1<<(7-(i%8));
            }
        }
        if (errors == 1)
            data[eid/8] ^= 1<<(7-(eid%8));
        else if (errors%2 == 1)
            data[rand()%8] ^= 1<<rand()%8;
#endif

#if 1 /* Set to zero to use the encoder's output instead */
        /* This is to simulate packet loss */
        if (argc==9 && rand()%1000<atoi(argv[argc-3]))
            /*if (errors && (errors%2==0))*/
            ret = opus_custom_decode(dec, NULL, len, out, frame_size);
        else
            ret = opus_custom_decode(dec, data, len, out, frame_size);
        if (ret < 0)
            fprintf(stderr, "opus_custom_decode() failed: %s\n", opus_strerror(ret));
#else
        for (i=0; i<ret*channels; i++)
            out[i] = in[i];
#endif
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
        for (i=0; i<ret*channels; i++)
        {
            rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
            /*out[i] -= in[i];*/
        }
#endif
        count++;
        fwrite(out+skip*channels, sizeof(short), (ret-skip)*channels, fout);
        skip = 0;
    }
    PRINT_MIPS(stderr);

    opus_custom_encoder_destroy(enc);
    opus_custom_decoder_destroy(dec);
    fclose(fin);
    fclose(fout);
    opus_custom_mode_destroy(mode);
    free(in);
    free(out);
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
    if (rmsd > 0)
    {
        rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
        fprintf (stderr, "Error: encoder doesn't match decoder\n");
        fprintf (stderr, "RMS mismatch is %f\n", rmsd);
        return 1;
    } else {
        fprintf (stderr, "Encoder matches decoder!!\n");
    }
#endif
    return 0;
}