source: roaraudio/roard/codecfilter_celt.c @ 333:944e807946af

Last change on this file since 333:944e807946af was 333:944e807946af, checked in by phi, 16 years ago

printf() -> ROAR_DBG()

File size: 4.2 KB
Line 
1//codecfilter_celt.c:
2
3#include "roard.h"
4
5int cf_celt_open(CODECFILTER_USERDATA_T * inst, int codec,
6                                            struct roar_stream_server * info,
7                                            struct roar_codecfilter   * filter) {
8 struct codecfilter_celt_inst * self = malloc(sizeof(struct codecfilter_celt_inst));
9 struct roar_stream * s = (struct roar_stream *) info;
10
11 if ( !self )
12  return -1;
13
14/*
15 CELTMode * mode;
16 CELTEncoder * encoder;
17 CELTDecoder * decoder;
18 int frame_size;
19 int lookahead;
20 int out_size;
21 char * ibuf;
22 char * obuf;
23 char * rest;
24 int s_buf;
25 int f_rest; /-* how much is in rest? *-/
26*/
27
28 self->stream               = info;
29 self->frame_size           = 256;
30 self->lookahead            = self->frame_size;
31 self->encoder              = NULL;
32 self->decoder              = NULL;
33 self->s_buf                = s->info.channels * self->frame_size * 2;
34 self->ibuf                 = malloc(self->s_buf);
35 self->obuf                 = malloc(self->s_buf);
36 self->i_rest               = malloc(self->s_buf);
37 self->o_rest               = malloc(self->s_buf);
38 self->fi_rest              = 0;
39 self->fo_rest              = 0;
40
41 if ( !(self->ibuf && self->obuf && self->i_rest && self->o_rest) ) {
42  if ( self->ibuf )
43   free(self->ibuf);
44
45  if ( self->obuf )
46   free(self->obuf);
47
48  if ( self->i_rest )
49   free(self->o_rest);
50
51  if ( self->o_rest )
52   free(self->o_rest);
53
54  free(self);
55  return -1;
56 }
57 
58 self->mode                 = celt_mode_create(s->info.rate, s->info.channels, self->frame_size, self->lookahead, NULL);
59
60 if ( !self->mode ) {
61  free(self);
62  return -1;
63 }
64
65 if ( s->dir == ROAR_DIR_PLAY ) {
66   self->decoder = celt_decoder_create(self->mode);
67 } else if ( s->dir == ROAR_DIR_MONITOR ) {
68   self->encoder = celt_encoder_create(self->mode);
69 } else {
70  celt_mode_destroy(self->mode);
71  free(self);
72  return -1;
73 }
74
75 *inst = (CODECFILTER_USERDATA_T) self;
76
77 s->info.codec = ROAR_CODEC_DEFAULT;
78 s->info.bits  = 16; // CELT hardcoded
79
80 return 0;
81}
82
83int cf_celt_close(CODECFILTER_USERDATA_T   inst) {
84 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
85
86 if ( !inst )
87  return -1;
88
89 if ( self->encoder )
90 celt_encoder_destroy(self->encoder);
91
92 if ( self->decoder )
93 celt_decoder_destroy(self->decoder);
94
95 if ( self->mode )
96  celt_mode_destroy(self->mode);
97
98 if ( self->ibuf )
99  free(self->ibuf);
100
101 if ( self->obuf )
102  free(self->obuf);
103
104 if ( self->i_rest )
105  free(self->i_rest);
106
107 if ( self->o_rest )
108  free(self->o_rest);
109
110 free(inst);
111 return 0;
112}
113
114int cf_celt_read(CODECFILTER_USERDATA_T   inst, char * buf, int len) {
115 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
116 int fh = ((struct roar_stream *)self->stream)->fh;
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 ( read(fh, &fs, 2) != 2 )
131   break;
132
133  fs = ROAR_NET2HOST16(fs);
134
135  if ( read(fh, 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 ( read(fh, &fs, 2) == 2 ) {
150   fs = ROAR_NET2HOST16(fs);
151//   printf("next: fs=%i\n", fs);
152   if ( read(fh, 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//ll
Note: See TracBrowser for help on using the repository browser.