Fix RGB better

Original commit message from CVS:
Fix RGB better
This commit is contained in:
Ronald S. Bultje 2003-11-28 20:06:18 +00:00
parent 4c2868ef36
commit d0b4ac409e

View file

@ -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;