source: roaraudio/roard/codecfilter_celt.c @ 331:e4abcd91c94f

Last change on this file since 331:e4abcd91c94f was 331:e4abcd91c94f, checked in by phi, 16 years ago

seperated rest into i_rest and o_rest

File size: 3.3 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 while ( r <= (len - self->s_buf) ) {
124  if ( read(fh, &fs, 2) != 2 )
125   break;
126
127  fs = ROAR_NET2HOST16(fs);
128
129  if ( read(fh, self->ibuf, fs) != fs )
130   break;
131
132  cbuf = buf + r;
133
134  printf("buf=%p, r=%i // cbuf=%p\n", buf, r, cbuf);
135  if ( celt_decode(self->decoder, (unsigned char *) self->ibuf, fs, (celt_int16_t *) cbuf) < 0 )
136   break;
137
138  r += self->s_buf;
139 }
140
141 return r;
142}
143
144int cf_celt_write(CODECFILTER_USERDATA_T   inst, char * buf, int len) {
145 struct codecfilter_celt_inst * self = (struct codecfilter_celt_inst *) inst;
146
147 return 0;
148}
149
150//ll
Note: See TracBrowser for help on using the repository browser.