summaryrefslogtreecommitdiffstats
path: root/common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch')
-rw-r--r--common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch b/common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch
new file mode 100644
index 0000000..15d2478
--- /dev/null
+++ b/common/recipes-multimedia/gstreamer/gstreamer1.0-omx/0007-omxvideodec-remove-the-data-packets-left-queued-in-t.patch
@@ -0,0 +1,63 @@
+From 53072a001ad615377144a1e9ed38f4664496fc8c Mon Sep 17 00:00:00 2001
+From: Kazunori Kobayashi <kkobayas@igel.co.jp>
+Date: Thu, 13 Jun 2013 12:08:04 +0900
+Subject: [PATCH 07/14] omxvideodec: remove the data packets left queued in the
+ VideoDecoder class
+
+This change is required when the data packets split from a frame
+are queued in VideoDecoder class. The VideoDecoder class only takes account
+into frame to frame decoding, so subsequent packets aren't cleared
+from the queue in the VideoDecoder class.
+These should be removed before the test to determine if the remaining
+data in the queue is needed to be dropped.
+---
+ omx/gstomxvideodec.c | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
+index 1bdac85..e8c276b 100644
+--- a/omx/gstomxvideodec.c
++++ b/omx/gstomxvideodec.c
+@@ -949,6 +949,39 @@ _find_nearest_frame (GstOMXVideoDec * self, GstOMXBuffer * buf)
+ }
+
+ if (best_id) {
++ /* This processing is required when the data packets split from a frame
++ * are queued in VideoDecoder class. The VideoDecoder class takes account
++ * into frame to frame decoding, so the subsequent packets are left queued.
++ * These should be removed before the test to determine if the remaining
++ * data in the queue is needed to be dropped.
++ */
++ for (l = frames; l; l = l->next) {
++ GstVideoCodecFrame *tmp;
++ BufferIdentification *id;
++
++ tmp = l->data;
++ id = gst_video_codec_frame_get_user_data (tmp);
++
++ /* This happens for frames that were just added but
++ * which were not passed to the component yet. Ignore
++ * them here!
++ */
++ if (!id)
++ continue;
++
++ if (id->timestamp == best_timestamp && l != best_l) {
++ GstVideoCodecFrame *removal;
++
++ removal = gst_video_decoder_get_frame (GST_VIDEO_DECODER (self),
++ tmp->system_frame_number);
++ gst_video_decoder_release_frame (GST_VIDEO_DECODER (self), removal);
++ }
++ }
++
++ g_list_foreach (frames, (GFunc) gst_video_codec_frame_unref, NULL);
++ g_list_free (frames);
++ frames = gst_video_decoder_get_frames (GST_VIDEO_DECODER (self));
++
+ for (l = frames; l && l != best_l; l = l->next) {
+ GstVideoCodecFrame *tmp = l->data;
+ BufferIdentification *id = gst_video_codec_frame_get_user_data (tmp);
+--
+1.8.1.2
+