[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