1、找到gstreamer中x264当前支持的色彩空间类型的代码
static gboolean gst_x264_enc_add_x264_chroma_format (GstStructure * s, gboolean allow_420_8, gboolean allow_420_10, gboolean allow_422, gboolean allow_444) { GValue fmts = G_VALUE_INIT; GValue fmt = G_VALUE_INIT; gboolean ret = FALSE; g_value_init (&fmts, GST_TYPE_LIST); g_value_init (&fmt, G_TYPE_STRING); if (vtable_8bit) { gint chroma_format = *vtable_8bit->x264_chroma_format; if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { g_value_set_string (&fmt, "Y444"); gst_value_list_append_value (&fmts, &fmt); } if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { g_value_set_string (&fmt, "Y42B"); gst_value_list_append_value (&fmts, &fmt); } if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_8) { g_value_set_string (&fmt, "I420"); gst_value_list_append_value (&fmts, &fmt); g_value_set_string (&fmt, "YV12"); gst_value_list_append_value (&fmts, &fmt); g_value_set_string (&fmt, "NV12"); gst_value_list_append_value (&fmts, &fmt); } } if (vtable_10bit) { gint chroma_format = *vtable_10bit->x264_chroma_format; if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "Y444_10LE"); else g_value_set_string (&fmt, "Y444_10BE"); gst_value_list_append_value (&fmts, &fmt); } if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "I422_10LE"); else g_value_set_string (&fmt, "I422_10BE"); gst_value_list_append_value (&fmts, &fmt); } if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_10) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "I420_10LE"); else g_value_set_string (&fmt, "I420_10BE"); gst_value_list_append_value (&fmts, &fmt); } } if (gst_value_list_get_size (&fmts) != 0) { gst_structure_take_value (s, "format", &fmts); ret = TRUE; } else { g_value_unset (&fmts); } g_value_unset (&fmt); return ret; }
2、增加如下代码
if ((chroma_format == 0 || chroma_format ==X264_CSP_RGB) && allow_RGB_32) { g_value_set_string (&fmt, "RGB32"); gst_value_list_append_value (&fmts, &fmt); }
3、还需要确定你的x264库是不是支持
/* Colorspace type */ #define X264_CSP_MASK 0x00ff /* */ #define X264_CSP_NONE 0x0000 /* Invalid mode */ #define X264_CSP_I400 0x0001 /* monochrome 4:0:0 */ #define X264_CSP_I420 0x0002 /* yuv 4:2:0 planar */ #define X264_CSP_YV12 0x0003 /* yvu 4:2:0 planar */ #define X264_CSP_NV12 0x0004 /* yuv 4:2:0, with one y plane and one packed u+v */ #define X264_CSP_NV21 0x0005 /* yuv 4:2:0, with one y plane and one packed v+u */ #define X264_CSP_I422 0x0006 /* yuv 4:2:2 planar */ #define X264_CSP_YV16 0x0007 /* yvu 4:2:2 planar */ #define X264_CSP_NV16 0x0008 /* yuv 4:2:2, with one y plane and one packed u+v */ #define X264_CSP_YUYV 0x0009 /* yuyv 4:2:2 packed */ #define X264_CSP_UYVY 0x000a /* uyvy 4:2:2 packed */ #define X264_CSP_V210 0x000b /* 10-bit yuv 4:2:2 packed in 32 */ #define X264_CSP_I444 0x000c /* yuv 4:4:4 planar */ #define X264_CSP_YV24 0x000d /* yvu 4:4:4 planar */ #define X264_CSP_BGR 0x000e /* packed bgr 24bits */ #define X264_CSP_BGRA 0x000f /* packed bgr 32bits */ #define X264_CSP_RGB 0x0010 /* packed rgb 24bits */ #define X264_CSP_MAX 0x0011 /* end of list */ #define X264_CSP_VFLIP 0x1000 /* the csp is vertically flipped */ #define X264_CSP_HIGH_DEPTH 0x2000 /* the csp has a depth of 16 bits per pixel component */