1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
From 554ffc759f9a87c4eac81fab91a2ac29e296c33c Mon Sep 17 00:00:00 2001
From: Kazunori Kobayashi <kkobayas@igel.co.jp>
Date: Thu, 4 Oct 2012 17:22:01 +0900
Subject: [PATCH 19/31] videocrop: send a query by the first invorker of
query_stride_supported
The query_stride_supported() might be failed because start() method
can be called before the pipeline is constructed. To resolve this issue,
this patch has the first invoker of query_stride_supported() send
the query to downstream plugins. The result of query is cached
at the first invoking.
---
gst/videocrop/gstvideocrop.c | 30 +++++++++++++-----------------
gst/videocrop/gstvideocrop.h | 1 -
2 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c
index 6b1da8a..da30c1b 100644
--- a/gst/videocrop/gstvideocrop.c
+++ b/gst/videocrop/gstvideocrop.c
@@ -137,9 +137,9 @@ static gboolean gst_video_crop_set_caps (GstBaseTransform * trans,
GstCaps * in_caps, GstCaps * outcaps);
static gboolean gst_video_crop_src_event (GstBaseTransform * trans,
GstEvent * event);
-static gboolean gst_video_crop_start (GstBaseTransform * trans);
static GstFlowReturn gst_video_crop_prepare_output_buffer (GstBaseTransform *
trans, GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf);
+static gboolean gst_video_crop_query_stride_supported (GstVideoCrop * vcrop);
static void
gst_video_crop_base_init (gpointer g_class)
@@ -232,7 +232,6 @@ gst_video_crop_class_init (GstVideoCropClass * klass)
basetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_crop_set_caps);
basetransform_class->get_unit_size =
GST_DEBUG_FUNCPTR (gst_video_crop_get_unit_size);
- basetransform_class->start = GST_DEBUG_FUNCPTR (gst_video_crop_start);
basetransform_class->prepare_output_buffer =
GST_DEBUG_FUNCPTR (gst_video_crop_prepare_output_buffer);
@@ -520,7 +519,7 @@ gst_video_crop_transform (GstBaseTransform * trans, GstBuffer * inbuf,
{
GstVideoCrop *vcrop = GST_VIDEO_CROP (trans);
- if (vcrop->stride_supported &&
+ if (gst_video_crop_query_stride_supported (vcrop) &&
((vcrop->in.packing == VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE) ||
(vcrop->in.packing == VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX) ||
(vcrop->in.packing == VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR))) {
@@ -688,11 +687,12 @@ gst_video_crop_transform_caps (GstBaseTransform * trans,
delta_chroma_offs = 0;
}
- if (vcrop->stride_supported && (direction == GST_PAD_SINK) && rowstride)
+ if (gst_video_crop_query_stride_supported (vcrop) &&
+ (direction == GST_PAD_SINK) && rowstride)
gst_structure_set (new_structure, "rowstride", G_TYPE_INT,
(gint) rowstride, NULL);
- if (vcrop->stride_supported &&
+ if (gst_video_crop_query_stride_supported (vcrop) &&
gst_structure_get_int (structure, "chroma_byte_offset",
&chroma_byte_offset) && delta_chroma_offs) {
/* Adjust chroma_byte_offset because it would exceed the proper value
@@ -772,10 +772,14 @@ cropping_too_much:
static gboolean
gst_video_crop_query_stride_supported (GstVideoCrop * vcrop)
{
- gboolean result = FALSE;
+ static gboolean result = FALSE;
GstPad *peer = gst_pad_get_peer (GST_BASE_TRANSFORM (vcrop)->srcpad);
GstStructure *structure;
GstQuery *query;
+ static gboolean is_query_done = FALSE;
+
+ if (is_query_done)
+ return result;
structure = gst_structure_empty_new ("GstQueryStrideSupported");
gst_structure_set (structure, "stride-supported", G_TYPE_BOOLEAN, FALSE,
@@ -788,17 +792,9 @@ gst_video_crop_query_stride_supported (GstVideoCrop * vcrop)
gst_query_unref (query);
gst_object_unref (peer);
- return result;
-}
-
-static gboolean
-gst_video_crop_start (GstBaseTransform * trans)
-{
- GstVideoCrop *vcrop = GST_VIDEO_CROP (trans);
-
- vcrop->stride_supported = gst_video_crop_query_stride_supported (vcrop);
+ is_query_done = TRUE;
- return TRUE;
+ return result;
}
static GstFlowReturn
@@ -808,7 +804,7 @@ gst_video_crop_prepare_output_buffer (GstBaseTransform * trans,
GstVideoCrop *vcrop = GST_VIDEO_CROP (trans);
guint sub_offset, sub_size;
- if (!vcrop->stride_supported) {
+ if (!gst_video_crop_query_stride_supported (vcrop)) {
GST_LOG_OBJECT
(vcrop,
"creating subbuffer isn't needed because downstream plugins don't support rowstride");
diff --git a/gst/videocrop/gstvideocrop.h b/gst/videocrop/gstvideocrop.h
index 2e5d5e6..1534b3d 100644
--- a/gst/videocrop/gstvideocrop.h
+++ b/gst/videocrop/gstvideocrop.h
@@ -83,7 +83,6 @@ struct _GstVideoCrop
/* query for rowstride */
GstQueryType query_type_stride;
- gboolean stride_supported;
};
struct _GstVideoCropClass
--
1.7.9.5
|