mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
Fix RGB better
Original commit message from CVS: Fix RGB better
This commit is contained in:
parent
4c2868ef36
commit
d0b4ac409e
1 changed files with 77 additions and 55 deletions
|
@ -851,6 +851,9 @@ gst_ffmpeg_caps_to_pixfmt (GstCaps *caps,
|
||||||
case GST_MAKE_FOURCC ('Y','4','1','B'):
|
case GST_MAKE_FOURCC ('Y','4','1','B'):
|
||||||
context->pix_fmt = PIX_FMT_YUV411P;
|
context->pix_fmt = PIX_FMT_YUV411P;
|
||||||
break;
|
break;
|
||||||
|
case GST_MAKE_FOURCC ('Y','4','2','B'):
|
||||||
|
context->pix_fmt = PIX_FMT_YUV422P;
|
||||||
|
break;
|
||||||
case GST_MAKE_FOURCC ('Y','U','V','9'):
|
case GST_MAKE_FOURCC ('Y','U','V','9'):
|
||||||
context->pix_fmt = PIX_FMT_YUV410P;
|
context->pix_fmt = PIX_FMT_YUV410P;
|
||||||
break;
|
break;
|
||||||
|
@ -864,32 +867,34 @@ gst_ffmpeg_caps_to_pixfmt (GstCaps *caps,
|
||||||
} else if (strcmp (gst_caps_get_mime (caps), "video/x-raw-rgb") == 0) {
|
} else if (strcmp (gst_caps_get_mime (caps), "video/x-raw-rgb") == 0) {
|
||||||
if (gst_caps_has_property_typed (caps, "bpp", GST_PROPS_INT_TYPE) &&
|
if (gst_caps_has_property_typed (caps, "bpp", GST_PROPS_INT_TYPE) &&
|
||||||
gst_caps_has_property_typed (caps, "red_mask", GST_PROPS_INT_TYPE)) {
|
gst_caps_has_property_typed (caps, "red_mask", GST_PROPS_INT_TYPE)) {
|
||||||
gint bpp = 0, red_mask = 0;
|
gint bpp = 0, rmask = 0, endianness = 0;
|
||||||
gst_caps_get_int (caps, "bpp", &bpp);
|
|
||||||
gst_caps_get_int (caps, "red_mask", &red_mask);
|
gst_caps_get (caps, "bpp", &bpp,
|
||||||
|
"red_mask", &rmask,
|
||||||
|
"endianness", &endianness, NULL);
|
||||||
|
|
||||||
switch (bpp) {
|
switch (bpp) {
|
||||||
case 32:
|
case 32:
|
||||||
context->pix_fmt = PIX_FMT_RGBA32;
|
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
if (rmask == 0xff0000)
|
||||||
|
#else
|
||||||
|
if (rmask == 0x0000ff)
|
||||||
|
#endif
|
||||||
|
context->pix_fmt = PIX_FMT_RGBA32;
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
switch (red_mask) {
|
if (rmask == 0x0000FF)
|
||||||
case 0x0000FF:
|
context->pix_fmt = PIX_FMT_BGR24;
|
||||||
context->pix_fmt = PIX_FMT_BGR24;
|
else
|
||||||
break;
|
context->pix_fmt = PIX_FMT_RGB24;
|
||||||
case 0xFF0000:
|
|
||||||
context->pix_fmt = PIX_FMT_RGB24;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* nothing */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
context->pix_fmt = PIX_FMT_RGB565;
|
if (endianness == G_BYTE_ORDER)
|
||||||
|
context->pix_fmt = PIX_FMT_RGB565;
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
context->pix_fmt = PIX_FMT_RGB555;
|
if (endianness == G_BYTE_ORDER)
|
||||||
|
context->pix_fmt = PIX_FMT_RGB555;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* nothing */
|
/* nothing */
|
||||||
|
@ -1025,53 +1030,70 @@ gst_ffmpeg_caps_to_codecid (GstCaps *caps,
|
||||||
|
|
||||||
mimetype = gst_caps_get_mime(caps);
|
mimetype = gst_caps_get_mime(caps);
|
||||||
|
|
||||||
if (!strcmp (mimetype, "video/x-raw-rgb") ||
|
if (!strcmp (mimetype, "video/x-raw-rgb")) {
|
||||||
!strcmp (mimetype, "video/x-raw-yuv")) {
|
|
||||||
|
id = CODEC_ID_RAWVIDEO;
|
||||||
|
|
||||||
|
if (context != NULL) {
|
||||||
|
gint bpp = 0, endianness = 0, rmask = 0;
|
||||||
|
enum PixelFormat pix_fmt = -1;
|
||||||
|
|
||||||
|
gst_caps_get (caps, "bpp", &bpp,
|
||||||
|
"endianness", &endianness,
|
||||||
|
"rmask", &rmask, NULL);
|
||||||
|
|
||||||
|
switch (bpp) {
|
||||||
|
case 15:
|
||||||
|
if (endianness == G_BYTE_ORDER) {
|
||||||
|
pix_fmt = PIX_FMT_RGB555;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
if (endianness == G_BYTE_ORDER) {
|
||||||
|
pix_fmt = PIX_FMT_RGB565;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
if (rmask == 0xff0000) {
|
||||||
|
pix_fmt = PIX_FMT_RGB24;
|
||||||
|
} else {
|
||||||
|
pix_fmt = PIX_FMT_BGR24;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
if (rmask == 0xff0000) {
|
||||||
|
#else
|
||||||
|
if (rmask == 0x0000ff) {
|
||||||
|
#endif
|
||||||
|
pix_fmt = PIX_FMT_RGBA32;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* ... */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only set if actually recognized! */
|
||||||
|
if (pix_fmt != -1) {
|
||||||
|
video = TRUE;
|
||||||
|
context->pix_fmt = pix_fmt;
|
||||||
|
} else {
|
||||||
|
id = CODEC_ID_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (!strcmp (mimetype, "video/x-raw-yuv")) {
|
||||||
|
|
||||||
id = CODEC_ID_RAWVIDEO;
|
id = CODEC_ID_RAWVIDEO;
|
||||||
|
|
||||||
if (context != NULL) {
|
if (context != NULL) {
|
||||||
gint depth = 0, endianness = 0;
|
|
||||||
guint32 fmt_fcc = 0;
|
guint32 fmt_fcc = 0;
|
||||||
enum PixelFormat pix_fmt = -1;
|
enum PixelFormat pix_fmt = -1;
|
||||||
|
|
||||||
if (gst_caps_has_property (caps, "format"))
|
gst_caps_get_fourcc_int (caps, "format", &fmt_fcc);
|
||||||
gst_caps_get_fourcc_int (caps, "format", &fmt_fcc);
|
|
||||||
else
|
|
||||||
fmt_fcc = GST_MAKE_FOURCC ('R','G','B',' ');
|
|
||||||
|
|
||||||
switch (fmt_fcc) {
|
switch (fmt_fcc) {
|
||||||
case GST_MAKE_FOURCC ('R','G','B',' '):
|
|
||||||
gst_caps_get_int (caps, "endianness", &endianness);
|
|
||||||
gst_caps_get_int (caps, "depth", &depth);
|
|
||||||
switch (depth) {
|
|
||||||
case 15:
|
|
||||||
if (endianness == G_BYTE_ORDER) {
|
|
||||||
pix_fmt = PIX_FMT_RGB555;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
if (endianness == G_BYTE_ORDER) {
|
|
||||||
pix_fmt = PIX_FMT_RGB565;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
if (endianness == G_BIG_ENDIAN) {
|
|
||||||
pix_fmt = PIX_FMT_RGB24;
|
|
||||||
} else {
|
|
||||||
pix_fmt = PIX_FMT_BGR24;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
if (endianness == G_BIG_ENDIAN) {
|
|
||||||
pix_fmt = PIX_FMT_RGBA32;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* ... */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GST_MAKE_FOURCC ('Y','U','Y','2'):
|
case GST_MAKE_FOURCC ('Y','U','Y','2'):
|
||||||
pix_fmt = PIX_FMT_YUV422;
|
pix_fmt = PIX_FMT_YUV422;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue