source: roaraudio/roard/codecfilter_celt.c @ 608:745a06132506

Last change on this file since 608:745a06132506 was 608:745a06132506, checked in by phi, 16 years ago

make codec filter fuse vio

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 r = 0;
118 uint16_t fs;
119 char * cbuf;
120
121// printf("buf=%p, len=%i\n", buf, len);
122
123 if ( self->fi_rest ) {
124  memcpy(buf, self->i_rest, self->fi_rest);
125  r += self->fi_rest;
126  self->fi_rest = 0;
127 }
128
129 while ( r <= (len - self->s_buf) ) {
130  if ( stream_vio_s_read(self->stream, &fs, 2) != 2 )
131   break;
132
133  fs = ROAR_NET2HOST16(fs);
134
135  if ( stream_vio_s_read(self->stream, self->ibuf, fs) != fs )
136   break;
137
138  cbuf = buf + r;
139
140//  printf("buf=%p, r=%i // cbuf=%p\n", buf, r, cbuf);
141  if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) cbuf) < 0 )
142   break;
143
144  r += self->s_buf;
145 }
146
147 if ( r < len ) {
148//  printf("r < len!\n");
149  if ( stream_vio_s_read(self->stream, &fs, 2) == 2 ) {
150   fs = ROAR_NET2HOST16(fs);
151//   printf("next: fs=%i\n", fs);
152   if ( stream_vio_s_read(self->stream, self->ibuf, fs) == fs ) {
153//    printf("got data!\n");
154    if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) self->obuf) >= 0 ) {
155//     printf("{ // decode rest\n");
156//     printf(" r=%i // need %i Bytes\n", r, len - r);
157//     printf(" memcpy(buf+%i, self->obuf, %i) = ?\n", r, len - r);
158     memcpy(buf+r, self->obuf, len - r);
159     self->fi_rest = self->s_buf + r - len;
160     memcpy(self->i_rest, self->obuf + len - r, self->fi_rest);
161//     printf(" len=%i, r=%i, fi_rest=%i, s_buf=%i\n", len, r, self->fi_rest, self->s_buf);
162     r = len;
163//     printf("}\n");
164    }
165   }
166  }
167 }
168
169 ROAR_DBG("cf_celt_read(inst=%p, buf=%p, len=%i) = %i", inst, buf, len, r);
170 return r;
171}
172
173int cf_celt_write(CODECFILTER_USERDATA_T   inst, char * buf, int len) {
174 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
175
176 return 0;
177}
178
179#endif
180//ll
Note: See TracBrowser for help on using the repository browser.