Changeset 1238:3c0eaf049201 in roaraudio


Ignore:
Timestamp:
02/26/09 03:05:26 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

done a lot to support meta data updates on encoding vorbis streams with meta flag set :), need cleanup.

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • roarclients/roarvorbis.c

    r861 r1238  
    153153   ptr++; 
    154154 } 
     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); 
    155160 
    156161 return 0; 
  • roard/codecfilter.c

    r1224 r1238  
    8888 ROAR_CODECFILTER_READ, 
    8989#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}, 
    9191#else 
    9292#ifndef ROAR_WITHOUT_CF_CMD 
  • roard/codecfilter_vorbis.c

    r1226 r1238  
    7777 self->encoding               = 0; 
    7878 self->encoder.v_base_quality = 0.3; 
     79 self->encoder.srn            = -1; 
    7980#endif 
    8081 
     
    180181  vorbis_analysis_wrote(&(self->encoder.vd), i); 
    181182 
    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; 
    198185 } 
    199186 
     
    342329int cf_vorbis_encode_start  (struct codecfilter_vorbis_inst * self) { 
    343330#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 
    344340  memset(&(self->encoder), 0, sizeof(self->encoder)); 
    345341 
    346342  self->encoding = 1; 
     343  self->encoder.srn = srn + 1;; 
    347344 
    348345  vorbis_info_init(&(self->encoder.vi)); 
     
    350347  vorbis_comment_add_tag(&(self->encoder.vc), "SERVER", "RoarAudio"); 
    351348  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  } 
    352357 
    353358  if( vorbis_encode_init_vbr(&(self->encoder.vi), (long) ROAR_STREAM(self->stream)->info.channels, 
     
    362367  vorbis_block_init(&(self->encoder.vd), &(self->encoder.vb)); 
    363368 
     369  ROAR_WARN("cf_vorbis_encode_start(*): srn=%i", self->encoder.srn); 
    364370                                     //  "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               )); 
    366375 return 0; 
    367376#else 
     
    373382#ifdef ROAR_HAVE_LIBVORBISENC 
    374383 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... 
    375390  ogg_stream_clear(&(self->encoder.os)); 
    376391  vorbis_block_clear(&(self->encoder.vb)); 
     
    386401} 
    387402 
     403int 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 
     428int 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 
    388449#endif 
    389450//ll 
  • roard/include/codecfilter.h

    r1224 r1238  
    3535#define ROAR_CODECFILTER_READ  1 
    3636#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)) 
    3748 
    3849struct roar_codecfilter { 
  • roard/include/codecfilter_vorbis.h

    r1226 r1238  
    4848 int encoding; 
    4949 struct { 
     50  int srn; 
    5051  float v_base_quality; 
    5152  ogg_stream_state os; 
     
    7273int cf_vorbis_read(CODECFILTER_USERDATA_T   inst, char * buf, int len); 
    7374 
    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); 
     75int cf_vorbis_ctl(CODECFILTER_USERDATA_T   inst, int cmd, void * data); 
     76 
     77int cf_vorbis_update_stream  (struct codecfilter_vorbis_inst * self); 
     78int cf_vorbis_encode_start   (struct codecfilter_vorbis_inst * self); 
     79int cf_vorbis_encode_end     (struct codecfilter_vorbis_inst * self); 
     80int cf_vorbis_encode_flushout(struct codecfilter_vorbis_inst * self); 
    7781 
    7882#endif 
  • roard/meta.c

    r1040 r1238  
    223223   } 
    224224  } 
     225 
     226  // ask the codec filter to update meta data: 
     227  streams_ctl(co, ROAR_CODECFILTER_CTL_META_UPDATE, NULL); // ignore errors... 
    225228 } 
    226229 
  • roard/streams.c

    r1231 r1238  
    382382 cmd &= ~comp; 
    383383 
     384 ROAR_WARN("streams_ctl(id=%i, cmd=?, data=%p): comp=0x%.8x, cmd=0x%.4x", id, data, comp, cmd); 
     385 
    384386 switch (comp) { 
    385387  case ROAR_STREAM_CTL_COMP_BASE: 
Note: See TracChangeset for help on using the changeset viewer.