source: roaraudio/roard/codecfilter_celt.c @ 361:1d702adb724a

Last change on this file since 361:1d702adb724a was 361:1d702adb724a, checked in by phi, 16 years ago

only build CELT code if we habe CELT support

File size: 4.3 KB
Line 
1//codecfilter_celt.c:
2
3#include "roard.h"
4#ifdef ROAR_HAVE_LIBCELT
5
6int cf_celt_open(CODECFILTER_USERDATA_T * inst, int codec,
7                                            struct roar_stream_server * info,
8                                            struct roar_codecfilter   * filter) {
9 struct codecfilter_celt_inst * self = malloc(sizeof(struct codecfilter_celt_inst));
10 struct roar_stream * s = (struct roar_stream *) info;
11
12 if ( !self )
13  return -1;
14
15/*
16 CELTMode * mode;
17 CELTEncoder * encoder;
18 CELTDecoder * decoder;
19 int frame_size;
20 int lookahead;
21 int out_size;
22 char * ibuf;
23 char * obuf;
24 char * rest;
25 int s_buf;
26 int f_rest; /-* how much is in rest? *-/
27*/
28
29 self->stream               = info;
30 self->frame_size           = 256;
31 self->lookahead            = self->frame_size;
32 self->encoder              = NULL;
33 self->decoder              = NULL;
34 self->s_buf                = s->info.channels * self->frame_size * 2;
35 self->ibuf                 = malloc(self->s_buf);
36 self->obuf                 = malloc(self->s_buf);
37 self->i_rest               = malloc(self->s_buf);
38 self->o_rest               = malloc(self->s_buf);
39 self->fi_rest              = 0;
40 self->fo_rest              = 0;
41
42 if ( !(self->ibuf && self->obuf && self->i_rest && self->o_rest) ) {
43  if ( self->ibuf )
44   free(self->ibuf);
45
46  if ( self->obuf )
47   free(self->obuf);
48
49  if ( self->i_rest )
50   free(self->o_rest);
51
52  if ( self->o_rest )
53   free(self->o_rest);
54
55  free(self);
56  return -1;
57 }
58 
59 self->mode                 = celt_mode_create(s->info.rate, s->info.channels, self->frame_size, NULL);
60
61 if ( !self->mode ) {
62  free(self);
63  return -1;
64 }
65
66 if ( s->dir == ROAR_DIR_PLAY ) {
67   self->decoder = celt_decoder_create(self->mode);
68 } else if ( s->dir == ROAR_DIR_MONITOR ) {
69   self->encoder = celt_encoder_create(self->mode);
70 } else {
71  celt_mode_destroy(self->mode);
72  free(self);
73  return -1;
74 }
75
76 *inst = (CODECFILTER_USERDATA_T) self;
77
78 s->info.codec = ROAR_CODEC_DEFAULT;
79 s->info.bits  = 16; // CELT hardcoded
80
81 return 0;
82}
83
84int cf_celt_close(CODECFILTER_USERDATA_T   inst) {
85 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
86
87 if ( !inst )
88  return -1;
89
90 if ( self->encoder )
91 celt_encoder_destroy(self->encoder);
92
93 if ( self->decoder )
94 celt_decoder_destroy(self->decoder);
95
96 if ( self->mode )
97  celt_mode_destroy(self->mode);
98
99 if ( self->ibuf )
100  free(self->ibuf);
101
102 if ( self->obuf )
103  free(self->obuf);
104
105 if ( self->i_rest )
106  free(self->i_rest);
107
108 if ( self->o_rest )
109  free(self->o_rest);
110
111 free(inst);
112 return 0;
113}
114
115int cf_celt_read(CODECFILTER_USERDATA_T   inst, char * buf, int len) {
116 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
117 int fh = ((struct roar_stream *)self->stream)->fh;
118 int r = 0;
119 uint16_t fs;
120 char * cbuf;
121
122// printf("buf=%p, len=%i\n", buf, len);
123
124 if ( self->fi_rest ) {
125  memcpy(buf, self->i_rest, self->fi_rest);
126  r += self->fi_rest;
127  self->fi_rest = 0;
128 }
129
130 while ( r <= (len - self->s_buf) ) {
131  if ( read(fh, &fs, 2) != 2 )
132   break;
133
134  fs = ROAR_NET2HOST16(fs);
135
136  if ( read(fh, self->ibuf, fs) != fs )
137   break;
138
139  cbuf = buf + r;
140
141//  printf("buf=%p, r=%i // cbuf=%p\n", buf, r, cbuf);
142  if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) cbuf) < 0 )
143   break;
144
145  r += self->s_buf;
146 }
147
148 if ( r < len ) {
149//  printf("r < len!\n");
150  if ( read(fh, &fs, 2) == 2 ) {
151   fs = ROAR_NET2HOST16(fs);
152//   printf("next: fs=%i\n", fs);
153   if ( read(fh, self->ibuf, fs) == fs ) {
154//    printf("got data!\n");
155    if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) self->obuf) >= 0 ) {
156//     printf("{ // decode rest\n");
157//     printf(" r=%i // need %i Bytes\n", r, len - r);
158//     printf(" memcpy(buf+%i, self->obuf, %i) = ?\n", r, len - r);
159     memcpy(buf+r, self->obuf, len - r);
160     self->fi_rest = self->s_buf + r - len;
161     memcpy(self->i_rest, self->obuf + len - r, self->fi_rest);
162//     printf(" len=%i, r=%i, fi_rest=%i, s_buf=%i\n", len, r, self->fi_rest, self->s_buf);
163     r = len;
164//     printf("}\n");
165    }
166   }
167  }
168 }
169
170 ROAR_DBG("cf_celt_read(inst=%p, buf=%p, len=%i) = %i", inst, buf, len, r);
171 return r;
172}
173
174int cf_celt_write(CODECFILTER_USERDATA_T   inst, char * buf, int len) {
175 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
176
177 return 0;
178}
179
180#endif
181//ll
Note: See TracBrowser for help on using the repository browser.