source: roaraudio/roard/codecfilter_celt.c @ 609:093b3891d709

Last change on this file since 609:093b3891d709 was 609:093b3891d709, checked in by phi, 16 years ago

cleanup of casts

File size: 4.3 KB
RevLine 
[324]1//codecfilter_celt.c:
2
3#include "roard.h"
[361]4#ifdef ROAR_HAVE_LIBCELT
[324]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));
[609]10 struct roar_stream * s = ROAR_STREAM(info);
[324]11
12 if ( !self )
13  return -1;
14
[325]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
[324]29 self->stream               = info;
[325]30 self->frame_size           = 256;
31 self->lookahead            = self->frame_size;
32 self->encoder              = NULL;
33 self->decoder              = NULL;
[331]34 self->s_buf                = s->info.channels * self->frame_size * 2;
[326]35 self->ibuf                 = malloc(self->s_buf);
36 self->obuf                 = malloc(self->s_buf);
[331]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;
[326]41
[331]42 if ( !(self->ibuf && self->obuf && self->i_rest && self->o_rest) ) {
[326]43  if ( self->ibuf )
44   free(self->ibuf);
45
46  if ( self->obuf )
47   free(self->obuf);
48
[331]49  if ( self->i_rest )
50   free(self->o_rest);
51
52  if ( self->o_rest )
53   free(self->o_rest);
[326]54
55  free(self);
56  return -1;
57 }
58 
[350]59 self->mode                 = celt_mode_create(s->info.rate, s->info.channels, self->frame_size, NULL);
[325]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 }
[324]75
76 *inst = (CODECFILTER_USERDATA_T) self;
77
[326]78 s->info.codec = ROAR_CODEC_DEFAULT;
79 s->info.bits  = 16; // CELT hardcoded
[324]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
[325]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
[327]99 if ( self->ibuf )
100  free(self->ibuf);
101
102 if ( self->obuf )
103  free(self->obuf);
104
[331]105 if ( self->i_rest )
106  free(self->i_rest);
107
108 if ( self->o_rest )
109  free(self->o_rest);
[327]110
[324]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;
[328]117 int r = 0;
118 uint16_t fs;
[331]119 char * cbuf;
120
121// printf("buf=%p, len=%i\n", buf, len);
[324]122
[332]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
[328]129 while ( r <= (len - self->s_buf) ) {
[608]130  if ( stream_vio_s_read(self->stream, &fs, 2) != 2 )
[328]131   break;
132
133  fs = ROAR_NET2HOST16(fs);
134
[608]135  if ( stream_vio_s_read(self->stream, self->ibuf, fs) != fs )
[328]136   break;
137
[331]138  cbuf = buf + r;
139
[332]140//  printf("buf=%p, r=%i // cbuf=%p\n", buf, r, cbuf);
[331]141  if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) cbuf) < 0 )
[328]142   break;
143
144  r += self->s_buf;
145 }
146
[332]147 if ( r < len ) {
148//  printf("r < len!\n");
[608]149  if ( stream_vio_s_read(self->stream, &fs, 2) == 2 ) {
[332]150   fs = ROAR_NET2HOST16(fs);
151//   printf("next: fs=%i\n", fs);
[608]152   if ( stream_vio_s_read(self->stream, self->ibuf, fs) == fs ) {
[332]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
[333]169 ROAR_DBG("cf_celt_read(inst=%p, buf=%p, len=%i) = %i", inst, buf, len, r);
[328]170 return r;
[324]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
[361]179#endif
[324]180//ll
Note: See TracBrowser for help on using the repository browser.