Changeset 872
- Timestamp:
- 2005-02-10 08:49:08 (4 years ago)
- Files:
-
- liboggz/trunk/src/liboggz/oggz_auto.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
liboggz/trunk/src/liboggz/oggz_auto.c
r851 r872 109 109 } 110 110 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 117 111 #if USE_THEORA_PRE_ALPHA_3_FORMAT 118 112 static int intlog(int num) { … … 126 120 #endif 127 121 128 static ogg_int64_t129 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 DEBUG144 printf ("oggz_auto: serialno %010ld Got theora frame %lld (%lld + %lld): %lld units\n",145 serialno, granulepos, iframe, pframe, units);146 #endif147 148 return units;149 }150 151 122 static int 152 123 auto_theora (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data) 153 124 { 154 125 unsigned char * header = op->packet; 126 ogg_int32_t fps_numerator, fps_denominator; 155 127 char keyframe_granule_shift = 0; 156 oggz_theora_metric_t * tdata;128 int keyframe_shift; 157 129 158 130 if (op->bytes < 41) return 0; … … 162 134 if (!op->b_o_s) return 0; 163 135 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]); 169 138 170 139 /* Very old theora versions used a value of 0 to mean 1. … … 172 141 * hence we hardcode this workaround for old or broken streams. 173 142 */ 174 if ( tdata->fps_numerator == 0) tdata->fps_numerator = 1;143 if (fps_numerator == 0) fps_numerator = 1; 175 144 176 145 #if USE_THEORA_PRE_ALPHA_3_FORMAT 177 146 /* old header format, used by Theora alpha2 and earlier */ 178 147 keyframe_granule_shift = (header[36] & 0xf8) >> 3; 179 tdata->keyframe_shift = intlog (keyframe_granule_shift - 1);148 keyframe_shift = intlog (keyframe_granule_shift - 1); 180 149 #else 181 150 keyframe_granule_shift = (char) ((header[40] & 0x03) << 3); 182 151 keyframe_granule_shift |= (header[41] & 0xe0) >> 5; 183 tdata->keyframe_shift = keyframe_granule_shift;152 keyframe_shift = keyframe_granule_shift; 184 153 #endif 185 154 186 155 #ifdef DEBUG 187 156 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); 194 163 195 164 return 1;