Changeset 1570

Show
Ignore:
Timestamp:
2005-10-07 02:02:14 (3 years ago)
Author:
conrad
Message:

use the correct granulepos on cmml eos packet. This was not being calculated
to include the CMML granuleshift, hence the granulepos was invalid (lower than
previous granulepos in the same track) and the cmml eos packet was not being
written into the stream. (closes ticket:163)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libannodex/trunk/src/libannodex/anx_write.c

    r1205 r1570  
    775775 
    776776static anx_int64_t 
     777anx_writer_cmml_granulepos_calc (ANNODEX * annodex, double timestamp) 
     778{ 
     779  AnxWriter * writer = &annodex->x.writer; 
     780  AnxTrack * track = &writer->cmml_track; 
     781  anx_int64_t granule, granulepos; 
     782 
     783  granule = (anx_int64_t)(timestamp * track->granule_rate_n / 
     784                          track->granule_rate_d); 
     785 
     786  granulepos = 
     787    (writer->cmml_prev_granule << CMML_GRANULESHIFT) | 
     788    (granule - writer->cmml_prev_granule); 
     789 
     790#ifdef DEBUG 
     791  printf ("anx_writer_cmml_granulepos_calc: prev_granule %llx, granule %llx, granulepos %llx\n", 
     792          writer->cmml_prev_granule, granule, granulepos); 
     793#endif 
     794 
     795  writer->cmml_prev_granule = granule; 
     796 
     797  return granulepos; 
     798} 
     799 
     800static anx_int64_t 
    777801anx_writer_cmml_granulepos (ANNODEX * annodex) 
    778802{ 
    779   AnxWriter * writer = &annodex->x.writer; 
    780   AnxTrack * track = &writer->cmml_track; 
    781803  AnxCommand command; 
    782804  AnxCommandData data; 
    783805  double command_time; 
    784   anx_int64_t granule, granulepos; 
    785806 
    786807  command = annodex->pending_command; 
     
    789810  data = anx_command_get_data (annodex, command); 
    790811  command_time = anx_command_get_time_offset (annodex, command); 
    791   granule = (anx_int64_t)(command_time * track->granule_rate_n / 
    792                           track->granule_rate_d); 
    793  
    794   granulepos = 
    795     (writer->cmml_prev_granule << CMML_GRANULESHIFT) | 
    796     (granule - writer->cmml_prev_granule); 
    797  
    798 #ifdef DEBUG 
    799   printf ("anx_writer_cmml_granulepos: prev_granule %llx, granule %llx, granulepos %llx\n", 
    800           writer->cmml_prev_granule, granule, granulepos); 
    801 #endif 
    802  
    803   writer->cmml_prev_granule = granule; 
    804  
    805   return granulepos; 
     812 
     813  return anx_writer_cmml_granulepos_calc (annodex, command_time); 
    806814} 
    807815 
     
    10401048anx_init_clip_eos_packet (ANNODEX * annodex) 
    10411049{ 
    1042   AnxWriter * writer = &annodex->x.writer; 
    1043   AnxTrack * track = &writer->cmml_track; 
    10441050  anx_int64_t granulepos; 
    10451051 
    1046   granulepos = (anx_int64_t)(anx_tell_time (annodex) * 
    1047                              track->granule_rate_n / 
    1048                              track->granule_rate_d); 
     1052  granulepos = 
     1053    anx_writer_cmml_granulepos_calc (annodex, anx_tell_time (annodex)); 
    10491054 
    10501055  return anx_init_eos_packet (annodex, annodex->cmml_serialno, granulepos);