mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
jpegdec: Factor out gst_jpeg_turbo_parse_ext_fmt_convert()
Pull out peer caps checking code into gst_jpeg_turbo_parse_ext_fmt_convert(). This code is used by libjpeg-turbo extras to determine whether peer is capable of handling buffers into which libjpeg-turbo can directly decode data. This kind of check must be performed before jpeg_start_decompress() is called in gst_jpeg_dec_prepare_decode() as well as in gst_jpeg_dec_negotiate(), hence the common code. This commit does modify the code a little to make it easier to call from both call sites without much duplication, hence the extra `if (*clrspc)` test. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1687>
This commit is contained in:
parent
9a029f016d
commit
4ee4a9bff9
1 changed files with 53 additions and 43 deletions
|
@ -1008,6 +1008,55 @@ gst_fmt_to_jpeg_turbo_ext_fmt (GstVideoFormat gstfmt)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_jpeg_turbo_parse_ext_fmt_convert (GstJpegDec * dec, gint * clrspc)
|
||||||
|
{
|
||||||
|
GstCaps *peer_caps, *dec_caps;
|
||||||
|
|
||||||
|
dec_caps = gst_static_caps_get (&gst_jpeg_dec_src_pad_template.static_caps);
|
||||||
|
peer_caps =
|
||||||
|
gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (dec), dec_caps);
|
||||||
|
gst_caps_unref (dec_caps);
|
||||||
|
|
||||||
|
GST_DEBUG ("Received caps from peer: %" GST_PTR_FORMAT, peer_caps);
|
||||||
|
dec->format_convert = FALSE;
|
||||||
|
if (!gst_caps_is_empty (peer_caps)) {
|
||||||
|
GstStructure *peerstruct;
|
||||||
|
const gchar *peerformat;
|
||||||
|
GstVideoFormat peerfmt;
|
||||||
|
|
||||||
|
if (!gst_caps_is_fixed (peer_caps))
|
||||||
|
peer_caps = gst_caps_fixate (peer_caps);
|
||||||
|
|
||||||
|
peerstruct = gst_caps_get_structure (peer_caps, 0);
|
||||||
|
peerformat = gst_structure_get_string (peerstruct, "format");
|
||||||
|
peerfmt = gst_video_format_from_string (peerformat);
|
||||||
|
|
||||||
|
switch (peerfmt) {
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
if (clrspc)
|
||||||
|
*clrspc = JCS_RGB;
|
||||||
|
dec->format = peerfmt;
|
||||||
|
dec->format_convert = TRUE;
|
||||||
|
dec->libjpeg_ext_format = gst_fmt_to_jpeg_turbo_ext_fmt (peerfmt);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gst_caps_unref (peer_caps);
|
||||||
|
GST_DEBUG_OBJECT (dec, "format_convert=%d", dec->format_convert);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1017,7 +1066,6 @@ gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc,
|
||||||
GstVideoCodecState *outstate;
|
GstVideoCodecState *outstate;
|
||||||
GstVideoInfo *info;
|
GstVideoInfo *info;
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
GstCaps *peer_caps, *dec_caps;
|
|
||||||
|
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
if (dec->format_convert) {
|
if (dec->format_convert) {
|
||||||
|
@ -1052,48 +1100,10 @@ gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc,
|
||||||
gst_video_codec_state_unref (outstate);
|
gst_video_codec_state_unref (outstate);
|
||||||
}
|
}
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
dec_caps = gst_static_caps_get (&gst_jpeg_dec_src_pad_template.static_caps);
|
/* Determine if libjpeg-turbo direct format conversion can be used
|
||||||
peer_caps =
|
* with current caps and if so, adjust $dec to enable it and $clrspc
|
||||||
gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (dec), dec_caps);
|
* accordingly. */
|
||||||
gst_caps_unref (dec_caps);
|
gst_jpeg_turbo_parse_ext_fmt_convert (dec, &clrspc);
|
||||||
|
|
||||||
GST_DEBUG ("Received caps from peer: %" GST_PTR_FORMAT, peer_caps);
|
|
||||||
dec->format_convert = FALSE;
|
|
||||||
if (!gst_caps_is_empty (peer_caps)) {
|
|
||||||
GstStructure *peerstruct;
|
|
||||||
const gchar *peerformat;
|
|
||||||
GstVideoFormat peerfmt;
|
|
||||||
|
|
||||||
if (!gst_caps_is_fixed (peer_caps))
|
|
||||||
peer_caps = gst_caps_fixate (peer_caps);
|
|
||||||
|
|
||||||
peerstruct = gst_caps_get_structure (peer_caps, 0);
|
|
||||||
peerformat = gst_structure_get_string (peerstruct, "format");
|
|
||||||
peerfmt = gst_video_format_from_string (peerformat);
|
|
||||||
|
|
||||||
switch (peerfmt) {
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
clrspc = JCS_RGB;
|
|
||||||
format = peerfmt;
|
|
||||||
dec->format_convert = TRUE;
|
|
||||||
dec->libjpeg_ext_format = gst_fmt_to_jpeg_turbo_ext_fmt (peerfmt);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dec->format = format;
|
|
||||||
gst_caps_unref (peer_caps);
|
|
||||||
GST_DEBUG_OBJECT (dec, "format_convert=%d", dec->format_convert);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
outstate =
|
outstate =
|
||||||
|
|
Loading…
Reference in a new issue