diff --git a/.travis.yml b/.travis.yml
index 7c99148b21a5de221d7f119403a29ae7720e99e8..93243027c4894b674d28f026688dc0b51367f021 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -44,7 +44,7 @@ matrix:
 
         # Libav.
         - python: "2.7"
-          env: LIBAV=12.0
+          env: LIBAV=12
           os: linux
 
         # Older Pythons.
diff --git a/av/audio/fifo.pyx b/av/audio/fifo.pyx
index bff8982f02a6be77e722cf111cd4f80b2181539a..abc63f80ed70e5851bf7e5fc841ff5a500b5740d 100644
--- a/av/audio/fifo.pyx
+++ b/av/audio/fifo.pyx
@@ -85,6 +85,9 @@ cdef class AudioFifo:
         if not partial and self.samples < nb_samples:
             return
 
+        if partial:
+            nb_samples = min(self.samples, nb_samples)
+
         cdef int ret
         cdef int linesize
         cdef int sample_size
diff --git a/av/packet.pyx b/av/packet.pyx
index ad9e4d88e4b112bc8d5824ab2c154e2677e3850b..fd91edb3926d831887f0dbd7069fa3b618852a1c 100644
--- a/av/packet.pyx
+++ b/av/packet.pyx
@@ -1,28 +1,47 @@
 cimport libav as lib
 from av.utils cimport avrational_to_faction
+from av.utils cimport err_check
+from av.bytesource cimport ByteSource, bytesource
 
+cdef class Packet(Buffer):
 
-cdef class Packet(object):
-    
     """A packet of encoded data within a :class:`~av.format.Stream`.
 
     This may, or may not include a complete object within a stream.
     :meth:`decode` must be called to extract encoded data.
 
     """
-    def __init__(self):
+    def __cinit__(self):
         with nogil:
             lib.av_init_packet(&self.struct)
             self.struct.data = NULL
             self.struct.size = 0
 
+    def __init__(self, source=None):
+        cdef size_t size = 0
+        cdef ByteSource src = None
+
+        if not source:
+            return
+        elif isinstance(source, int):
+            size = source
+        else:
+            src = bytesource(source)
+            size = src.length
+
+        if size:
+            err_check(lib.av_new_packet(&self.struct, size))
+
+        if src:
+            self.update_buffer(source)
+
     def __dealloc__(self):
         with nogil: lib.av_free_packet(&self.struct)
     
     def __repr__(self):
         return '<av.%s of #%d, dts=%s, pts=%s at 0x%x>' % (
             self.__class__.__name__,
-            self.stream.index,
+            self.stream.index if self.stream else 0,
             self.dts,
             self.pts,
             id(self),
diff --git a/include/libavcodec/avcodec.pxd b/include/libavcodec/avcodec.pxd
index 5cefc5eaa6d217bcf2719b4ca97e309e8d2efe7b..c364279a3fb77ba3c61d7fd0d557699a8931d45d 100644
--- a/include/libavcodec/avcodec.pxd
+++ b/include/libavcodec/avcodec.pxd
@@ -294,6 +294,7 @@ cdef extern from "libavcodec/avcodec.pyav.h" nogil:
     cdef void av_free_packet(AVPacket*)
     cdef void av_init_packet(AVPacket*)
     cdef void av_packet_unref(AVPacket *pkt)   
+    cdef int av_new_packet(AVPacket*, int)
     cdef int av_copy_packet(AVPacket *dst, AVPacket *src)
     cdef int av_dup_packet(AVPacket *pkt)