Skip to content

Commit

Permalink
ogg-page: Add reading more than 8 bits at once.
Browse files Browse the repository at this point in the history
  • Loading branch information
stassats committed Mar 11, 2012
1 parent c251dc3 commit 0d83ffd
Showing 1 changed file with 25 additions and 21 deletions.
46 changes: 25 additions & 21 deletions ogg-page.lisp
Expand Up @@ -127,24 +127,28 @@
(plusp (read-n-bits 1 stream)))

(defun read-n-bits (n stream)
(let ((position (ogg-page-position stream)))
(when (= position (ogg-page-length stream))
(setf position 0)
(refill-stream stream))
(let ((data (data (ogg-page stream)))
(bits-left (bits-left stream)))
(prog1
(if (> n bits-left)
(logior (ldb (byte (min n bits-left) (- 8 bits-left))
(aref data position))
(ash (ldb (byte (- n bits-left) 0)
(aref data (1+ position)))
bits-left))
(ldb (byte (min n bits-left) (- 8 bits-left))
(aref data position)))
(cond ((> n bits-left)
(incf (ogg-page-position stream))
(setf (bits-left stream)
(- 8 (- n bits-left))))
(t
(decf (bits-left stream) n)))))))
(cond ((> n 8)
(multiple-value-bind (quot rem) (floor n 8)
(logior (read-n-bits rem stream))))
(t
(let ((position (ogg-page-position stream)))
(when (= position (ogg-page-length stream))
(setf position 0)
(refill-stream stream))
(let ((data (data (ogg-page stream)))
(bits-left (bits-left stream)))
(prog1
(if (> n bits-left)
(logior (ldb (byte (min n bits-left) (- 8 bits-left))
(aref data position))
(ash (ldb (byte (- n bits-left) 0)
(aref data (1+ position)))
bits-left))
(ldb (byte (min n bits-left) (- 8 bits-left))
(aref data position)))
(cond ((> n bits-left)
(incf (ogg-page-position stream))
(setf (bits-left stream)
(- 8 (- n bits-left))))
(t
(decf (bits-left stream) n)))))))))

0 comments on commit 0d83ffd

Please sign in to comment.