ffmpeg: convert to new caps

This commit is contained in:
Wim Taymans 2011-08-22 13:33:31 +02:00
parent dd56c2c7ea
commit 4361442827
2 changed files with 93 additions and 117 deletions

View file

@ -816,37 +816,37 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
case CODEC_ID_DVVIDEO:
{
if (encode && context) {
guint32 fourcc;
const gchar *format;
switch (context->pix_fmt) {
case PIX_FMT_YUYV422:
fourcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
format = "YUY2";
break;
case PIX_FMT_YUV420P:
fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
format = "I420";
break;
case PIX_FMT_YUVA420P:
fourcc = GST_MAKE_FOURCC ('A', '4', '2', '0');
format = "A420";
break;
case PIX_FMT_YUV411P:
fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
format = "Y41B";
break;
case PIX_FMT_YUV422P:
fourcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
format = "Y42B";
break;
case PIX_FMT_YUV410P:
fourcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
format = "YUV9";
break;
default:
GST_WARNING
("Couldnt' find fourcc for pixfmt %d, defaulting to I420",
("Couldnt' find format for pixfmt %d, defaulting to I420",
context->pix_fmt);
fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
format = "I420";
break;
}
caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
"systemstream", G_TYPE_BOOLEAN, FALSE,
"format", GST_TYPE_FOURCC, fourcc, NULL);
"format", G_TYPE_STRING, format, NULL);
} else {
caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
@ -1099,8 +1099,7 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
break;
case CODEC_ID_VC1:
caps = gst_ff_vid_caps_new (context, codec_id, "video/x-wmv",
"wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC,
GST_MAKE_FOURCC ('W', 'V', 'C', '1'), NULL);
"wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
break;
case CODEC_ID_QDM2:
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-qdm2", NULL);
@ -2375,33 +2374,25 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
case CODEC_ID_DVVIDEO:
{
guint32 fourcc;
const gchar *format;
if (gst_structure_get_fourcc (str, "format", &fourcc))
switch (fourcc) {
case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
context->pix_fmt = PIX_FMT_YUYV422;
break;
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
context->pix_fmt = PIX_FMT_YUV420P;
break;
case GST_MAKE_FOURCC ('A', '4', '2', '0'):
context->pix_fmt = PIX_FMT_YUVA420P;
break;
case GST_MAKE_FOURCC ('Y', '4', '1', 'B'):
context->pix_fmt = PIX_FMT_YUV411P;
break;
case GST_MAKE_FOURCC ('Y', '4', '2', 'B'):
context->pix_fmt = PIX_FMT_YUV422P;
break;
case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'):
context->pix_fmt = PIX_FMT_YUV410P;
break;
default:
GST_WARNING ("couldn't convert fourcc %" GST_FOURCC_FORMAT
" to a pixel format", GST_FOURCC_ARGS (fourcc));
break;
}
format = gst_structure_get_string (str, "format");
if (g_str_equal (format, "YUY2"))
context->pix_fmt = PIX_FMT_YUYV422;
else if (g_str_equal (format, "I420"))
context->pix_fmt = PIX_FMT_YUV420P;
else if (g_str_equal (format, "A420"))
context->pix_fmt = PIX_FMT_YUVA420P;
else if (g_str_equal (format, "Y41B"))
context->pix_fmt = PIX_FMT_YUV411P;
else if (g_str_equal (format, "Y42B"))
context->pix_fmt = PIX_FMT_YUV422P;
else if (g_str_equal (format, "YUV9"))
context->pix_fmt = PIX_FMT_YUV410P;
else {
GST_WARNING ("couldn't convert format %s" " to a pixel format", format);
}
break;
}
case CODEC_ID_H263P:
@ -2862,19 +2853,17 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
break;
case 3:
{
guint32 fourcc;
const gchar *format;
/* WMV3 unless the fourcc exists and says otherwise */
id = CODEC_ID_WMV3;
format = gst_structure_get_string (structure, "format");
if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
(fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
id = CODEC_ID_VC1;
}
if (g_str_equal (format, "WVC1") || g_str_equal (format, "WMVA")) {
id = CODEC_ID_VC1;
}
}
break;
}
}
}
if (id != CODEC_ID_NONE)

View file

