[cvs-annodex] commit (/annodex): libannodex/trunk/src/importers/anx_import_ogg.c libannodex/trunk/src/libannodex/annodex.c libannodex/trunk/src/libannodex/anx_private.h libannodex/trunk/src/libannodex/anx_read.c libannodex/trunk/src/libannodex/anx_write.c libannodex/trunk/src/libannodex/cmml_header.h

conrad nobody at lists.annodex.net
Sat Feb 12 12:41:53 EST 2005


Update of /annodex (new revision 881)

Modified files:
   libannodex/trunk/src/importers/anx_import_ogg.c
   libannodex/trunk/src/libannodex/annodex.c
   libannodex/trunk/src/libannodex/anx_private.h
   libannodex/trunk/src/libannodex/anx_read.c
   libannodex/trunk/src/libannodex/anx_write.c
   libannodex/trunk/src/libannodex/cmml_header.h

Log Message:
CMML granuleshift: add full support for CMML granuleshift in reading, writing
and importing


Modified: libannodex/trunk/src/importers/anx_import_ogg.c
===================================================================
--- libannodex/trunk/src/importers/anx_import_ogg.c	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/importers/anx_import_ogg.c	2005-02-12 01:41:50 UTC (rev 881)
@@ -48,6 +48,7 @@
 #include <annodex/anx_import.h>
 #include <annodex/annodex.h>
 
+#define INT8_AT(x) (*(unsigned char *)(x))
 #define INT32_LE_AT(x) _le_32((*(ogg_int32_t *)(x)))
 #define INT32_BE_AT(x) _be_32((*(ogg_int32_t *)(x)))
 #define INT64_LE_AT(x) _le_64((*(ogg_int64_t *)(x)))
@@ -133,7 +134,6 @@
   AnxImportCMML import_cmml;
   void * import_user_data;
   long cmml_serialno; /* Serialno of CMML track, or -1 if not present */
-  double cmml_granulerate;
 };
 
 static AnxImporter anxogg_importer;
