diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-01-26 15:19:14 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-01-27 13:28:12 +0100 |
commit | 2897618b852c0f8e25df40f8980e1c2c5c59653e (patch) | |
tree | c2bea26bc90460922d0558c0750640cb8549ec83 /gst-libs | |
parent | 7b19745141d3d653e84e3512b7235292e7c1e17a (diff) |
decoder: properly reference count pictures.
This fixes cases where a GstVaapiPicture would be destroyed whereas
there is still a valid instance of it in either prev, current or
next picture.
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c | 17 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidecoder_mpeg4.c | 17 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidecoder_vc1.c | 17 |
3 files changed, 15 insertions, 36 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c index 33edc0f3..e8884262 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c @@ -274,9 +274,8 @@ decode_current_picture(GstVaapiDecoderMpeg2 *decoder) if ((priv->prev_picture && priv->next_picture) || (priv->closed_gop && priv->next_picture)) status = render_picture(decoder, picture); - gst_vaapi_picture_unref(picture); } - priv->current_picture = NULL; + gst_vaapi_picture_replace(&priv->current_picture, NULL); } return status; } @@ -494,16 +493,10 @@ decode_picture(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size) /* Update reference pictures */ if (pic_hdr->pic_type != GST_MPEG_VIDEO_PICTURE_TYPE_B) { GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_REFERENCE); - if (priv->prev_picture) { - gst_vaapi_picture_unref(priv->prev_picture); - priv->prev_picture = NULL; - } - if (priv->next_picture) { - priv->prev_picture = priv->next_picture; - priv->next_picture = NULL; - status = render_picture(decoder, priv->prev_picture); - } - priv->next_picture = picture; + if (priv->next_picture) + status = render_picture(decoder, priv->next_picture); + gst_vaapi_picture_replace(&priv->prev_picture, priv->next_picture); + gst_vaapi_picture_replace(&priv->next_picture, picture); } return status; } diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg4.c b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg4.c index a81f19b7..24a67571 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg4.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg4.c @@ -273,9 +273,8 @@ decode_current_picture(GstVaapiDecoderMpeg4 *decoder) if ((priv->prev_picture && priv->next_picture) || (priv->closed_gop && priv->next_picture)) status = render_picture(decoder, picture); - gst_vaapi_picture_unref(picture); } - priv->curr_picture = NULL; + gst_vaapi_picture_replace(&priv->curr_picture, NULL); } return status; } @@ -569,16 +568,10 @@ decode_picture(GstVaapiDecoderMpeg4 *decoder, const guint8 *buf, guint buf_size) /* Update reference pictures */ /* XXX: consider priv->vol_hdr.low_delay, consider packed video frames for DivX/XviD */ if (GST_VAAPI_PICTURE_IS_REFERENCE(picture)) { - if (priv->prev_picture) { - gst_vaapi_picture_unref(priv->prev_picture); - priv->prev_picture = NULL; - } - if (priv->next_picture) { - priv->prev_picture = priv->next_picture; - priv->next_picture = NULL; - status = render_picture(decoder, priv->prev_picture); - } - priv->next_picture = picture; + if (priv->next_picture) + status = render_picture(decoder, priv->next_picture); + gst_vaapi_picture_replace(&priv->prev_picture, priv->next_picture); + gst_vaapi_picture_replace(&priv->next_picture, picture); } return status; } diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c index 9f4e6c9e..b305b28b 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c @@ -227,9 +227,8 @@ decode_current_picture(GstVaapiDecoderVC1 *decoder) if (!GST_VAAPI_PICTURE_IS_REFERENCE(picture)) { if (priv->prev_picture && priv->next_picture) status = render_picture(decoder, picture); - gst_vaapi_picture_unref(picture); } - priv->current_picture = NULL; + gst_vaapi_picture_replace(&priv->current_picture, NULL); } return status; } @@ -957,16 +956,10 @@ decode_frame(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu) /* Update reference pictures */ if (GST_VAAPI_PICTURE_IS_REFERENCE(picture)) { - if (priv->prev_picture) { - gst_vaapi_picture_unref(priv->prev_picture); - priv->prev_picture = NULL; - } - if (priv->next_picture) { - priv->prev_picture = priv->next_picture; - priv->next_picture = NULL; - status = render_picture(decoder, priv->prev_picture); - } - priv->next_picture = picture; + if (priv->next_picture) + status = render_picture(decoder, priv->next_picture); + gst_vaapi_picture_replace(&priv->prev_picture, priv->next_picture); + gst_vaapi_picture_replace(&priv->next_picture, picture); } if (!fill_picture(decoder, picture)) |