vdpau: VideoYUV unref buffer in chain so that we don't leak them MpegDecoder parse...
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>
Sat, 4 Apr 2009 20:45:09 +0000 (22:45 +0200)
committerJan Schmidt <thaytan@noraisin.net>
Sat, 20 Jun 2009 14:21:25 +0000 (15:21 +0100)
sys/vdpau/gstvdpaumpegdecoder.c
sys/vdpau/gstvdpauvideoyuv.c

index 36b546acc5c4fb8d3562576d56f1ad6c30023143..1910652c0d2ac4fdc4a976b703f1ca02162c549c 100644 (file)
@@ -141,6 +141,7 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec)
   GstVdpauDevice *device;
   VdpBitstreamBuffer vbit[1];
   VdpStatus status;
+  GstFlowReturn ret;
 
   dec = GST_VDPAU_DECODER (mpeg_dec);
 
@@ -178,14 +179,16 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec)
 
   gst_buffer_ref (GST_BUFFER (outbuf));
 
+  ret = gst_vdpau_decoder_push_video_buffer (GST_VDPAU_DECODER (mpeg_dec),
+      outbuf);
+
   if (mpeg_dec->vdp_info.forward_reference != VDP_INVALID_HANDLE)
     gst_buffer_unref (mpeg_dec->f_buffer);
 
   mpeg_dec->vdp_info.forward_reference = surface;
   mpeg_dec->f_buffer = GST_BUFFER (outbuf);
 
-  return gst_vdpau_decoder_push_video_buffer (GST_VDPAU_DECODER (mpeg_dec),
-      outbuf);
+  return ret;
 }
 
 static gboolean
@@ -215,6 +218,26 @@ gst_vdpau_mpeg_decoder_parse_picture_coding (GstVdpauMpegDecoder * mpeg_dec,
   return TRUE;
 }
 
+static gboolean
+gst_vdpau_mpeg_decoder_parse_sequence (GstVdpauMpegDecoder * mpeg_dec,
+    guint8 * data, guint8 * end)
+{
+  GstVdpauDecoder *dec;
+  MPEGSeqHdr hdr;
+
+  dec = GST_VDPAU_DECODER (mpeg_dec);
+
+  if (!mpeg_util_parse_sequence_hdr (&hdr, data, end))
+    return FALSE;
+
+  memcpy (&mpeg_dec->vdp_info.intra_quantizer_matrix,
+      &hdr.intra_quantizer_matrix, 64);
+  memcpy (&mpeg_dec->vdp_info.non_intra_quantizer_matrix,
+      &hdr.non_intra_quantizer_matrix, 64);
+
+  return TRUE;
+}
+
 static gboolean
 gst_vdpau_mpeg_decoder_parse_picture (GstVdpauMpegDecoder * mpeg_dec,
     guint8 * data, guint8 * end)
@@ -320,6 +343,7 @@ gst_vdpau_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer)
         break;
       case MPEG_PACKET_SEQUENCE:
         GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_SEQUENCE");
+        gst_vdpau_mpeg_decoder_parse_sequence (mpeg_dec, data, end);
         break;
       case MPEG_PACKET_EXTENSION:
         GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_EXTENSION");
index b9be10c1e867f792087b2730d41d18a2c5d59236..ca1ec803e9dffa5ae606ccf00bb7d1da6f91dd19 100644 (file)
@@ -123,7 +123,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
             ("Couldn't get data from vdpau"),
             ("Error returned from vdpau was: %s",
                 device->vdp_get_error_string (status)));
-        return GST_FLOW_ERROR;
+        break;
       }
       break;
     }
@@ -159,7 +159,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
             ("Couldn't get data from vdpau"),
             ("Error returned from vdpau was: %s",
                 device->vdp_get_error_string (status)));
-        return GST_FLOW_ERROR;
+        break;
       }
       break;
     }
@@ -167,6 +167,8 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
       break;
   }
 
+  gst_buffer_unref (buffer);
+
   if (outbuf) {
     gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_TIMESTAMPS);