[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