diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index 37925b3253..c7776a2d9d 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -1,4 +1,4 @@ - { +{ "accurip": { "description": "Computes an AccurateRip CRC", "elements": { @@ -217932,7 +217932,7 @@ "long-name": "OpenJPEG JPEG2000 decoder", "pad-templates": { "sink": { - "caps": "image/x-j2c:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/x-jpc:\n alignment: frame\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/jp2:\n", + "caps": "image/x-j2c:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/x-jpc:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/jp2:\nimage/x-jpc-striped:\n num-stripes: [ 2, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n", "direction": "sink", "presence": "always" }, @@ -217943,8 +217943,22 @@ } }, "properties": { + "max-slice-threads": { + "blurb": "Maximum number of worker threads to spawn according to the frame boundary. (0 = no thread)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, "max-threads": { - "blurb": "Maximum number of worker threads to spawn. (0 = auto)", + "blurb": "Maximum number of worker threads to spawn used by openjpeg internally. (0 = no thread)", "conditionally-available": false, "construct": false, "construct-only": false, @@ -217983,7 +217997,7 @@ "presence": "always" }, "src": { - "caps": "image/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n num-stripes: [ 1, 2147483647 ]\n alignment: { (string)frame, (string)stripe }\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/jp2:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n", + "caps": "image/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n num-stripes: [ 1, 2147483647 ]\n alignment: { (string)frame, (string)stripe }\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/jp2:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\nimage/x-jpc-striped:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n num-stripes: [ 2, 2147483647 ]\n stripe-height: [ 1, 2147483647 ]\n", "direction": "src", "presence": "always" } @@ -226301,12 +226315,12 @@ "long-name": "JPEG 2000 parser", "pad-templates": { "sink": { - "caps": "image/jp2:\nimage/x-jpc:\n alignment: { (string)frame, (string)stripe }\nimage/x-j2c:\n alignment: { (string)frame, (string)stripe }\n", + "caps": "image/jp2:\nimage/x-jpc:\nimage/x-j2c:\nimage/x-jpc-striped:\n", "direction": "sink", "presence": "always" }, "src": { - "caps": "image/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\nimage/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\n", + "caps": "image/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\nimage/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\nimage/x-jpc-striped:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n num-stripes: [ 2, 2147483647 ]\n parsed: true\n", "direction": "src", "presence": "always" } @@ -230150,4 +230164,4 @@ "tracers": {}, "url": "Unknown package origin" } -} +} \ No newline at end of file diff --git a/ext/openjpeg/gstopenjpegdec.c b/ext/openjpeg/gstopenjpegdec.c index ef67b21e66..4909d9a348 100644 --- a/ext/openjpeg/gstopenjpegdec.c +++ b/ext/openjpeg/gstopenjpegdec.c @@ -101,11 +101,11 @@ static GstStaticPadTemplate gst_openjpeg_dec_sink_template = GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/x-j2c, " - "alignment= (string){frame,stripe}, " GST_JPEG2000_SAMPLING_LIST "; " "image/x-jpc," - "alignment= (string){frame,stripe}, " - GST_JPEG2000_SAMPLING_LIST "; " "image/jp2") + GST_JPEG2000_SAMPLING_LIST "; image/jp2 ; " + "image/x-jpc-striped, " + "num-stripes = (int) [2, MAX], " GST_JPEG2000_SAMPLING_LIST) ); static GstStaticPadTemplate gst_openjpeg_dec_src_template = @@ -359,8 +359,6 @@ gst_openjpeg_dec_set_format (GstVideoDecoder * decoder, { GstOpenJPEGDec *self = GST_OPENJPEG_DEC (decoder); GstStructure *s; - gint caps_int = 0; - const gchar *caps_string = NULL; GST_DEBUG_OBJECT (self, "Setting format: %" GST_PTR_FORMAT, state->caps); @@ -374,27 +372,22 @@ gst_openjpeg_dec_set_format (GstVideoDecoder * decoder, } else if (gst_structure_has_name (s, "image/x-j2c")) { self->codec_format = OPJ_CODEC_J2K; self->is_jp2c = TRUE; - } else if (gst_structure_has_name (s, "image/x-jpc")) { + } else if (gst_structure_has_name (s, "image/x-jpc") || + gst_structure_has_name (s, "image/x-jpc-striped")) { self->codec_format = OPJ_CODEC_J2K; self->is_jp2c = FALSE; } else { g_return_val_if_reached (FALSE); } - self->num_stripes = 1; - caps_string = gst_structure_get_string (s, "alignment"); - gst_structure_get_int (s, "num-stripes", &caps_int); - if (caps_int > 1) { - self->num_stripes = caps_int; + if (gst_structure_has_name (s, "image/x-jpc-striped")) { + gst_structure_get_int (s, "num-stripes", &self->num_stripes); gst_video_decoder_set_subframe_mode (decoder, TRUE); } else { + self->num_stripes = 1; gst_video_decoder_set_subframe_mode (decoder, FALSE); - if (g_strcmp0 (caps_string, "stripe") == 0) { - GST_ERROR_OBJECT (self, - "Alignment is set to stripe but num-stripes is missing"); - return FALSE; - } } + self->sampling = gst_jpeg2000_sampling_from_string (gst_structure_get_string (s, "sampling")); diff --git a/ext/openjpeg/gstopenjpegenc.c b/ext/openjpeg/gstopenjpegenc.c index 4d70e3089c..f6d8e203b7 100644 --- a/ext/openjpeg/gstopenjpegenc.c +++ b/ext/openjpeg/gstopenjpegenc.c @@ -162,7 +162,15 @@ static GstStaticPadTemplate gst_openjpeg_enc_src_template = "alignment = (string) { frame, stripe }, " GST_JPEG2000_SAMPLING_LIST "," GST_JPEG2000_COLORSPACE_LIST "; " - "image/jp2, " "width = (int) [1, MAX], " "height = (int) [1, MAX]") + "image/jp2, " "width = (int) [1, MAX], " + "height = (int) [1, MAX] ;" + "image/x-jpc-striped, " + "width = (int) [1, MAX], " + "height = (int) [1, MAX], " + "num-components = (int) [1, 4], " + GST_JPEG2000_SAMPLING_LIST ", " + GST_JPEG2000_COLORSPACE_LIST ", " + "num-stripes = (int) [2, MAX], stripe-height = (int) [1 , MAX]") ); #define parent_class gst_openjpeg_enc_parent_class @@ -742,20 +750,46 @@ gst_openjpeg_enc_set_format (GstVideoEncoder * encoder, gst_video_codec_state_unref (self->input_state); self->input_state = gst_video_codec_state_ref (state); - allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); - allowed_caps = gst_caps_truncate (allowed_caps); - s = gst_caps_get_structure (allowed_caps, 0); - if (gst_structure_has_name (s, "image/jp2")) { - self->codec_format = OPJ_CODEC_JP2; - self->is_jp2c = FALSE; - } else if (gst_structure_has_name (s, "image/x-j2c")) { - self->codec_format = OPJ_CODEC_J2K; - self->is_jp2c = TRUE; - } else if (gst_structure_has_name (s, "image/x-jpc")) { + if (stripe_mode) { + GstCaps *template_caps = gst_caps_new_empty_simple ("image/x-jpc-striped"); + GstCaps *my_caps; + + my_caps = gst_pad_query_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder), + template_caps); + gst_caps_unref (template_caps); + + allowed_caps = gst_pad_peer_query_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder), + my_caps); + gst_caps_unref (my_caps); + + if (gst_caps_is_empty (allowed_caps)) { + gst_caps_unref (allowed_caps); + GST_WARNING_OBJECT (self, "Striped JPEG 2000 not accepted downstream"); + return FALSE; + } + self->codec_format = OPJ_CODEC_J2K; self->is_jp2c = FALSE; + allowed_caps = gst_caps_truncate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); } else { - g_return_val_if_reached (FALSE); + allowed_caps = + gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); + allowed_caps = gst_caps_truncate (allowed_caps); + + s = gst_caps_get_structure (allowed_caps, 0); + if (gst_structure_has_name (s, "image/jp2")) { + self->codec_format = OPJ_CODEC_JP2; + self->is_jp2c = FALSE; + } else if (gst_structure_has_name (s, "image/x-j2c")) { + self->codec_format = OPJ_CODEC_J2K; + self->is_jp2c = TRUE; + } else if (gst_structure_has_name (s, "image/x-jpc")) { + self->codec_format = OPJ_CODEC_J2K; + self->is_jp2c = FALSE; + } else { + g_return_val_if_reached (FALSE); + } } switch (state->info.finfo->format) { @@ -806,7 +840,6 @@ gst_openjpeg_enc_set_format (GstVideoEncoder * encoder, g_assert_not_reached (); } - /* sampling */ /* note: encoder re-orders channels so that alpha channel is encoded as the last channel */ switch (state->info.finfo->format) { @@ -861,21 +894,24 @@ gst_openjpeg_enc_set_format (GstVideoEncoder * encoder, } else g_return_val_if_reached (FALSE); - if (sampling != GST_JPEG2000_SAMPLING_NONE) { - caps = gst_caps_new_simple (gst_structure_get_name (s), + if (stripe_mode) { + caps = gst_caps_new_simple ("image/x-jpc-striped", "colorspace", G_TYPE_STRING, colorspace, "sampling", G_TYPE_STRING, gst_jpeg2000_sampling_to_string (sampling), "num-components", G_TYPE_INT, ncomps, - "alignment", G_TYPE_STRING, - stripe_mode ? "stripe" : "frame", - "num-stripes", G_TYPE_INT, self->num_stripes, NULL); + "num-stripes", G_TYPE_INT, self->num_stripes, + "stripe-height", G_TYPE_INT, + get_stripe_height (self, 0, + GST_VIDEO_INFO_COMP_HEIGHT (&state->info, 0)), NULL); + } else if (sampling != GST_JPEG2000_SAMPLING_NONE) { + caps = gst_caps_new_simple (gst_structure_get_name (s), + "colorspace", G_TYPE_STRING, colorspace, + "sampling", G_TYPE_STRING, gst_jpeg2000_sampling_to_string (sampling), + "num-components", G_TYPE_INT, ncomps, NULL); } else { caps = gst_caps_new_simple (gst_structure_get_name (s), "colorspace", G_TYPE_STRING, colorspace, - "num-components", G_TYPE_INT, ncomps, - "alignment", G_TYPE_STRING, - stripe_mode ? "stripe" : "frame", - "num-stripes", G_TYPE_INT, self->num_stripes, NULL); + "num-components", G_TYPE_INT, ncomps, NULL); } gst_caps_unref (allowed_caps); @@ -1342,30 +1378,14 @@ gst_openjpeg_enc_handle_frame (GstVideoEncoder * encoder, GstOpenJPEGEnc *self = GST_OPENJPEG_ENC (encoder); GstFlowReturn ret = GST_FLOW_OK; GstVideoFrame vframe; - - GstCaps *current_caps; - GstStructure *s; gboolean subframe_mode = self->num_stripes != GST_OPENJPEG_ENC_DEFAULT_NUM_STRIPES; GST_DEBUG_OBJECT (self, "Handling frame"); - current_caps = gst_pad_get_current_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); - s = gst_caps_get_structure (current_caps, 0); - if (subframe_mode) { - const gchar *str = gst_structure_get_string (s, "alignment"); gint min_res; - if (g_strcmp0 (str, "stripe") != 0) { - GST_ERROR_OBJECT (self, - "Number of stripes set to %d, but alignment=stripe not supported downstream", - self->num_stripes); - gst_video_codec_frame_unref (frame); - ret = GST_FLOW_NOT_NEGOTIATED; - goto done; - } - /* due to limitations in openjpeg library, * number of wavelet resolutions must not exceed floor(log(stripe height)) + 1 */ if (!gst_video_frame_map (&vframe, &self->input_state->info, @@ -1387,9 +1407,7 @@ gst_openjpeg_enc_handle_frame (GstVideoEncoder * encoder, } if (self->encode_frame (encoder, frame) != GST_FLOW_OK) goto error; -done: - if (current_caps) - gst_caps_unref (current_caps); + return ret; error: diff --git a/gst/videoparsers/gstjpeg2000parse.c b/gst/videoparsers/gstjpeg2000parse.c index bf3f3810ae..4ac5ccfe84 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,