mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-12 18:35:35 +00:00
Add a caps_to_codecid() function to read properties from a caps function for use in _connect() functions
Original commit message from CVS: Add a caps_to_codecid() function to read properties from a caps function for use in _connect() functions
This commit is contained in:
parent
b17e56216c
commit
c3b5d3f3fe
2 changed files with 166 additions and 1 deletions
|
@ -147,7 +147,7 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
|
||||||
caps = gst_caps_append(caps,
|
caps = gst_caps_append(caps,
|
||||||
GST_FF_VID_CAPS_NEW ("ffmpeg_divx",
|
GST_FF_VID_CAPS_NEW ("ffmpeg_divx",
|
||||||
"video/divx",
|
"video/divx",
|
||||||
"divxversion", GST_PROPS_INT (5)
|
"divxversion", GST_PROPS_INT (5)
|
||||||
));
|
));
|
||||||
caps = gst_caps_append(caps,
|
caps = gst_caps_append(caps,
|
||||||
GST_FF_VID_CAPS_NEW ("ffmpeg_xvid",
|
GST_FF_VID_CAPS_NEW ("ffmpeg_xvid",
|
||||||
|
@ -535,3 +535,159 @@ gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
|
||||||
|
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert a GstCaps (audio/raw) to a FFMPEG SampleFmt
|
||||||
|
* and other audio properties in a AVCodecContext.
|
||||||
|
*
|
||||||
|
* For usefullness, see below
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_ffmpeg_caps_to_smpfmt (GstCaps *caps,
|
||||||
|
AVCodecContext *context)
|
||||||
|
{
|
||||||
|
if (gst_caps_has_property_typed (caps, "width",
|
||||||
|
GST_PROPS_INT_TYPE) &&
|
||||||
|
gst_caps_has_property_typed (caps, "depth",
|
||||||
|
GST_PROPS_INT_TYPE) &&
|
||||||
|
gst_caps_has_property_typed (caps, "signed",
|
||||||
|
GST_PROPS_BOOLEAN_TYPE) &&
|
||||||
|
gst_caps_has_property_typed (caps, "endianness",
|
||||||
|
GST_PROPS_INT_TYPE)) {
|
||||||
|
gint depth = 0, width = 0, endianness = 0;
|
||||||
|
gboolean signedness = FALSE;
|
||||||
|
gst_caps_get (caps,
|
||||||
|
"width", &width,
|
||||||
|
"depth", &depth,
|
||||||
|
"endianness", &endianness,
|
||||||
|
"signed", &signedness,
|
||||||
|
NULL);
|
||||||
|
if (width == 16 && depth == 16 &&
|
||||||
|
endianness == G_BYTE_ORDER && signedness == TRUE) {
|
||||||
|
context->sample_fmt = SAMPLE_FMT_S16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gst_caps_has_property_typed (caps, "channels",
|
||||||
|
GST_PROPS_INT_TYPE)) {
|
||||||
|
gst_caps_get_int (caps, "rate", &context->channels);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gst_caps_has_property_typed (caps, "rate",
|
||||||
|
GST_PROPS_INT_TYPE)) {
|
||||||
|
gst_caps_get_int (caps, "rate", &context->sample_rate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert a GstCaps (video/raw) to a FFMPEG PixFmt
|
||||||
|
* and other video properties in a AVCodecContext.
|
||||||
|
*
|
||||||
|
* For usefullness, see below
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_ffmpeg_caps_to_pixfmt (GstCaps *caps,
|
||||||
|
AVCodecContext *context)
|
||||||
|
{
|
||||||
|
if (gst_caps_has_property_typed (caps, "width",
|
||||||
|
GST_PROPS_INT_TYPE) &&
|
||||||
|
gst_caps_has_property_typed (caps, "height",
|
||||||
|
GST_PROPS_INT_TYPE)) {
|
||||||
|
gst_caps_get (caps,
|
||||||
|
"width", &context->width,
|
||||||
|
"height", &context->height,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gst_caps_has_property_typed (caps, "format",
|
||||||
|
GST_PROPS_FOURCC_TYPE)) {
|
||||||
|
guint32 fourcc;
|
||||||
|
gst_caps_get_fourcc_int (caps, "format", &fourcc);
|
||||||
|
|
||||||
|
switch (fourcc) {
|
||||||
|
case GST_MAKE_FOURCC ('Y','U','Y','2'):
|
||||||
|
context->pix_fmt = PIX_FMT_YUV422;
|
||||||
|
break;
|
||||||
|
case GST_MAKE_FOURCC ('I','4','2','0'):
|
||||||
|
context->pix_fmt = PIX_FMT_YUV420P;
|
||||||
|
break;
|
||||||
|
case GST_MAKE_FOURCC ('Y','4','1','P'):
|
||||||
|
context->pix_fmt = PIX_FMT_YUV411P;
|
||||||
|
break;
|
||||||
|
case GST_MAKE_FOURCC ('R','G','B',' '):
|
||||||
|
if (gst_caps_has_property_typed (caps, "depth",
|
||||||
|
GST_PROPS_INT_TYPE) &&
|
||||||
|
gst_caps_has_property_typed (caps, "endianness",
|
||||||
|
GST_PROPS_INT_TYPE)) {
|
||||||
|
gint depth = 0, endianness = 0;
|
||||||
|
gst_caps_get_int (caps, "depth", &depth);
|
||||||
|
gst_caps_get_int (caps, "endianness", &endianness);
|
||||||
|
|
||||||
|
switch (depth) {
|
||||||
|
case 32:
|
||||||
|
if (endianness == G_BYTE_ORDER)
|
||||||
|
context->pix_fmt = PIX_FMT_RGBA32;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
switch (endianness) {
|
||||||
|
case G_LITTLE_ENDIAN:
|
||||||
|
context->pix_fmt = PIX_FMT_BGR24;
|
||||||
|
break;
|
||||||
|
case G_BIG_ENDIAN:
|
||||||
|
context->pix_fmt = PIX_FMT_RGB24;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* nothing */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
if (endianness == G_BYTE_ORDER)
|
||||||
|
context->pix_fmt = PIX_FMT_RGB565;
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
if (endianness == G_BYTE_ORDER)
|
||||||
|
context->pix_fmt = PIX_FMT_RGB555;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* nothing */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* nothing */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert a GstCaps and a FFMPEG codec Type to a
|
||||||
|
* AVCodecContext. If the context is ommitted, no fixed values
|
||||||
|
* for video/audio size will be included in the context
|
||||||
|
*
|
||||||
|
* CodecType is primarily meant for uncompressed data GstCaps!
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_ffmpeg_caps_to_codectype (enum CodecType type,
|
||||||
|
GstCaps *caps,
|
||||||
|
AVCodecContext *context)
|
||||||
|
{
|
||||||
|
if (context == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case CODEC_TYPE_VIDEO:
|
||||||
|
gst_ffmpeg_caps_to_pixfmt (caps, context);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CODEC_TYPE_AUDIO:
|
||||||
|
gst_ffmpeg_caps_to_smpfmt (caps, context);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* unknown */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -43,4 +43,13 @@ GstCaps *
|
||||||
gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
|
gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
|
||||||
AVCodecContext *context);
|
AVCodecContext *context);
|
||||||
|
|
||||||
|
/* caps_to_codectype () transforms a GstCaps that belongs to
|
||||||
|
* a pad for uncompressed data to a filled-in context
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_ffmpeg_caps_to_codectype (enum CodecType type,
|
||||||
|
GstCaps *caps,
|
||||||
|
AVCodecContext *context);
|
||||||
|
|
||||||
#endif /* __GST_FFMPEG_CODECMAP_H__ */
|
#endif /* __GST_FFMPEG_CODECMAP_H__ */
|
||||||
|
|
Loading…
Reference in a new issue