summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorStéphane Cerveau <scerveau@collabora.com>2021-01-22 10:39:56 +0100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-09-20 15:11:03 +0000
commit0d0e89108bf72800c22962a6e996b3c1a9cd20bb (patch)
tree8b2652429715bbe8bbc59023e2b1d4d57f1a0bfd /gst
parent619cbca642f8bd4e3a1d6a5267f6afd6d8a28707 (diff)
downloadgstreamer-plugins-bad-0d0e89108bf72800c22962a6e996b3c1a9cd20bb.tar.gz
jpeg2000parse + openjpeg: Switch striped mode to its own caps
It's not compatible with any other element that use the non-striped mode. In addition, in this mode, we require that every frame have the same number of stripes or that the MARKER bit be present, which is different from the other formats too. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979>
Diffstat (limited to 'gst')
-rw-r--r--gst/videoparsers/gstjpeg2000parse.c96
1 files changed, 42 insertions, 54 deletions
diff --git a/gst/videoparsers/gstjpeg2000parse.c b/gst/videoparsers/gstjpeg2000parse.c
index bf3f3810a..4ac5ccfe8 100644
--- a/gst/videoparsers/gstjpeg2000parse.c
+++ b/gst/videoparsers/gstjpeg2000parse.c
@@ -109,15 +109,21 @@ static GstStaticPadTemplate srctemplate =
" width = (int)[1, MAX], height = (int)[1, MAX],"
GST_JPEG2000_SAMPLING_LIST ","
GST_JPEG2000_COLORSPACE_LIST ","
- " profile = (int)[0, 49151]," " parsed = (boolean) true")
+ " profile = (int)[0, 49151],"
+ " parsed = (boolean) true ; "
+ "image/x-jpc-striped,"
+ " width = (int)[1, MAX], height = (int)[1, MAX],"
+ GST_JPEG2000_SAMPLING_LIST ","
+ GST_JPEG2000_COLORSPACE_LIST ","
+ " profile = (int)[0, 49151],"
+ " num-stripes = [ 2, MAX ], parsed = (boolean) true;")
);
static GstStaticPadTemplate sinktemplate =
GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("image/jp2;"
- "image/x-jpc, alignment = (string){frame, stripe};"
- "image/x-j2c, alignment = (string){frame, stripe}"));
+ GST_STATIC_CAPS ("image/jp2; image/x-jpc; image/x-j2c; "
+ "image/x-jpc-striped"));
#define parent_class gst_jpeg2000_parse_parent_class
G_DEFINE_TYPE (GstJPEG2000Parse, gst_jpeg2000_parse, GST_TYPE_BASE_PARSE);
@@ -334,6 +340,8 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
guint num_prefix_bytes = 0; /* number of bytes to skip before actual code stream */
GstCaps *src_caps = NULL;
guint eoc_frame_size = 0;
+ gint num_stripes = 1;
+ gint stripe_height = 0;
for (i = 0; i < GST_JPEG2000_PARSE_MAX_SUPPORTED_COMPONENTS; ++i) {
dx[i] = 1;
@@ -684,15 +692,30 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
/* use caps height if in sub-frame mode, as encoded frame height will be
* strictly less than full frame height */
- if (current_caps_struct) {
- gint num_stripes = 1;
+ if (current_caps_struct &&
+ gst_structure_has_name (current_caps_struct, "image/x-jpc-striped")) {
gint h;
- if (gst_structure_get_int (current_caps_struct, "num-stripes", &num_stripes)
- && num_stripes > 1) {
- gst_structure_get_int (current_caps_struct, "height", &h);
- height = h;
+ if (!gst_structure_get_int (current_caps_struct, "num-stripes",
+ &num_stripes) || num_stripes < 2) {
+ GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
+ ("Striped JPEG 2000 is missing the stripe count"));
+ ret = GST_FLOW_ERROR;
+ goto beach;
+ }
+
+ if (!gst_structure_get_int (current_caps_struct, "stripe-height",
+ &stripe_height)) {
+ stripe_height = height;
+ } else if (stripe_height != height &&
+ !GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_MARKER)) {
+ GST_WARNING_OBJECT (parse,
+ "Only the last stripe is expected to be different"
+ " from the stripe height (%d != %u)", height, stripe_height);
}
+
+ gst_structure_get_int (current_caps_struct, "height", &h);
+ height = h;
}
/* now we can set the source caps, if something has changed */
@@ -705,8 +728,8 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
gint fr_num = 0, fr_denom = 0;
src_caps =
- gst_caps_new_simple (media_type_from_codec_format
- (jpeg2000parse->src_codec_format),
+ gst_caps_new_simple (num_stripes > 1 ? "image/x-jpc-striped" :
+ media_type_from_codec_format (jpeg2000parse->src_codec_format),
"width", G_TYPE_INT, width,
"height", G_TYPE_INT, height,
"colorspace", G_TYPE_STRING,
@@ -714,6 +737,10 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
G_TYPE_STRING, gst_jpeg2000_sampling_to_string (source_sampling),
"profile", G_TYPE_INT, profile, "parsed", G_TYPE_BOOLEAN, TRUE, NULL);
+ if (num_stripes > 1)
+ gst_caps_set_simple (src_caps, "num-stripes", G_TYPE_INT, num_stripes,
+ "stripe_height", G_TYPE_INT, stripe_height, NULL);
+
if (gst_jpeg2000_parse_is_broadcast (capabilities)
|| gst_jpeg2000_parse_is_imf (capabilities)) {
gst_caps_set_simple (src_caps, "main-level", G_TYPE_INT, main_level,
@@ -725,9 +752,9 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
}
if (current_caps_struct) {
- gint caps_int = 0;
- gboolean has_num_stripes = FALSE;
- const gchar *caps_string = gst_structure_get_string
+ const gchar *caps_string;
+
+ caps_string = gst_structure_get_string
(current_caps_struct, "colorimetry");
if (caps_string) {
gst_caps_set_simple (src_caps, "colorimetry", G_TYPE_STRING,
@@ -757,45 +784,6 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse,
gst_caps_set_simple (src_caps, "chroma-site", G_TYPE_STRING,
caps_string, NULL);
}
- caps_string = gst_structure_get_string (current_caps_struct, "alignment");
- has_num_stripes =
- gst_structure_get_int (current_caps_struct, "num-stripes", &caps_int);
- if ((g_strcmp0 (caps_string, "stripe") == 0)
- && !has_num_stripes) {
- GST_ERROR_OBJECT (jpeg2000parse,
- "Alignment is set to stripe but num-stripes is missing");
- ret = GST_FLOW_NOT_NEGOTIATED;
- gst_caps_unref (src_caps);
- goto beach;
- }
-
- /* if there is no alignment or number of strips in caps,
- * we set alignment to default value : "frame"
- */
- if (!caps_string && !has_num_stripes) {
- gst_caps_set_simple (src_caps, "alignment", G_TYPE_STRING,
- "frame", NULL);
- } else {
- if (caps_string) {
- gst_caps_set_simple (src_caps, "alignment", G_TYPE_STRING,
- caps_string, NULL);
- }
- if (has_num_stripes) {
- gst_caps_set_simple (src_caps, "num-stripes", G_TYPE_INT,
- caps_int, NULL);
- /* remove PTS interpolation in the case of stripes having same PTS */
- if (caps_int > 1)
- gst_base_parse_set_pts_interpolation (GST_BASE_PARSE
- (jpeg2000parse), FALSE);
- /* lets deduce the alignment property */
- if (!caps_string) {
- GST_WARNING_OBJECT (jpeg2000parse,
- "num-stripes is set but alignment is missing. We will deduce the correct value for \"alignment\"");
- gst_caps_set_simple (src_caps, "alignment", G_TYPE_STRING,
- caps_int > 1 ? "stripe" : "frame", NULL);
- }
- }
- }
if (gst_structure_get_fraction (current_caps_struct, "framerate", &fr_num,
&fr_denom)) {
gst_caps_set_simple (src_caps, "framerate", GST_TYPE_FRACTION, fr_num,