Changeset 1238:3c0eaf049201 in roaraudio
- Timestamp:
- 02/26/09 03:05:26 (15 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
roarclients/roarvorbis.c
r861 r1238 153 153 ptr++; 154 154 } 155 156 *value = 0; 157 meta.key[0] = 0; 158 meta.type = ROAR_META_TYPE_NONE; 159 roar_stream_meta_set(con, s, ROAR_META_MODE_FINALIZE, &meta); 155 160 156 161 return 0; -
roard/codecfilter.c
r1224 r1238 88 88 ROAR_CODECFILTER_READ, 89 89 #endif 90 cf_vorbis_open, cf_vorbis_close, NULL, cf_vorbis_write, cf_vorbis_read, NULL, codecfilter_delay_fulldyn, NULL},90 cf_vorbis_open, cf_vorbis_close, NULL, cf_vorbis_write, cf_vorbis_read, NULL, codecfilter_delay_fulldyn, cf_vorbis_ctl}, 91 91 #else 92 92 #ifndef ROAR_WITHOUT_CF_CMD -
roard/codecfilter_vorbis.c
r1226 r1238 77 77 self->encoding = 0; 78 78 self->encoder.v_base_quality = 0.3; 79 self->encoder.srn = -1; 79 80 #endif 80 81 … … 180 181 vorbis_analysis_wrote(&(self->encoder.vd), i); 181 182 182 while ( vorbis_analysis_blockout(&(self->encoder.vd), &(self->encoder.vb)) == 1 ) { 183 vorbis_analysis(&(self->encoder.vb), &(self->encoder.op)); 184 vorbis_bitrate_addblock(&(self->encoder.vb)); 185 186 while ( vorbis_bitrate_flushpacket(&(self->encoder.vd), &(self->encoder.op)) ) { 187 ogg_stream_packetin(&(self->encoder.os), &(self->encoder.op)); 188 189 while( ogg_stream_pageout(&(self->encoder.os), &(self->encoder.og)) ) { 190 if ( 191 stream_vio_s_write(self->stream, self->encoder.og.header, self->encoder.og.header_len) == -1 || 192 stream_vio_s_write(self->stream, self->encoder.og.body, self->encoder.og.body_len ) == -1 ) { 193 return -1; 194 } 195 } 196 } 197 } 183 if ( cf_vorbis_encode_flushout(self) == -1 ) 184 return -1; 198 185 } 199 186 … … 342 329 int cf_vorbis_encode_start (struct codecfilter_vorbis_inst * self) { 343 330 #ifdef ROAR_HAVE_LIBVORBISENC 331 int srn = self->encoder.srn; // this value is allrady inited... 332 int len = 0; 333 int i; 334 int types[ROAR_META_MAX_PER_STREAM]; 335 int sid = ROAR_STREAM(self->stream)->id; 336 char val[LIBROAR_BUFFER_MSGDATA]; 337 338 val[LIBROAR_BUFFER_MSGDATA-1] = 0; 339 344 340 memset(&(self->encoder), 0, sizeof(self->encoder)); 345 341 346 342 self->encoding = 1; 343 self->encoder.srn = srn + 1;; 347 344 348 345 vorbis_info_init(&(self->encoder.vi)); … … 350 347 vorbis_comment_add_tag(&(self->encoder.vc), "SERVER", "RoarAudio"); 351 348 vorbis_comment_add_tag(&(self->encoder.vc), "ENCODER", "RoarAudio Vorbis codecfilter"); 349 350 if ( (len = stream_meta_list(sid, types, ROAR_META_MAX_PER_STREAM)) != -1 ) { 351 for (i = 0; i < len; i++) { 352 //int stream_meta_get (int id, int type, char * name, char * val, size_t len); 353 if ( stream_meta_get(sid, types[i], NULL, val, LIBROAR_BUFFER_MSGDATA-1) == 0 ) 354 vorbis_comment_add_tag(&(self->encoder.vc), roar_meta_strtype(types[i]), val); 355 } 356 } 352 357 353 358 if( vorbis_encode_init_vbr(&(self->encoder.vi), (long) ROAR_STREAM(self->stream)->info.channels, … … 362 367 vorbis_block_init(&(self->encoder.vd), &(self->encoder.vb)); 363 368 369 ROAR_WARN("cf_vorbis_encode_start(*): srn=%i", self->encoder.srn); 364 370 // "RA"<<16 + PID<<8 + Stream ID 365 ogg_stream_init(&(self->encoder.os), 0x52410000 + ((getpid() & 0xff)<<8) + (ROAR_STREAM(self->stream)->id & 0xff)); 371 ogg_stream_init(&(self->encoder.os), 372 ((0x5241 + self->encoder.srn)<<16) + 373 ((getpid() & 0xff )<< 8) + 374 ( sid & 0xff )); 366 375 return 0; 367 376 #else … … 373 382 #ifdef ROAR_HAVE_LIBVORBISENC 374 383 if ( self->encoding ) { 384 // try to flush up to an EOS page... 385 vorbis_analysis_buffer(&(self->encoder.vd), 2*ROAR_MAX_CHANNELS); 386 vorbis_analysis_wrote(&(self->encoder.vd), 0); 387 cf_vorbis_encode_flushout(self); 388 389 // clean up... 375 390 ogg_stream_clear(&(self->encoder.os)); 376 391 vorbis_block_clear(&(self->encoder.vb)); … … 386 401 } 387 402 403 int cf_vorbis_encode_flushout(struct codecfilter_vorbis_inst * self) { 404 #ifdef ROAR_HAVE_LIBVORBISENC 405 while ( vorbis_analysis_blockout(&(self->encoder.vd), &(self->encoder.vb)) == 1 ) { 406 vorbis_analysis(&(self->encoder.vb), &(self->encoder.op)); 407 vorbis_bitrate_addblock(&(self->encoder.vb)); 408 409 while ( vorbis_bitrate_flushpacket(&(self->encoder.vd), &(self->encoder.op)) ) { 410 ogg_stream_packetin(&(self->encoder.os), &(self->encoder.op)); 411 412 while( ogg_stream_pageout(&(self->encoder.os), &(self->encoder.og)) ) { 413 if ( 414 stream_vio_s_write(self->stream, self->encoder.og.header, self->encoder.og.header_len) == -1 || 415 stream_vio_s_write(self->stream, self->encoder.og.body, self->encoder.og.body_len ) == -1 ) { 416 return -1; 417 } 418 } 419 } 420 } 421 422 return 0; 423 #else 424 return -1; 425 #endif 426 } 427 428 int cf_vorbis_ctl(CODECFILTER_USERDATA_T inst, int cmd, void * data) { 429 struct codecfilter_vorbis_inst * self = (struct codecfilter_vorbis_inst *) inst; 430 431 switch (cmd) { 432 case ROAR_CODECFILTER_CTL2CMD(ROAR_CODECFILTER_CTL_META_UPDATE): 433 ROAR_WARN("stoping stream..."); 434 if ( cf_vorbis_encode_end(self) == -1 ) 435 return -1; 436 ROAR_WARN("restarting stream..."); 437 if ( cf_vorbis_encode_start(self) == -1 ) 438 return -1; 439 440 return 0; 441 break; 442 default: 443 return -1; 444 } 445 446 return -1; 447 } 448 388 449 #endif 389 450 //ll -
roard/include/codecfilter.h
r1224 r1238 35 35 #define ROAR_CODECFILTER_READ 1 36 36 #define ROAR_CODECFILTER_WRITE 2 37 38 39 #define ROAR_CODECFILTER_CTL_NOOP ROAR_STREAM_CTL_COMP_CF|0x0000 /* noop... */ 40 #define ROAR_CODECFILTER_CTL_BASE ROAR_STREAM_CTL_COMP_CF|0x0000 /* Base ops... */ 41 #define ROAR_CODECFILTER_CTL_META ROAR_STREAM_CTL_COMP_CF|0x1000 /* Meta data things... */ 42 43 #define ROAR_CODECFILTER_CTL_UPDATE 0x0001 44 45 #define ROAR_CODECFILTER_CTL_META_UPDATE ROAR_CODECFILTER_CTL_META|ROAR_CODECFILTER_CTL_UPDATE 46 47 #define ROAR_CODECFILTER_CTL2CMD(x) ((x) & (~ROAR_STREAM_CTL_COMP_CF)) 37 48 38 49 struct roar_codecfilter { -
roard/include/codecfilter_vorbis.h
r1226 r1238 48 48 int encoding; 49 49 struct { 50 int srn; 50 51 float v_base_quality; 51 52 ogg_stream_state os; … … 72 73 int cf_vorbis_read(CODECFILTER_USERDATA_T inst, char * buf, int len); 73 74 74 int cf_vorbis_update_stream (struct codecfilter_vorbis_inst * self); 75 int cf_vorbis_encode_start (struct codecfilter_vorbis_inst * self); 76 int cf_vorbis_encode_end (struct codecfilter_vorbis_inst * self); 75 int cf_vorbis_ctl(CODECFILTER_USERDATA_T inst, int cmd, void * data); 76 77 int cf_vorbis_update_stream (struct codecfilter_vorbis_inst * self); 78 int cf_vorbis_encode_start (struct codecfilter_vorbis_inst * self); 79 int cf_vorbis_encode_end (struct codecfilter_vorbis_inst * self); 80 int cf_vorbis_encode_flushout(struct codecfilter_vorbis_inst * self); 77 81 78 82 #endif -
roard/meta.c
r1040 r1238 223 223 } 224 224 } 225 226 // ask the codec filter to update meta data: 227 streams_ctl(co, ROAR_CODECFILTER_CTL_META_UPDATE, NULL); // ignore errors... 225 228 } 226 229 -
roard/streams.c
r1231 r1238 382 382 cmd &= ~comp; 383 383 384 ROAR_WARN("streams_ctl(id=%i, cmd=?, data=%p): comp=0x%.8x, cmd=0x%.4x", id, data, comp, cmd); 385 384 386 switch (comp) { 385 387 case ROAR_STREAM_CTL_COMP_BASE:
Note: See TracChangeset
for help on using the changeset viewer.