且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

CELT编码解码

更新时间:2022-08-22 12:05:08

解码:

CELT编码解码 
CELT编码解码#include <stdio.h>
CELT编码解码#include <stdlib.h>
CELT编码解码#include <stdint.h>
CELT编码解码#include <string.h>
CELT编码解码#include <unistd.h>
CELT编码解码#include <errno.h>
CELT编码解码 
CELT编码解码#include "celt.h"
CELT编码解码 
CELT编码解码int
CELT编码解码main(int argc, char **argv) {
CELT编码解码    char data[2048] = { };
CELT编码解码    short pcm[2048] = { };
CELT编码解码    int rate        = 48000;
CELT编码解码    int framesize   = 960;
CELT编码解码    int channels    = 1;
CELT编码解码    int tmp;
CELT编码解码    int rem;
CELT编码解码    void *mode;
CELT编码解码    void *state;
CELT编码解码    uint16_t len;
CELT编码解码 
CELT编码解码    while ((tmp = getopt(argc, argv, "r:f:c:")) != -1) {
CELT编码解码        switch (tmp) {
CELT编码解码          case 'r':
CELT编码解码            rate = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'f':
CELT编码解码            framesize = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'c':
CELT编码解码            channels = atoi(optarg);
CELT编码解码            break;
CELT编码解码        }

CELT编码解码    }

CELT编码解码    if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
CELT编码解码        fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (!(state = celt_decoder_create_custom(mode, channels, &tmp))) {
CELT编码解码        fprintf(stderr, "error: celt_decoder_create_custom: %s\n", celt_strerror(tmp));
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码 
CELT编码解码    for (len = 0;;) {
CELT编码解码        if (!len) {
CELT编码解码            if (read(STDIN_FILENO, &len, sizeof(len)) != sizeof(len)) {
CELT编码解码                break;
CELT编码解码            }

CELT编码解码            if (len > sizeof(data)) {
CELT编码解码                fprintf(stderr, "error: celt packet larger than buffer\n");
CELT编码解码                celt_decoder_destroy(state);
CELT编码解码                celt_mode_destroy(mode);
CELT编码解码                return 1;
CELT编码解码            }

CELT编码解码            rem = len;
CELT编码解码        }

CELT编码解码        if ((tmp = read(STDIN_FILENO, data + (len - rem), rem)) < 0) {
CELT编码解码            fprintf(stderr, "error: read: %s\n", strerror(errno));
CELT编码解码            celt_decoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码        if (!tmp) {
CELT编码解码            break;
CELT编码解码        }

CELT编码解码        if (tmp != rem) {
CELT编码解码            rem -= tmp;
CELT编码解码            continue;
CELT编码解码        }

CELT编码解码        if ((tmp = celt_decode(state, (void *)data, len, pcm, framesize)) < 0) {
CELT编码解码            fprintf(stderr, "error: celt_decode: %s\n", celt_strerror(tmp));
CELT编码解码            celt_decoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码        len = 0;
CELT编码解码        if (write(STDOUT_FILENO, pcm, sizeof(*pcm) * framesize * channels) < 0) {
CELT编码解码            fprintf(stderr, "error: write: %s\n", strerror(errno));
CELT编码解码            celt_decoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码    }

CELT编码解码 
CELT编码解码    celt_decoder_destroy(state);
CELT编码解码    celt_mode_destroy(mode);
CELT编码解码 
CELT编码解码    return 0;
CELT编码解码}



编码:
CELT编码解码#include <stdio.h>
CELT编码解码#include <stdlib.h>
CELT编码解码#include <stdint.h>
CELT编码解码#include <string.h>
CELT编码解码#include <unistd.h>
CELT编码解码#include <errno.h>
CELT编码解码 
CELT编码解码#include "celt.h"
CELT编码解码 
CELT编码解码int
CELT编码解码main(int argc, char **argv) {
CELT编码解码    short pcm[2048] = { };
CELT编码解码    char data[2048] = { };
CELT编码解码    int rate        = 48000;
CELT编码解码    int framesize   = 960;
CELT编码解码    int channels    = 1;
CELT编码解码    int bitrate     = 0;
CELT编码解码    int variable    = 0;
CELT编码解码    int prediction  = 2;
CELT编码解码    int complexity  = 10;
CELT编码解码    int tmp;
CELT编码解码    int rem;
CELT编码解码    void *mode;
CELT编码解码    void *state;
CELT编码解码    uint16_t len;
CELT编码解码 
CELT编码解码    while ((tmp = getopt(argc, argv, "r:f:c:b:vp:x:")) != -1) {
CELT编码解码        switch (tmp) {
CELT编码解码          case 'r':
CELT编码解码            rate = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'f':
CELT编码解码            framesize = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'c':
CELT编码解码            channels = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'b':
CELT编码解码            bitrate = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'v':
CELT编码解码            variable = 1;
CELT编码解码            break;
CELT编码解码          case 'p':
CELT编码解码            prediction = atoi(optarg);
CELT编码解码            break;
CELT编码解码          case 'x':
CELT编码解码            complexity = atoi(optarg);
CELT编码解码            break;
CELT编码解码        }

CELT编码解码    }

CELT编码解码    if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
CELT编码解码        fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (!(state = celt_encoder_create_custom(mode, channels, &tmp))) {
CELT编码解码        fprintf(stderr, "error: celt_encoder_create_custom: %s\n", celt_strerror(tmp));
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (bitrate && celt_encoder_ctl(state, CELT_SET_BITRATE(bitrate)) != CELT_OK) {
CELT编码解码        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_BITRATE: bitrate request failed\n");
CELT编码解码        celt_encoder_destroy(state);
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (variable && celt_encoder_ctl(state, CELT_SET_VBR(variable)) != CELT_OK) {
CELT编码解码        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_VBR: vbr request failed\n");
CELT编码解码        celt_encoder_destroy(state);
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (celt_encoder_ctl(state, CELT_SET_PREDICTION(prediction)) != CELT_OK) {
CELT编码解码        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_PREDICTION: prediction request failed\n");
CELT编码解码        celt_encoder_destroy(state);
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码    if (celt_encoder_ctl(state, CELT_SET_COMPLEXITY(complexity)) != CELT_OK) {
CELT编码解码        fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_COMPLEXITY: complexity 0 through 10 is only supported\n");
CELT编码解码        celt_encoder_destroy(state);
CELT编码解码        celt_mode_destroy(mode);
CELT编码解码        return 1;
CELT编码解码    }

CELT编码解码 
CELT编码解码    for (len = 0;;) {
CELT编码解码        if (!len) {
CELT编码解码            len = sizeof(*pcm) * framesize * channels;
CELT编码解码            if (len > sizeof(pcm)) {
CELT编码解码                fprintf(stderr, "error: pcm frame larger than buffer\n");
CELT编码解码                celt_encoder_destroy(state);
CELT编码解码                celt_mode_destroy(mode);
CELT编码解码                return 1;
CELT编码解码            }

CELT编码解码            rem = len;
CELT编码解码        }

CELT编码解码        if ((tmp = read(STDIN_FILENO, (void *)pcm + (len - rem), rem)) < 0) {
CELT编码解码            fprintf(stderr, "error: read: %s\n", strerror(errno));
CELT编码解码            celt_encoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码        if (!tmp) {
CELT编码解码            break;
CELT编码解码        }

CELT编码解码        if (tmp != rem) {
CELT编码解码            rem -= tmp;
CELT编码解码            continue;
CELT编码解码        }

CELT编码解码        if ((tmp = celt_encode(state, pcm, framesize, (void *)data, sizeof(data))) < 0) {
CELT编码解码            fprintf(stderr, "error: celt_encode: %s\n", celt_strerror(tmp));
CELT编码解码            celt_encoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码        len = tmp;
CELT编码解码        if (write(STDOUT_FILENO, &len, sizeof(len)) < 0 || write(STDOUT_FILENO, data, len) < 0) {
CELT编码解码            fprintf(stderr, "error: write: %s\n", strerror(errno));
CELT编码解码            celt_encoder_destroy(state);
CELT编码解码            celt_mode_destroy(mode);
CELT编码解码            return 1;
CELT编码解码        }

CELT编码解码        len = 0;
CELT编码解码    }

CELT编码解码 
CELT编码解码    celt_encoder_destroy(state);
CELT编码解码    celt_mode_destroy(mode);
CELT编码解码 
CELT编码解码    return 0;
CELT编码解码}