gecko/media/liboggplay/seek_to_key_frame.patch
Chris Pearce c9119c8ceb Bug 463358. Support seeking to keyframes in liboggz. r=doublec
--HG--
extra : rebase_source : a8aa26fe569f1155936b496ecc35317d27a9aae7
2009-05-20 15:49:01 +12:00

96 lines
2.6 KiB
Diff

diff --git a/media/liboggplay/include/oggplay/oggplay_seek.h b/media/liboggplay/include/oggplay/oggplay_seek.h
--- a/media/liboggplay/include/oggplay/oggplay_seek.h
+++ b/media/liboggplay/include/oggplay/oggplay_seek.h
@@ -37,9 +37,20 @@
*/
#ifndef __OGGPLAY_SEEK_H__
#define __OGGPLAY_SEEK_H__
OggPlayErrorCode
oggplay_seek(OggPlay *me, ogg_int64_t milliseconds);
+/**
+ * Seeks to key frame before |milliseconds|.
+ */
+OggPlayErrorCode
+oggplay_seek_to_keyframe(OggPlay *me,
+ int* tracks,
+ int num_tracks,
+ ogg_int64_t milliseconds,
+ ogg_int64_t offset_begin,
+ ogg_int64_t offset_end);
+
#endif
diff --git a/media/liboggplay/src/liboggplay/oggplay_seek.c b/media/liboggplay/src/liboggplay/oggplay_seek.c
--- a/media/liboggplay/src/liboggplay/oggplay_seek.c
+++ b/media/liboggplay/src/liboggplay/oggplay_seek.c
@@ -73,16 +73,67 @@ oggplay_seek(OggPlay *me, ogg_int64_t mi
}
oggplay_seek_cleanup(me, milliseconds);
return E_OGGPLAY_OK;
}
+OggPlayErrorCode
+oggplay_seek_to_keyframe(OggPlay *me,
+ int* tracks,
+ int num_tracks,
+ ogg_int64_t milliseconds,
+ ogg_int64_t offset_begin,
+ ogg_int64_t offset_end)
+{
+ long *serial_nos;
+ int i;
+ ogg_int64_t eof, time;
+
+ if (me == NULL) {
+ return E_OGGPLAY_BAD_OGGPLAY;
+ }
+
+ if (num_tracks > me->num_tracks || milliseconds < 0)
+ return E_OGGPLAY_CANT_SEEK;
+
+ eof = oggplay_get_duration(me);
+ if (eof > -1 && milliseconds > eof) {
+ return E_OGGPLAY_CANT_SEEK;
+ }
+
+ // Get the serialnos for the tracks we're seeking.
+ serial_nos = (long*)oggplay_malloc(sizeof(long)*num_tracks);
+ if (!serial_nos) {
+ return E_OGGPLAY_CANT_SEEK;
+ }
+ for (i=0; i<num_tracks; i++) {
+ serial_nos[i] = me->decode_data[tracks[i]]->serialno;
+ }
+
+ time = oggz_keyframe_seek_set(me->oggz,
+ serial_nos,
+ num_tracks,
+ milliseconds,
+ offset_begin,
+ offset_end);
+ oggplay_free(serial_nos);
+
+ if (time == -1) {
+ return E_OGGPLAY_CANT_SEEK;
+ }
+
+ oggplay_seek_cleanup(me, time);
+
+ return E_OGGPLAY_OK;
+
+}
+
void
oggplay_seek_cleanup(OggPlay* me, ogg_int64_t milliseconds)
{
OggPlaySeekTrash * trash;
OggPlaySeekTrash ** p;
OggPlayDataHeader ** end_of_list_p;
int i;