Changeset 689

Show
Ignore:
Timestamp:
2005-01-20 20:27:28 (4 years ago)
Author:
conrad
Message:

add support for basegranule, preroll, granuleshift throughout

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libannodex/trunk/include/annodex/anx_import.h

    r567 r689  
    155155  anx_int64_t current_granule; 
    156156  int eos; 
     157  anx_int64_t basegranule;/*< Base granule */ 
     158  int preroll;            /*< Preroll */ 
     159  int granuleshift;       /*< Granuleshift */ 
    157160}; 
    158161 
  • libannodex/trunk/include/annodex/anx_track.h

    r60 r689  
    9797                                   anx_int64_t granules); 
    9898 
     99/** 
     100 * Query the basegranule of a track in an annodex 
     101 * \param annodex an ANNODEX* handle 
     102 * \param serialno the serialno of the track to query 
     103 * \returns the basegranule 
     104 */ 
     105long anx_track_get_basegranule (ANNODEX * annodex, long serialno); 
     106 
     107/** 
     108 * Query the preroll of a track in an annodex 
     109 * \param annodex an ANNODEX* handle 
     110 * \param serialno the serialno of the track to query 
     111 * \returns the preroll 
     112 */ 
     113int anx_track_get_preroll (ANNODEX * annodex, long serialno); 
     114 
     115/** 
     116 * Query the granuleshift of a track in an annodex 
     117 * \param annodex an ANNODEX* handle 
     118 * \param serialno the serialno of the track to query 
     119 * \returns the granuleshift 
     120 */ 
     121int anx_track_get_granuleshift(ANNODEX * annodex, long serialno); 
     122 
    99123#ifdef __cplusplus 
    100124} 
  • libannodex/trunk/include/annodex/anx_types.h

    r566 r689  
    6969  anx_int64_t granule_rate_n;  /*< the granule rate numerator */ 
    7070  anx_int64_t granule_rate_d;  /*< the granule rate denominator */ 
     71  anx_int64_t basegranule;     /*< Base granule */ 
     72  int preroll;            /*< Preroll */ 
     73  int granuleshift;       /*< Granuleshift */ 
    7174}; 
    7275 
  • libannodex/trunk/src/importers/anx_import_anx.c

    r581 r689  
    157157static int 
    158158read_track (ANNODEX * anx, long serialno, char * id, char * content_type, 
    159                anx_int64_t granule_rate_n, anx_int64_t granule_rate_d, 
    160                int nr_header_packets, void * user_data) 
     159            anx_int64_t granule_rate_n, anx_int64_t granule_rate_d, 
     160            int nr_header_packets, void * user_data) 
    161161{ 
    162162  AnxAnxData * aad = (AnxAnxData *)user_data; 
     
    194194  } 
    195195 
     196  track->basegranule = anx_track_get_basegranule (anx, serialno); 
     197  track->preroll = anx_track_get_preroll (anx, serialno); 
     198  track->granuleshift = anx_track_get_granuleshift (anx, serialno); 
     199 
    196200  if (add_track (aad, serialno, track) == NULL) return -1; 
    197201 
     
    320324  m->custom_data = aad; 
    321325 
     326#ifdef DEBUG 
     327  printf ("anxanx_open: opening %s\n", path); 
     328#endif 
     329 
    322330  if ((anxr = anx_open ((char *)path, ANX_READ)) == NULL) 
    323331    return NULL; 
     
    354362  } 
    355363 
     364#ifdef DEBUG 
     365  printf ("anxanx_open: got media %p\n", (void *)m); 
     366#endif 
    356367 
    357368  return m; 
     
    362373{ 
    363374  AnxAnxData * aad = (AnxAnxData *)media->custom_data; 
     375 
     376#ifdef DEBUG 
     377  printf ("anxanx_read_update: in\n"); 
     378#endif 
    364379 
    365380 do_read: 
  • libannodex/trunk/src/importers/anx_import_ogg.c

    r599 r689  
    171171      track->granule_rate_d = 1; 
    172172      track->nr_header_packets = 3; 
     173      track->basegranule = 0; 
     174      track->preroll = 2; 
     175      track->granuleshift = 0; 
    173176    } else if (!strncmp ((char *)&op->packet[0], "Speex   ", 8)) { 
    174177      track->content_type = SPEEX_CONTENT_TYPE; 
     
    176179      track->granule_rate_d = 1; 
    177180      track->nr_header_packets = 2 + (ogg_int64_t) INT32_LE_AT(&header[68]); 
     181      track->basegranule = 0; 
     182      track->preroll = 0; 
     183      track->granuleshift = 0; 
    178184    } else if (!strncmp ((char *)&op->packet[1], "theora", 6)) { 
    179185      char keyframe_granule_shift = 0; 
     
    186192      keyframe_granule_shift |= (header[41] & 0xe0) /* 11100000 */ >> 5; 
    187193#endif 
     194 
     195#if USE_ANNODEX2_GRANULERATE 
    188196      track->granule_rate_n = INT32_BE_AT(&header[22]) * 
    189197        (1 << keyframe_granule_shift) / 1000000; 
    190198      track->granule_rate_d = INT32_BE_AT(&header[26]) / 1000000; 
     199#else /* anx v3 */ 
     200      track->granule_rate_n = INT32_BE_AT(&header[22]) / 1000000; 
     201      track->granule_rate_d = INT32_BE_AT(&header[26]) / 1000000; 
     202#endif 
    191203      track->nr_header_packets = 3; 
     204      track->basegranule = 0; 
     205      track->preroll = 0; 
     206      track->granuleshift = keyframe_granule_shift; 
    192207    } else if (!strncmp ((char *)&op->packet[1], "video", 5) &&  
    193208               !strncmp ((char *)&op->packet[9], "XVID", 4)) { 
     
    196211      track->granule_rate_d = 1; 
    197212      track->nr_header_packets = 2; 
     213      track->basegranule = 0; 
     214      track->preroll = 0; 
     215      track->granuleshift = 0; 
    198216    } else { 
    199217      anx_free (track); 
     
    309327  m->current_time = start_time; 
    310328 
    311   /* PADDING::: Fix here */ 
    312   aod = anx_malloc (sizeof (AnxOggData)); 
     329  aod = (AnxOggData *) anx_malloc (sizeof (AnxOggData)); 
    313330 
    314331#ifdef DEBUG 
  • libannodex/trunk/src/importers/anx_import_sndfile.c

    r567 r689  
    204204  track->current_granule = 0; 
    205205  track->eos = 0; 
     206 
     207  track->basegranule = 0; 
     208  track->preroll = 0; 
     209  track->granuleshift = 0; 
    206210 
    207211  if (end_time != -1.0) { 
  • libannodex/trunk/src/libannodex/anx_import.c

    r581 r689  
    364364                      long * nr_header_packets, 
    365365                      anx_int64_t * granule_rate_n, 
    366                       anx_int64_t * granule_rate_d) 
     366                      anx_int64_t * granule_rate_d, 
     367                      anx_int64_t * basegranule, 
     368                      int * preroll, int * granuleshift) 
    367369{ 
    368370  AnxList * l; 
     
    379381      *granule_rate_n = track->granule_rate_n; 
    380382      *granule_rate_d = track->granule_rate_d; 
     383      *basegranule = track->basegranule; 
     384      *preroll = track->preroll; 
     385      *granuleshift = track->granuleshift; 
    381386      return 0; 
    382387    } 
  • libannodex/trunk/src/libannodex/anx_import_private.h

    r581 r689  
    6868                       long * nr_header_packets, 
    6969                       anx_int64_t * granule_rate_n, 
    70                        anx_int64_t * granule_rate_d); 
     70                       anx_int64_t * granule_rate_d, 
     71                       anx_int64_t * basegranule, 
     72                       int * preroll, int * granuleshift); 
    7173 
    7274int anx_media_current_track (AnxSource * source); 
  • libannodex/trunk/src/libannodex/anx_read.c

    r677 r689  
    331331  track->granule_rate_d = _le_64 (*((ogg_int64_t *)&data[28])); 
    332332  track->nr_header_packets = _le_32 (*((ogg_int32_t *)&data[16])); 
     333  track->basegranule = _le_64 (*((ogg_int64_t *)&data[36])); 
     334  track->preroll = (int)_le_32 (*((ogg_int32_t *)&data[44])); 
     335  track->granuleshift = (int)(*((unsigned char *)&data[48])); 
    333336 
    334337  reader->tracks = anx_list_append (reader->tracks, track); 
    335338 
    336339#ifdef DEBUG 
    337   printf ("Got fisbone for serialno %010ld\n\tgranule_rate %ld/%ld\t%d headers\t%s\t%s\n", 
     340  printf ("Got fisbone for serialno %010ld\n\tgranule_rate %ld/%ld\t%ld headers\t%s\t%s\n", 
    338341          track->serialno, 
    339342          (long)track->granule_rate_n, 
    340343          (long)track->granule_rate_d, 
    341344          track->nr_header_packets, content_type, id); 
     345  printf ("\tbasegranule %lld\tpreroll %d\tgranuleshift %d\n", 
     346          track->basegranule, track->preroll, track->granuleshift); 
    342347#endif 
    343348 
  • libannodex/trunk/src/libannodex/anx_track.c

    r75 r689  
    5454  s->granule_rate_n = track->granule_rate_n; 
    5555  s->granule_rate_d = track->granule_rate_d; 
     56  s->basegranule = track->basegranule; 
     57  s->preroll = track->preroll; 
     58  s->granuleshift = track->granuleshift; 
     59 
     60#ifdef DEBUG 
     61  printf ("anx_track_clone: basegranule %lld\tpreroll %d\tgranuleshift %d\n", 
     62          s->basegranule, s->preroll, s->granuleshift); 
     63#endif 
    5664 
    5765  return s; 
     
    244252} 
    245253 
     254long 
     255anx_track_get_basegranule (ANNODEX * annodex, long serialno) 
     256{ 
     257  AnxTrack * track; 
     258   
     259  if (annodex == NULL) return -1L; 
     260   
     261  track = anx_get_track (annodex, serialno); 
     262   
     263  if (track == NULL || track->basegranule == -1) { 
     264    anx_set_error (annodex, ANX_ERR_NOTREADY); 
     265    return -1L; 
     266  } 
     267   
     268  return track->basegranule; 
     269} 
     270 
     271int 
     272anx_track_get_preroll (ANNODEX * annodex, long serialno) 
     273{ 
     274  AnxTrack * track; 
     275 
     276  if (annodex == NULL) return -1; 
     277 
     278  track = anx_get_track (annodex, serialno); 
     279 
     280  if (track == NULL || track->preroll == -1) { 
     281    anx_set_error (annodex, ANX_ERR_NOTREADY); 
     282    return -1; 
     283  } 
     284 
     285  return track->preroll; 
     286} 
     287 
     288int 
     289anx_track_get_granuleshift(ANNODEX * annodex, long serialno) 
     290{ 
     291  AnxTrack * track; 
     292 
     293  if (annodex == NULL) return -1; 
     294 
     295  track = anx_get_track (annodex, serialno); 
     296 
     297  if (track == NULL || track->granuleshift == -1) { 
     298    anx_set_error (annodex, ANX_ERR_NOTREADY); 
     299    return -1; 
     300  } 
     301 
     302  return track->granuleshift; 
     303} 
  • libannodex/trunk/src/libannodex/anx_write.c

    r675 r689  
    145145anx_writer_add_track (ANNODEX * annodex, AnxSource * media, int media_index, 
    146146                      char * id, char * content_type, long nr_header_packets, 
    147                       anx_int64_t granule_rate_n, anx_int64_t granule_rate_d) 
     147                      anx_int64_t granule_rate_n, anx_int64_t granule_rate_d, 
     148                      anx_int64_t basegranule, int preroll, int granuleshift) 
    148149{ 
    149150  AnxWriter * writer = &annodex->x.writer; 
     
    164165  track->granule_rate_n = granule_rate_n; 
    165166  track->granule_rate_d = granule_rate_d; 
     167  track->basegranule = basegranule; 
     168  track->preroll = preroll; 
     169  track->granuleshift = granuleshift; 
    166170 
    167171  wsub->media = media; 
     
    204208  long nr_header_packets; 
    205209  anx_int64_t granule_rate, rate_interval; 
     210  anx_int64_t basegranule; 
     211  int preroll, granuleshift; 
    206212 
    207213  if (media != NULL) { 
     
    209215      ret = anx_media_query_track (media, i, &id, &content_type, 
    210216                                   &nr_header_packets, 
    211                                    &granule_rate, &rate_interval); 
     217                                   &granule_rate, &rate_interval, 
     218                                   &basegranule, &preroll, &granuleshift); 
    212219 
    213220      if (ret < 0) break; 
     
    217224#endif 
    218225      anx_writer_add_track (annodex, media, i, id, content_type, 
    219                             nr_header_packets, granule_rate, rate_interval); 
     226                            nr_header_packets, granule_rate, rate_interval, 
     227                            basegranule, preroll, granuleshift); 
    220228    } 
    221229 
     
    468476  if (track == NULL) return -1; 
    469477 
     478#ifdef DEBUG 
     479  printf ("anx_init_fisbone_packet: basegranule %lld\tpreroll %d\tgranuleshift %d\n", 
     480          track->basegranule, track->preroll, track->granuleshift); 
     481#endif 
     482 
    470483  params = anx_params_append (params, "Content-Type", track->content_type); 
    471484  params = anx_params_append (params, "ID", track->id); 
     
    501514  b += 8; 
    502515 
    503   /* XXX: basegranule */ 
    504   *(ogg_int64_t *)b = _le_64 (0); 
    505   b += 8; 
    506  
    507   /* XXX: preroll */ 
    508   *(ogg_int64_t *)b = _le_32 (0); 
     516  *(ogg_int64_t *)b = _le_64 (track->basegranule); 
     517  b += 8; 
     518 
     519  *(ogg_int32_t *)b = _le_32 (track->preroll); 
    509520  b += 4; 
    510521 
    511   /* XXX: granuleshift */ 
    512   *(unsigned char *)b = 0; 
     522  *(unsigned char *)b = (unsigned char)track->granuleshift; 
    513523  b += 1; 
    514524 
     
    988998    if (writer->need_fishead) { 
    989999#ifdef DEBUG 
    990       printf ("anx_writer_sync: NEED mapping\n"); 
     1000      printf ("anx_writer_sync: NEED fishead\n"); 
    9911001#endif 
    9921002      anx_init_fishead_packet (annodex); 
     
    10371047    } else if (writer->need_fisbone) { 
    10381048#ifdef DEBUG 
    1039       printf ("anx_writer_sync: NEED anxdata\n"); 
     1049      printf ("anx_writer_sync: NEED fisbone\n"); 
    10401050#endif 
    10411051      for (l = writer->tracks; l; l = l->next) { 
     
    12901300  writer->anno_track.granule_rate_n = CMML_GRANULE_RATE_N; 
    12911301  writer->anno_track.granule_rate_d = CMML_GRANULE_RATE_D; 
     1302  writer->anno_track.basegranule = 0; 
     1303  writer->anno_track.preroll = 0; 
     1304  writer->anno_track.granuleshift = 0; 
    12921305 
    12931306  writer->eos = 0; /* end of stream */ 
  • libannodex/trunk/src/tools/anxinfo.c

    r85 r689  
    220220            s->id ? s->id : "-- unidentified --", 
    221221            s->serialno, buf, s->nr_header_packets, s->content_type); 
    222  
     222    printf ("\tbasegranule %lld\tpreroll %d\tgranuleshift %d\n", 
     223            s->basegranule, 
     224            s->preroll, 
     225            anx_track_get_granuleshift (anx, s->serialno)); 
    223226  } 
    224227