@@ -273,15 +273,10 @@
 
   if (op->b_o_s) {
     if (!strncmp ((char *)header, "CMML", 5)) {
-      ogg_int64_t gr_n, gr_d;
-
       /* Don't insert this into the media */
       need_insert = 0;
 	
       aod->cmml_serialno = serialno;
-      gr_n = INT64_LE_AT(&header[12]);
-      gr_d = INT64_LE_AT(&header[20]);
-      aod->cmml_granulerate = (double)gr_n / (double)gr_d;
     } else {
       if (aot == NULL) {
 	aot = (AnxOggTrack *) anx_malloc (sizeof (AnxOggTrack));
@@ -362,8 +357,6 @@
 	if (!strcmp (track->content_type, CMML_CONTENT_TYPE)) {
 	  need_insert = 0;
 	  aod->cmml_serialno = serialno;
-	  aod->cmml_granulerate =
-	    (double)track->granule_rate_n / (double)track->granule_rate_d;
 	}
 
       } else if (!strncmp ((char *)&op->packet[1], "video", 5) && 
@@ -525,7 +518,7 @@
       if (op->granulepos == -1) {
 	return OGGZ_STOP_ERR;
       }
-      at_time = (double)op->granulepos / (double)aod->cmml_granulerate;
+      at_time = gp_to_time (aod->oggz, serialno, op->granulepos);
       
 #ifdef DEBUG
       printf ("anxogg::read_packet: got CMML <%c%c%c%c> at %f\n",

Modified: libannodex/trunk/src/libannodex/annodex.c
===================================================================
--- libannodex/trunk/src/libannodex/annodex.c	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/libannodex/annodex.c	2005-02-12 01:41:50 UTC (rev 881)
@@ -110,7 +110,7 @@
   if (flags & ANX_WRITE) {
     oggz_flags = OGGZ_WRITE;
   } else {
-    oggz_flags = OGGZ_READ;
+    oggz_flags = OGGZ_READ|OGGZ_AUTO;
   }
 
   oggz = oggz_new (oggz_flags);
@@ -129,7 +129,7 @@
   if (flags & ANX_WRITE) {
     oggz_flags = OGGZ_WRITE;
   } else {
-    oggz_flags = OGGZ_READ;
+    oggz_flags = OGGZ_READ|OGGZ_AUTO;
   }
 
   oggz = oggz_open (filename, oggz_flags);
@@ -150,7 +150,7 @@
   if (flags & ANX_WRITE) {
     oggz_flags = OGGZ_WRITE;
   } else {
-    oggz_flags = OGGZ_READ;
+    oggz_flags = OGGZ_READ|OGGZ_AUTO;
 
     fd = fileno (file);
     if (lseek (fd, 0, SEEK_CUR) != -1) {

Modified: libannodex/trunk/src/libannodex/anx_private.h
===================================================================
--- libannodex/trunk/src/libannodex/anx_private.h	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/libannodex/anx_private.h	2005-02-12 01:41:50 UTC (rev 881)
@@ -114,6 +114,7 @@
   int done_eos;
 
   AnxTrack cmml_track;
+  anx_int64_t cmml_prev_granule;
 
   ogg_stream_state mapping_stream;
   ogg_stream_state annotations_stream;

Modified: libannodex/trunk/src/libannodex/anx_read.c
===================================================================
--- libannodex/trunk/src/libannodex/anx_read.c	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/libannodex/anx_read.c	2005-02-12 01:41:50 UTC (rev 881)
@@ -314,7 +314,7 @@
     return -1;
   }
 
-  /* XXX: don't doubly insert track records; this should be unnecessary */
+  /* Don't doubly insert track records */
   for (l = reader->tracks; l; l = l->next) {
     track = (AnxTrack *)l->data;
     if (track->serialno == serialno) return 0;
@@ -470,7 +470,32 @@
   return cb_ret;
 }
 
+static int
+anx_reader_read_cmml_header (ANNODEX * annodex, unsigned char * data, long n,
+			     long serialno)
+{
+  AnxReader * reader = &annodex->x.reader;
+  AnxTrack * track;
 
+  annodex->cmml_serialno = serialno;
+  annodex->cmml_serialno_valid = 1;
+
+  track = anx_malloc (sizeof (AnxTrack));
+  track->serialno = serialno;
+  track->id = NULL;
+  track->content_type = CMML_CONTENT_TYPE;
+  track->granule_rate_n = _le_64 (*((ogg_int64_t *)&data[12]));
+  track->granule_rate_d = _le_64 (*((ogg_int64_t *)&data[20]));
+  track->nr_header_packets = 3;
+  track->basegranule = 0;
+  track->preroll = 0;
+  track->granuleshift = (int)(*((unsigned char *)&data[28]));
+
+  reader->tracks = anx_list_append (reader->tracks, track);
+
+  return ANX_CONTINUE;
+}
+
 static int
 anx_read_packet (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data)
 {
@@ -530,8 +555,9 @@
   } else if (op->bytes > 6 &&
 	     !strncmp ((char *)op->packet, "CMML", 4)) {
     /* CMML */
-    annodex->cmml_serialno = serialno;
-    annodex->cmml_serialno_valid = 1;
+    cb_ret = anx_reader_read_cmml_header (annodex, op->packet, op->bytes,
+					  serialno);
+    return cb_ret;
   } else if (op->e_o_s && annodex->mapping_serialno_valid &&
 	     serialno == annodex->mapping_serialno &&
 	     reader->got_non_init == 0) {
@@ -644,30 +670,6 @@
   return ((double)units / 1000.0);
 }
 
-/* An OGGZ metric for seeking on Ogg framing */
-static ogg_int64_t
-anx_reader_metric (OGGZ * oggz, long serialno, ogg_int64_t granulepos,
-		   void * user_data)
-{
-  ANNODEX * annodex = (ANNODEX *)user_data;
-  int err;
-  anx_int64_t granule_rate_n, granule_rate_d;
-  double seconds;
-  ogg_int64_t units;
-
-  err =
-    anx_track_get_granule_rate (annodex, serialno,
-				&granule_rate_n, &granule_rate_d);
-  if (err == -1) return -1L;
-
-  seconds =
-    (double)granulepos * (double)granule_rate_d / (double)granule_rate_n;
-
-  units = anx_reader_time_to_units (annodex, seconds);
-
-  return units;
-}
-
 ANNODEX *
 anx_reader_init (ANNODEX * annodex)
 {
@@ -686,7 +688,6 @@
   reader->offset_head = 0;
 
   oggz_set_read_callback (annodex->oggz, -1, anx_read_packet, annodex);
-  oggz_set_metric (annodex->oggz, -1, anx_reader_metric, annodex);
 
 #ifdef DEBUG
   printf ("anx_reader_init: annodex->slurpable? %s\n",

Modified: libannodex/trunk/src/libannodex/anx_write.c
===================================================================
--- libannodex/trunk/src/libannodex/anx_write.c	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/libannodex/anx_write.c	2005-02-12 01:41:50 UTC (rev 881)
@@ -706,6 +706,9 @@
   *(ogg_int64_t *)b = _le_64 (CMML_GRANULE_RATE_D);
   b += 8;
 
+  *(unsigned char *)b = CMML_GRANULESHIFT;
+  b += 1;
+
   return anx_packet_init (annodex, buf, CMML_HEADER_SIZE,
 			  annodex->cmml_serialno,
 			  0 /* granulepos */, 1 /* bos */, 0 /* eos */,
@@ -745,24 +748,53 @@
 			  OGGZ_FLUSH_AFTER);
 }
 
+static anx_int64_t
+anx_writer_cmml_granulepos (ANNODEX * annodex)
+{
+  AnxWriter * writer = &annodex->x.writer;
+  AnxTrack * track = &writer->cmml_track;
+  AnxCommand command;
+  AnxCommandData data;
+  double command_time;
+  anx_int64_t granule, granulepos;
+
+  command = annodex->pending_command;
+  if (command == NULL) return -1;
+
+  data = anx_command_get_data (annodex, command);
+  command_time = anx_command_get_time_offset (annodex, command);
+  granule = (anx_int64_t)(command_time * track->granule_rate_n /
+			  track->granule_rate_d);
+
+  granulepos =
+    (writer->cmml_prev_granule << CMML_GRANULESHIFT) |
+    (granule - writer->cmml_prev_granule);
+
+#ifdef DEBUG
+  printf ("anx_writer_cmml_granulepos: prev_granule %llx, granule %llx, granulepos %llx\n",
+	  writer->cmml_prev_granule, granule, granulepos);
+#endif
+
+  writer->cmml_prev_granule = granule;
+
+  return granulepos;
+}
+
 static long
 anx_init_clip_packet (ANNODEX * annodex)
 {
   AnxWriter * writer = &annodex->x.writer;
-  AnxTrack * track = &writer->cmml_track;
   AnxCommand command;
   AnxCommandData data;
-  double command_time;
   anx_int64_t granulepos;
   long input_n = 0;
 
   command = annodex->pending_command;
   if (command == NULL) return -1;
 
+  granulepos = anx_writer_cmml_granulepos (annodex);
+
   data = anx_command_get_data (annodex, command);
-  command_time = anx_command_get_time_offset (annodex, command);
-  granulepos = (anx_int64_t)(command_time * track->granule_rate_n /
-			     track->granule_rate_d);
 
   if (data.clip != NULL) {
 
@@ -788,19 +820,11 @@
 anx_init_clear_clip_packet (ANNODEX * annodex)
 {
   AnxWriter * writer = &annodex->x.writer;
-  AnxTrack * track = &writer->cmml_track;
-  AnxCommand command;
-  double command_time;
   anx_int64_t granulepos;
   long input_n;
 
-  command = annodex->pending_command;
-  if (command == NULL) return -1;
+  granulepos = anx_writer_cmml_granulepos (annodex);
 
-  command_time = anx_command_get_time_offset (annodex, command);
-  granulepos = (anx_int64_t)(command_time * track->granule_rate_n /
-			     track->granule_rate_d);
-
   input_n = (long) strlen (CMML_EMPTY_CLIP);
 
   if (input_n > writer->cmml_buf_len) {
@@ -1341,8 +1365,10 @@
   writer->cmml_track.granule_rate_d = CMML_GRANULE_RATE_D;
   writer->cmml_track.basegranule = 0;
   writer->cmml_track.preroll = 0;
-  writer->cmml_track.granuleshift = 0;
+  writer->cmml_track.granuleshift = CMML_GRANULESHIFT;
 
+  writer->cmml_prev_granule = 0;
+
   writer->eos = 0; /* end of stream */
 
   writer->import_stream_callback = anx_import_stream_default;

Modified: libannodex/trunk/src/libannodex/cmml_header.h
===================================================================
--- libannodex/trunk/src/libannodex/cmml_header.h	2005-02-11 07:26:14 UTC (rev 880)
+++ libannodex/trunk/src/libannodex/cmml_header.h	2005-02-12 01:41:50 UTC (rev 881)
@@ -52,15 +52,18 @@
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               | 24-27
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   | Granuleshift  |                                                 28-31
+   +-+-+-+-+-+-+-+-+
 
 */
 
 #define CMML_IDENTIFIER "CMML"
-#define CMML_HEADER_SIZE 28
+#define CMML_HEADER_SIZE 29
 #define CMML_VERSION_MAJOR 2
 #define CMML_VERSION_MINOR 0
 #define CMML_GRANULE_RATE_N 1000
 #define CMML_GRANULE_RATE_D 1
+#define CMML_GRANULESHIFT 32
 #define CMML_CONTENT_TYPE "text/x-cmml"
 #define CMML_EMPTY_CLIP "<clip/>"
 


-- 
conrad



More information about the cvs-annodex mailing list