mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 15:48:23 +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/1716>
This commit is contained in:
parent
b0ad4d3aee
commit
3cc743cfc8
1 changed files with 53 additions and 43 deletions
|
@ -1008,6 +1008,55 @@ gst_fmt_to_jpeg_turbo_ext_fmt (GstVideoFormat gstfmt)
|
|||
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
|
||||
|
||||
static void
|
||||
|
@ -1017,7 +1066,6 @@ gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc,
|
|||
GstVideoCodecState *outstate;
|
||||
GstVideoInfo *info;
|
||||
GstVideoFormat format;
|
||||
GstCaps *peer_caps, *dec_caps;
|
||||
|
||||
#ifdef JCS_EXTENSIONS
|
||||
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);
|
||||
}
|
||||
#ifdef JCS_EXTENSIONS
|
||||
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:
|
||||
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);
|
||||
/* Determine if libjpeg-turbo direct format conversion can be used
|
||||
* with current caps and if so, adjust $dec to enable it and $clrspc
|
||||
* accordingly. */
|
||||
gst_jpeg_turbo_parse_ext_fmt_convert (dec, &clrspc);
|
||||
#endif
|
||||
|
||||
outstate =
|
||||
|
|
Loading…
Reference in a new issue