Changeset 834

Show
Ignore:
Timestamp:
2005-02-04 17:51:11 (4 years ago)
Author:
conrad
Message:

centralize internal metrics, add accessors for granuleshift, granulerate

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • liboggz/trunk/src/liboggz/Makefile.am

    r806 r834  
    2020        oggz_table.c \ 
    2121        oggz_vector.c oggz_vector.h \ 
    22         metric_granuleshift.c \ 
    2322        metric_linear.c 
    2423 
  • liboggz/trunk/src/liboggz/metric_linear.c

    r817 r834  
    3636 
    3737static ogg_int64_t 
     38oggz_metric_default_granuleshift (OGGZ * oggz, long serialno, 
     39                                  ogg_int64_t granulepos, void * user_data) 
     40{ 
     41  oggz_stream_t * stream; 
     42  ogg_int64_t iframe, pframe; 
     43  ogg_int64_t units; 
     44 
     45  stream = oggz_get_stream (oggz, serialno); 
     46  if (stream == NULL) return -1; 
     47 
     48  iframe = granulepos >> stream->granuleshift; 
     49  pframe = granulepos - (iframe << stream->granuleshift); 
     50  granulepos = (iframe + pframe); 
     51 
     52  units = granulepos * stream->granulerate_d / stream->granulerate_n; 
     53 
     54#ifdef DEBUG 
     55  printf ("oggz_..._granuleshift: serialno %010ld Got frame %lld (%lld + %lld): %lld units\n", 
     56          serialno, granulepos, iframe, pframe, units); 
     57#endif 
     58 
     59  return units; 
     60} 
     61 
     62static ogg_int64_t 
    3863oggz_metric_default_linear (OGGZ * oggz, long serialno, ogg_int64_t granulepos, 
    3964                            void * user_data) 
     
    4772} 
    4873 
     74static int 
     75oggz_metric_update (OGGZ * oggz, long serialno) 
     76{ 
     77  oggz_stream_t * stream; 
     78 
     79  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     80 
     81  stream = oggz_get_stream (oggz, serialno); 
     82  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
     83 
     84  /* we divide by the granulerate, ie. mult by gr_d/gr_n, so ensure 
     85   * numerator is non-zero */ 
     86  if (stream->granulerate_n == 0) { 
     87    stream->granulerate_n= 1; 
     88    stream->granulerate_d = 0; 
     89  } 
     90 
     91  if (stream->granuleshift == 0) { 
     92    return oggz_set_metric_internal (oggz, serialno, 
     93                                     oggz_metric_default_linear, 
     94                                     NULL, 1); 
     95  } else { 
     96    return oggz_set_metric_internal (oggz, serialno, 
     97                                     oggz_metric_default_granuleshift, 
     98                                     NULL, 1); 
     99  } 
     100} 
     101 
     102int 
     103oggz_set_granuleshift (OGGZ * oggz, long serialno, int granuleshift) 
     104{ 
     105  oggz_stream_t * stream; 
     106 
     107  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     108 
     109  stream = oggz_get_stream (oggz, serialno); 
     110  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
     111 
     112  stream->granuleshift = granuleshift; 
     113 
     114  return oggz_metric_update (oggz, serialno); 
     115} 
     116 
     117int 
     118oggz_get_granuleshift (OGGZ * oggz, long serialno) 
     119{ 
     120  oggz_stream_t * stream; 
     121 
     122  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     123 
     124  stream = oggz_get_stream (oggz, serialno); 
     125  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
     126 
     127  return stream->granuleshift; 
     128} 
     129 
     130int 
     131oggz_set_granulerate (OGGZ * oggz, long serialno, 
     132                      ogg_int64_t granule_rate_numerator, 
     133                      ogg_int64_t granule_rate_denominator) 
     134{ 
     135  oggz_stream_t * stream; 
     136 
     137  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     138 
     139  stream = oggz_get_stream (oggz, serialno); 
     140  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
     141 
     142  stream->granulerate_n = granule_rate_numerator; 
     143  stream->granulerate_d = granule_rate_denominator; 
     144 
     145  return oggz_metric_update (oggz, serialno); 
     146} 
     147 
     148int 
     149oggz_get_granulerate (OGGZ * oggz, long serialno, 
     150                      ogg_int64_t * granulerate_n, 
     151                      ogg_int64_t * granulerate_d) 
     152{ 
     153  oggz_stream_t * stream; 
     154 
     155  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     156 
     157  stream = oggz_get_stream (oggz, serialno); 
     158  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
     159 
     160  *granulerate_n = stream->granulerate_n; 
     161  *granulerate_d = stream->granulerate_d; 
     162 
     163  return 0; 
     164} 
     165 
     166/** DEPRECATED **/ 
    49167int 
    50168oggz_set_metric_linear (OGGZ * oggz, long serialno, 
     
    54172  oggz_stream_t * stream; 
    55173 
     174  if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ; 
     175 
    56176  stream = oggz_get_stream (oggz, serialno); 
    57   if (stream == NULL) return -1; 
    58  
    59   /* we divide by the granulerate, ie. mult by gr_d/gr_n, so ensure 
    60    * numerator is non-zero */ 
    61   if (granule_rate_numerator == 0) { 
    62     granule_rate_numerator = 1; 
    63     granule_rate_denominator = 0; 
    64   } 
     177  if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO; 
    65178 
    66179  stream->granulerate_n = granule_rate_numerator; 
     
    68181  stream->granuleshift = 0; 
    69182 
    70   return oggz_set_metric_internal (oggz, serialno, oggz_metric_default_linear, 
    71                                    NULL, 1); 
     183  return oggz_metric_update (oggz, serialno); 
    72184} 
    73185