[cvs-annodex] commit (/annodex):
liboggz/trunk/src/liboggz/Makefile.am
liboggz/trunk/src/liboggz/metric_linear.c
-liboggz/trunk/src/liboggz/metric_granuleshift.c
conrad
nobody at lists.annodex.net
Sat Feb 5 12:51:16 EST 2005
Update of /annodex (new revision 834)
Removed files:
liboggz/trunk/src/liboggz/metric_granuleshift.c
Modified files:
liboggz/trunk/src/liboggz/Makefile.am
liboggz/trunk/src/liboggz/metric_linear.c
Log Message:
centralize internal metrics, add accessors for granuleshift, granulerate
Modified: liboggz/trunk/src/liboggz/Makefile.am
===================================================================
--- liboggz/trunk/src/liboggz/Makefile.am 2005-02-04 14:50:48 UTC (rev 833)
+++ liboggz/trunk/src/liboggz/Makefile.am 2005-02-05 01:51:11 UTC (rev 834)
@@ -19,7 +19,6 @@
oggz_stream.c oggz_stream.h \
oggz_table.c \
oggz_vector.c oggz_vector.h \
- metric_granuleshift.c \
metric_linear.c
liboggz_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@
Deleted: liboggz/trunk/src/liboggz/metric_granuleshift.c
Modified: liboggz/trunk/src/liboggz/metric_linear.c
===================================================================
--- liboggz/trunk/src/liboggz/metric_linear.c 2005-02-04 14:50:48 UTC (rev 833)
+++ liboggz/trunk/src/liboggz/metric_linear.c 2005-02-05 01:51:11 UTC (rev 834)
@@ -35,6 +35,31 @@
#include "oggz_private.h"
static ogg_int64_t
+oggz_metric_default_granuleshift (OGGZ * oggz, long serialno,
+ ogg_int64_t granulepos, void * user_data)
+{
+ oggz_stream_t * stream;
+ ogg_int64_t iframe, pframe;
+ ogg_int64_t units;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return -1;
+
+ iframe = granulepos >> stream->granuleshift;
+ pframe = granulepos - (iframe << stream->granuleshift);
+ granulepos = (iframe + pframe);
+
+ units = granulepos * stream->granulerate_d / stream->granulerate_n;
+
+#ifdef DEBUG
+ printf ("oggz_..._granuleshift: serialno %010ld Got frame %lld (%lld + %lld): %lld units\n",
+ serialno, granulepos, iframe, pframe, units);
+#endif
+
+ return units;
+}
+
+static ogg_int64_t
oggz_metric_default_linear (OGGZ * oggz, long serialno, ogg_int64_t granulepos,
void * user_data)
{
@@ -46,29 +71,116 @@
return (stream->granulerate_d * granulepos / stream->granulerate_n);
}
-int
-oggz_set_metric_linear (OGGZ * oggz, long serialno,
- ogg_int64_t granule_rate_numerator,
- ogg_int64_t granule_rate_denominator)
+static int
+oggz_metric_update (OGGZ * oggz, long serialno)
{
oggz_stream_t * stream;
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
stream = oggz_get_stream (oggz, serialno);
- if (stream == NULL) return -1;
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
/* we divide by the granulerate, ie. mult by gr_d/gr_n, so ensure
* numerator is non-zero */
- if (granule_rate_numerator == 0) {
- granule_rate_numerator = 1;
- granule_rate_denominator = 0;
+ if (stream->granulerate_n == 0) {
+ stream->granulerate_n= 1;
+ stream->granulerate_d = 0;
}
+ if (stream->granuleshift == 0) {
+ return oggz_set_metric_internal (oggz, serialno,
+ oggz_metric_default_linear,
+ NULL, 1);
+ } else {
+ return oggz_set_metric_internal (oggz, serialno,
+ oggz_metric_default_granuleshift,
+ NULL, 1);
+ }
+}
+
+int
+oggz_set_granuleshift (OGGZ * oggz, long serialno, int granuleshift)
+{
+ oggz_stream_t * stream;
+
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
+
+ stream->granuleshift = granuleshift;
+
+ return oggz_metric_update (oggz, serialno);
+}
+
+int
+oggz_get_granuleshift (OGGZ * oggz, long serialno)
+{
+ oggz_stream_t * stream;
+
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
+
+ return stream->granuleshift;
+}
+
+int
+oggz_set_granulerate (OGGZ * oggz, long serialno,
+ ogg_int64_t granule_rate_numerator,
+ ogg_int64_t granule_rate_denominator)
+{
+ oggz_stream_t * stream;
+
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
+
stream->granulerate_n = granule_rate_numerator;
stream->granulerate_d = granule_rate_denominator;
+
+ return oggz_metric_update (oggz, serialno);
+}
+
+int
+oggz_get_granulerate (OGGZ * oggz, long serialno,
+ ogg_int64_t * granulerate_n,
+ ogg_int64_t * granulerate_d)
+{
+ oggz_stream_t * stream;
+
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
+
+ *granulerate_n = stream->granulerate_n;
+ *granulerate_d = stream->granulerate_d;
+
+ return 0;
+}
+
+/** DEPRECATED **/
+int
+oggz_set_metric_linear (OGGZ * oggz, long serialno,
+ ogg_int64_t granule_rate_numerator,
+ ogg_int64_t granule_rate_denominator)
+{
+ oggz_stream_t * stream;
+
+ if (oggz == NULL) return OGGZ_ERR_BAD_OGGZ;
+
+ stream = oggz_get_stream (oggz, serialno);
+ if (stream == NULL) return OGGZ_ERR_BAD_SERIALNO;
+
+ stream->granulerate_n = granule_rate_numerator;
+ stream->granulerate_d = granule_rate_denominator;
stream->granuleshift = 0;
- return oggz_set_metric_internal (oggz, serialno, oggz_metric_default_linear,
- NULL, 1);
+ return oggz_metric_update (oggz, serialno);
}
int
--
conrad
More information about the cvs-annodex
mailing list