@ -478,84 +478,71 @@ gst_ffmpegscale_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
static enum PixelFormat
gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps)
{
GstStructure *structure;
enum PixelFormat pix_fmt = PIX_FMT_NONE;
GstVideoInfo info;
enum PixelFormat pix_fmt;
GST_DEBUG ("converting caps %" GST_PTR_FORMAT, caps);
g_return_val_if_fail (gst_caps_get_size (caps) == 1, PIX_FMT_NONE);
structure = gst_caps_get_structure (caps, 0);
if (strcmp (gst_structure_get_name (structure), "video/x-raw-yuv") == 0) {
guint32 fourcc;
if (gst_video_info_from_caps (&info, caps))
goto invalid_caps;
if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
switch (fourcc) {
case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
pix_fmt = PIX_FMT_YUYV422;
break;
case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
pix_fmt = PIX_FMT_UYVY422;
break;
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
pix_fmt = PIX_FMT_YUV420P;
break;
case GST_MAKE_FOURCC ('Y', '4', '1', 'B'):
pix_fmt = PIX_FMT_YUV411P;
break;
case GST_MAKE_FOURCC ('Y', '4', '2', 'B'):
pix_fmt = PIX_FMT_YUV422P;
break;
case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'):
pix_fmt = PIX_FMT_YUV410P;
break;
}
}
} else if (strcmp (gst_structure_get_name (structure),
"video/x-raw-rgb") == 0) {
gint bpp = 0, rmask = 0, endianness = 0;
if (gst_structure_get_int (structure, "bpp", &bpp) &&
gst_structure_get_int (structure, "endianness", &endianness) &&
endianness == G_BIG_ENDIAN) {
if (gst_structure_get_int (structure, "red_mask", &rmask)) {
switch (bpp) {
case 32:
if (rmask == 0x00ff0000)
pix_fmt = PIX_FMT_ARGB;
else if (rmask == 0xff000000)
pix_fmt = PIX_FMT_RGBA;
else if (rmask == 0xff00)
pix_fmt = PIX_FMT_BGRA;
else if (rmask == 0xff)
pix_fmt = PIX_FMT_ABGR;
break;
case 24:
if (rmask == 0x0000FF)
pix_fmt = PIX_FMT_BGR24;
else
pix_fmt = PIX_FMT_RGB24;
break;
case 16:
if (endianness == G_BYTE_ORDER)
pix_fmt = PIX_FMT_RGB565;
break;
case 15:
if (endianness == G_BYTE_ORDER)
pix_fmt = PIX_FMT_RGB555;
break;
default:
/* nothing */
break;
}
} else {
if (bpp == 8) {
pix_fmt = PIX_FMT_PAL8;
}
}
}
switch (GST_VIDEO_INFO_FORMAT (&info)) {
case GST_VIDEO_FORMAT_YUY2:
pix_fmt = PIX_FMT_YUYV422;
break;
case GST_VIDEO_FORMAT_UYVY:
pix_fmt = PIX_FMT_UYVY422;
break;
case GST_VIDEO_FORMAT_I420:
pix_fmt = PIX_FMT_YUV420P;
break;
case GST_VIDEO_FORMAT_Y41B:
pix_fmt = PIX_FMT_YUV411P;
break;
case GST_VIDEO_FORMAT_Y42B:
pix_fmt = PIX_FMT_YUV422P;
break;
case GST_VIDEO_FORMAT_YUV9:
pix_fmt = PIX_FMT_YUV410P;
break;
case GST_VIDEO_FORMAT_ARGB:
pix_fmt = PIX_FMT_ARGB;
break;
case GST_VIDEO_FORMAT_RGBA:
pix_fmt = PIX_FMT_RGBA;
break;
case GST_VIDEO_FORMAT_BGRA:
pix_fmt = PIX_FMT_BGRA;
break;
case GST_VIDEO_FORMAT_ABGR:
pix_fmt = PIX_FMT_ABGR;
break;
case GST_VIDEO_FORMAT_BGR:
pix_fmt = PIX_FMT_BGR24;
break;
case GST_VIDEO_FORMAT_RGB:
pix_fmt = PIX_FMT_RGB24;
break;
case GST_VIDEO_FORMAT_RGB16:
pix_fmt = PIX_FMT_RGB565;
break;
case GST_VIDEO_FORMAT_RGB15:
pix_fmt = PIX_FMT_RGB555;
break;
case GST_VIDEO_FORMAT_RGB8_PALETTED:
pix_fmt = PIX_FMT_PAL8;
break;
default:
pix_fmt = PIX_FMT_NONE;
break;
}
return pix_fmt;
/* ERROR */
invalid_caps:
{
return PIX_FMT_NONE;
}
}
static gboolean