Changeset 872

Show
Ignore:
Timestamp:
2005-02-10 08:49:08 (4 years ago)
Author:
conrad
Message:

code cleanup -- make theora use the internal granuleshift metric rather
than its own custom one

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • liboggz/trunk/src/liboggz/oggz_auto.c

    r851 r872  
    109109} 
    110110 
    111 typedef struct { 
    112   ogg_int32_t fps_numerator; 
    113   ogg_int32_t fps_denominator; 
    114   int keyframe_shift; 
    115 } oggz_theora_metric_t; 
    116  
    117111#if USE_THEORA_PRE_ALPHA_3_FORMAT 
    118112static int intlog(int num) { 
     
    126120#endif 
    127121 
    128 static ogg_int64_t 
    129 auto_theora_metric (OGGZ * oggz, long serialno, ogg_int64_t granulepos, 
    130                     void * user_data) 
    131 { 
    132   oggz_theora_metric_t * tdata = (oggz_theora_metric_t *)user_data; 
    133   ogg_int64_t iframe, pframe; 
    134   ogg_int64_t units; 
    135  
    136   iframe = granulepos >> tdata->keyframe_shift; 
    137   pframe = granulepos - (iframe << tdata->keyframe_shift); 
    138   granulepos = (iframe + pframe); 
    139  
    140   units = OGGZ_AUTO_MULT * granulepos * tdata->fps_denominator / 
    141     tdata->fps_numerator; 
    142  
    143 #ifdef DEBUG 
    144   printf ("oggz_auto: serialno %010ld Got theora frame %lld (%lld + %lld): %lld units\n", 
    145           serialno, granulepos, iframe, pframe, units); 
    146 #endif 
    147  
    148   return units; 
    149 } 
    150  
    151122static int 
    152123auto_theora (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 
    153124{ 
    154125  unsigned char * header = op->packet; 
     126  ogg_int32_t fps_numerator, fps_denominator; 
    155127  char keyframe_granule_shift = 0; 
    156   oggz_theora_metric_t * tdata
     128  int keyframe_shift
    157129 
    158130  if (op->bytes < 41) return 0; 
     
    162134  if (!op->b_o_s) return 0; 
    163135 
    164  
    165   tdata = oggz_malloc (sizeof (oggz_theora_metric_t)); 
    166  
    167   tdata->fps_numerator = INT32_BE_AT(&header[22]); 
    168   tdata->fps_denominator = INT32_BE_AT(&header[26]); 
     136  fps_numerator = INT32_BE_AT(&header[22]); 
     137  fps_denominator = INT32_BE_AT(&header[26]); 
    169138 
    170139  /* Very old theora versions used a value of 0 to mean 1. 
     
    172141   * hence we hardcode this workaround for old or broken streams. 
    173142   */ 
    174   if (tdata->fps_numerator == 0) tdata->fps_numerator = 1; 
     143  if (fps_numerator == 0) fps_numerator = 1; 
    175144 
    176145#if USE_THEORA_PRE_ALPHA_3_FORMAT 
    177146  /* old header format, used by Theora alpha2 and earlier */ 
    178147  keyframe_granule_shift = (header[36] & 0xf8) >> 3; 
    179   tdata->keyframe_shift = intlog (keyframe_granule_shift - 1); 
     148  keyframe_shift = intlog (keyframe_granule_shift - 1); 
    180149#else 
    181150  keyframe_granule_shift = (char) ((header[40] & 0x03) << 3); 
    182151  keyframe_granule_shift |= (header[41] & 0xe0) >> 5; 
    183   tdata->keyframe_shift = keyframe_granule_shift; 
     152  keyframe_shift = keyframe_granule_shift; 
    184153#endif 
    185154 
    186155#ifdef DEBUG 
    187156  printf ("Got theora fps %d/%d, keyframe_shift %d\n", 
    188           tdata->fps_numerator, tdata->fps_denominator, 
    189           tdata->keyframe_shift); 
    190 #endif 
    191  
    192   oggz_set_metric_internal (oggz, serialno, auto_theora_metric, tdata, 1); 
    193   /*oggz_set_metric (oggz, serialno, auto_theora_metric, tdata);*/ 
     157          fps_numerator, fps_denominator, keyframe_shift); 
     158#endif 
     159 
     160  oggz_set_granulerate (oggz, serialno, (ogg_int64_t)fps_numerator, 
     161                       OGGZ_AUTO_MULT * (ogg_int64_t)fps_denominator); 
     162  oggz_set_granuleshift (oggz, serialno, keyframe_shift); 
    194163 
    195164  return 1;