CELT编码解码
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include "celt.h"
int
main(int argc, char **argv) {
char data[2048] = { };
short pcm[2048] = { };
int rate = 48000;
int framesize = 960;
int channels = 1;
int tmp;
int rem;
void *mode;
void *state;
uint16_t len;
while ((tmp = getopt(argc, argv, "r:f:c:")) != -1) {
switch (tmp) {
case 'r':
rate = atoi(optarg);
break;
case 'f':
framesize = atoi(optarg);
break;
case 'c':
channels = atoi(optarg);
break;
}
}
if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
return 1;
}
if (!(state = celt_decoder_create_custom(mode, channels, &tmp))) {
fprintf(stderr, "error: celt_decoder_create_custom: %s\n", celt_strerror(tmp));
celt_mode_destroy(mode);
return 1;
}
for (len = 0;;) {
if (!len) {
if (read(STDIN_FILENO, &len, sizeof(len)) != sizeof(len)) {
break;
}
if (len > sizeof(data)) {
fprintf(stderr, "error: celt packet larger than buffer\n");
celt_decoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
rem = len;
}
if ((tmp = read(STDIN_FILENO, data + (len - rem), rem)) < 0) {
fprintf(stderr, "error: read: %s\n", strerror(errno));
celt_decoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
if (!tmp) {
break;
}
if (tmp != rem) {
rem -= tmp;
continue;
}
if ((tmp = celt_decode(state, (void *)data, len, pcm, framesize)) < 0) {
fprintf(stderr, "error: celt_decode: %s\n", celt_strerror(tmp));
celt_decoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
len = 0;
if (write(STDOUT_FILENO, pcm, sizeof(*pcm) * framesize * channels) < 0) {
fprintf(stderr, "error: write: %s\n", strerror(errno));
celt_decoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
}
celt_decoder_destroy(state);
celt_mode_destroy(mode);
return 0;
}
编码: #include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include "celt.h"
int
main(int argc, char **argv) {
short pcm[2048] = { };
char data[2048] = { };
int rate = 48000;
int framesize = 960;
int channels = 1;
int bitrate = 0;
int variable = 0;
int prediction = 2;
int complexity = 10;
int tmp;
int rem;
void *mode;
void *state;
uint16_t len;
while ((tmp = getopt(argc, argv, "r:f:c:b:vp:x:")) != -1) {
switch (tmp) {
case 'r':
rate = atoi(optarg);
break;
case 'f':
framesize = atoi(optarg);
break;
case 'c':
channels = atoi(optarg);
break;
case 'b':
bitrate = atoi(optarg);
break;
case 'v':
variable = 1;
break;
case 'p':
prediction = atoi(optarg);
break;
case 'x':
complexity = atoi(optarg);
break;
}
}
if (!(mode = celt_mode_create(rate, framesize, &tmp))) {
fprintf(stderr, "error: celt_mode_create: %s\n", celt_strerror(tmp));
return 1;
}
if (!(state = celt_encoder_create_custom(mode, channels, &tmp))) {
fprintf(stderr, "error: celt_encoder_create_custom: %s\n", celt_strerror(tmp));
celt_mode_destroy(mode);
return 1;
}
if (bitrate && celt_encoder_ctl(state, CELT_SET_BITRATE(bitrate)) != CELT_OK) {
fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_BITRATE: bitrate request failed\n");
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
if (variable && celt_encoder_ctl(state, CELT_SET_VBR(variable)) != CELT_OK) {
fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_VBR: vbr request failed\n");
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
if (celt_encoder_ctl(state, CELT_SET_PREDICTION(prediction)) != CELT_OK) {
fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_PREDICTION: prediction request failed\n");
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
if (celt_encoder_ctl(state, CELT_SET_COMPLEXITY(complexity)) != CELT_OK) {
fprintf(stderr, "error: celt_encoder_ctl: CELT_SET_COMPLEXITY: complexity 0 through 10 is only supported\n");
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
for (len = 0;;) {
if (!len) {
len = sizeof(*pcm) * framesize * channels;
if (len > sizeof(pcm)) {
fprintf(stderr, "error: pcm frame larger than buffer\n");
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
rem = len;
}
if ((tmp = read(STDIN_FILENO, (void *)pcm + (len - rem), rem)) < 0) {
fprintf(stderr, "error: read: %s\n", strerror(errno));
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
if (!tmp) {
break;
}
if (tmp != rem) {
rem -= tmp;
continue;
}
if ((tmp = celt_encode(state, pcm, framesize, (void *)data, sizeof(data))) < 0) {
fprintf(stderr, "error: celt_encode: %s\n", celt_strerror(tmp));
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
len = tmp;
if (write(STDOUT_FILENO, &len, sizeof(len)) < 0 || write(STDOUT_FILENO, data, len) < 0) {
fprintf(stderr, "error: write: %s\n", strerror(errno));
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 1;
}
len = 0;
}
celt_encoder_destroy(state);
celt_mode_destroy(mode);
return 0;
}
总结
- 上一篇: 中国航发牵手阿里云共同打造:航空新引擎
- 下一篇: 搭建LAMP环境示例