mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-25 15:36:42 +00:00
gst/ffmpegcolorspace/: Added AYUV colorspace and handle RGBA a bit more respectful.
Original commit message from CVS: * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_caps_remove_format_info): * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), (shrink12), (img_get_alpha_info), (deinterlace_line), (deinterlace_line_inplace): * gst/ffmpegcolorspace/imgconvert_template.h: Added AYUV colorspace and handle RGBA a bit more respectful.
This commit is contained in:
parent
6169fd7d0d
commit
d16e066b92
6 changed files with 266 additions and 9 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2004-11-08 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/ffmpegcolorspace/avcodec.h:
|
||||||
|
* gst/ffmpegcolorspace/gstffmpegcodecmap.c:
|
||||||
|
(gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt),
|
||||||
|
(gst_ffmpegcsp_avpicture_fill):
|
||||||
|
* gst/ffmpegcolorspace/gstffmpegcolorspace.c:
|
||||||
|
(gst_ffmpegcsp_caps_remove_format_info):
|
||||||
|
* gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size),
|
||||||
|
(shrink12), (img_get_alpha_info), (deinterlace_line),
|
||||||
|
(deinterlace_line_inplace):
|
||||||
|
* gst/ffmpegcolorspace/imgconvert_template.h:
|
||||||
|
Added AYUV colorspace and handle RGBA a bit more respectful.
|
||||||
|
|
||||||
2004-11-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
|
2004-11-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
|
||||||
|
|
||||||
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_push):
|
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_push):
|
||||||
|
|
|
@ -59,6 +59,7 @@ enum PixelFormat {
|
||||||
PIX_FMT_YUV422P, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples)
|
PIX_FMT_YUV422P, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples)
|
||||||
PIX_FMT_YUV444P, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples)
|
PIX_FMT_YUV444P, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples)
|
||||||
PIX_FMT_RGBA32, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness
|
PIX_FMT_RGBA32, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness
|
||||||
|
PIX_FMT_RGB32, ///< Packed pixel, 4 bytes per pixel, BGRXBGRX..., stored in cpu endianness
|
||||||
PIX_FMT_YUV410P, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples)
|
PIX_FMT_YUV410P, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples)
|
||||||
PIX_FMT_YUV411P, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples)
|
PIX_FMT_YUV411P, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples)
|
||||||
PIX_FMT_RGB565, ///< always stored in cpu endianness
|
PIX_FMT_RGB565, ///< always stored in cpu endianness
|
||||||
|
@ -74,6 +75,8 @@ enum PixelFormat {
|
||||||
PIX_FMT_XVMC_MPEG2_IDCT,
|
PIX_FMT_XVMC_MPEG2_IDCT,
|
||||||
PIX_FMT_UYVY422, ///< Packed pixel, Cb Y0 Cr Y1
|
PIX_FMT_UYVY422, ///< Packed pixel, Cb Y0 Cr Y1
|
||||||
PIX_FMT_UYVY411, ///< Packed pixel, Cb Y0 Y1 Cr Y2 Y3
|
PIX_FMT_UYVY411, ///< Packed pixel, Cb Y0 Y1 Cr Y2 Y3
|
||||||
|
|
||||||
|
PIX_FMT_AYUV4444, ///< Packed pixel, A0 Y0 Cb Cr
|
||||||
PIX_FMT_NB,
|
PIX_FMT_NB,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context)
|
||||||
GstCaps *caps = NULL;
|
GstCaps *caps = NULL;
|
||||||
|
|
||||||
int bpp = 0, depth = 0, endianness = 0;
|
int bpp = 0, depth = 0, endianness = 0;
|
||||||
gulong g_mask = 0, r_mask = 0, b_mask = 0;
|
gulong g_mask = 0, r_mask = 0, b_mask = 0, a_mask = 0;
|
||||||
guint32 fmt = 0;
|
guint32 fmt = 0;
|
||||||
|
|
||||||
switch (pix_fmt) {
|
switch (pix_fmt) {
|
||||||
|
@ -145,7 +145,7 @@ gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context)
|
||||||
case PIX_FMT_YUV444P:
|
case PIX_FMT_YUV444P:
|
||||||
/* .. */
|
/* .. */
|
||||||
break;
|
break;
|
||||||
case PIX_FMT_RGBA32:
|
case PIX_FMT_RGB32:
|
||||||
bpp = 32;
|
bpp = 32;
|
||||||
depth = 24;
|
depth = 24;
|
||||||
endianness = G_BIG_ENDIAN;
|
endianness = G_BIG_ENDIAN;
|
||||||
|
@ -157,6 +157,22 @@ gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context)
|
||||||
r_mask = 0x0000ff00;
|
r_mask = 0x0000ff00;
|
||||||
g_mask = 0x00ff0000;
|
g_mask = 0x00ff0000;
|
||||||
b_mask = 0xff000000;
|
b_mask = 0xff000000;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case PIX_FMT_RGBA32:
|
||||||
|
bpp = 32;
|
||||||
|
depth = 32;
|
||||||
|
endianness = G_BIG_ENDIAN;
|
||||||
|
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
r_mask = 0x000000ff;
|
||||||
|
g_mask = 0x0000ff00;
|
||||||
|
b_mask = 0x00ff0000;
|
||||||
|
a_mask = 0xff000000;
|
||||||
|
#else
|
||||||
|
r_mask = 0xff000000;
|
||||||
|
g_mask = 0x00ff0000;
|
||||||
|
b_mask = 0x0000ff00;
|
||||||
|
a_mask = 0x000000ff;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case PIX_FMT_YUV410P:
|
case PIX_FMT_YUV410P:
|
||||||
|
@ -184,13 +200,25 @@ gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context)
|
||||||
bpp = depth = 8;
|
bpp = depth = 8;
|
||||||
endianness = G_BYTE_ORDER;
|
endianness = G_BYTE_ORDER;
|
||||||
break;
|
break;
|
||||||
|
case PIX_FMT_AYUV4444:
|
||||||
|
fmt = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V');
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* give up ... */
|
/* give up ... */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bpp != 0) {
|
if (bpp != 0) {
|
||||||
if (r_mask != 0) {
|
if (a_mask != 0) {
|
||||||
|
caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb",
|
||||||
|
"bpp", G_TYPE_INT, bpp,
|
||||||
|
"depth", G_TYPE_INT, depth,
|
||||||
|
"red_mask", G_TYPE_INT, r_mask,
|
||||||
|
"green_mask", G_TYPE_INT, g_mask,
|
||||||
|
"blue_mask", G_TYPE_INT, b_mask,
|
||||||
|
"alpha_mask", G_TYPE_INT, a_mask,
|
||||||
|
"endianness", G_TYPE_INT, endianness, NULL);
|
||||||
|
} else if (r_mask != 0) {
|
||||||
caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb",
|
caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb",
|
||||||
"bpp", G_TYPE_INT, bpp,
|
"bpp", G_TYPE_INT, bpp,
|
||||||
"depth", G_TYPE_INT, depth,
|
"depth", G_TYPE_INT, depth,
|
||||||
|
@ -410,6 +438,9 @@ gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
|
||||||
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;
|
||||||
|
case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
|
||||||
|
context->pix_fmt = PIX_FMT_AYUV4444;
|
||||||
|
break;
|
||||||
#if 0
|
#if 0
|
||||||
case FIXME:
|
case FIXME:
|
||||||
context->pix_fmt = PIX_FMT_YUV444P;
|
context->pix_fmt = PIX_FMT_YUV444P;
|
||||||
|
@ -419,19 +450,23 @@ gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
|
||||||
}
|
}
|
||||||
} else if (strcmp (gst_structure_get_name (structure),
|
} else if (strcmp (gst_structure_get_name (structure),
|
||||||
"video/x-raw-rgb") == 0) {
|
"video/x-raw-rgb") == 0) {
|
||||||
gint bpp = 0, rmask = 0, endianness = 0;
|
gint bpp = 0, rmask = 0, endianness = 0, amask = 0;
|
||||||
|
|
||||||
if (gst_structure_get_int (structure, "bpp", &bpp) &&
|
if (gst_structure_get_int (structure, "bpp", &bpp) &&
|
||||||
gst_structure_get_int (structure, "endianness", &endianness)) {
|
gst_structure_get_int (structure, "endianness", &endianness)) {
|
||||||
if (gst_structure_get_int (structure, "red_mask", &rmask)) {
|
if (gst_structure_get_int (structure, "red_mask", &rmask)) {
|
||||||
switch (bpp) {
|
switch (bpp) {
|
||||||
case 32:
|
case 32:
|
||||||
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
if (gst_structure_get_int (structure, "alpha_mask", &amask)) {
|
||||||
if (rmask == 0x00ff0000)
|
|
||||||
#else
|
|
||||||
if (rmask == 0x0000ff00)
|
|
||||||
#endif
|
|
||||||
context->pix_fmt = PIX_FMT_RGBA32;
|
context->pix_fmt = PIX_FMT_RGBA32;
|
||||||
|
} else {
|
||||||
|
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
if (rmask == 0x00ff0000)
|
||||||
|
#else
|
||||||
|
if (rmask == 0x0000ff00)
|
||||||
|
#endif
|
||||||
|
context->pix_fmt = PIX_FMT_RGB32;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
if (rmask == 0x0000FF)
|
if (rmask == 0x0000FF)
|
||||||
|
@ -569,6 +604,15 @@ static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
|
||||||
.depth = 8,
|
.depth = 8,
|
||||||
.x_chroma_shift = 2,.y_chroma_shift = 0,
|
.x_chroma_shift = 2,.y_chroma_shift = 0,
|
||||||
},
|
},
|
||||||
|
[PIX_FMT_YUV422] = {
|
||||||
|
.name = "ayuv4444",
|
||||||
|
.nb_channels = 1,
|
||||||
|
.is_alpha = 1,
|
||||||
|
.color_type = FF_COLOR_YUV,
|
||||||
|
.pixel_type = FF_PIXEL_PACKED,
|
||||||
|
.depth = 8,
|
||||||
|
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
||||||
|
},
|
||||||
|
|
||||||
/* JPEG YUV */
|
/* JPEG YUV */
|
||||||
[PIX_FMT_YUVJ420P] = {
|
[PIX_FMT_YUVJ420P] = {
|
||||||
|
@ -613,6 +657,14 @@ static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
|
||||||
.depth = 8,
|
.depth = 8,
|
||||||
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
||||||
},
|
},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.name = "rgb32",
|
||||||
|
.nb_channels = 4,
|
||||||
|
.color_type = FF_COLOR_RGB,
|
||||||
|
.pixel_type = FF_PIXEL_PACKED,
|
||||||
|
.depth = 8,
|
||||||
|
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
||||||
|
},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.name = "rgba32",
|
.name = "rgba32",
|
||||||
.nb_channels = 4,.is_alpha = 1,
|
.nb_channels = 4,.is_alpha = 1,
|
||||||
|
@ -720,6 +772,8 @@ gst_ffmpegcsp_avpicture_fill (AVPicture * picture,
|
||||||
picture->data[2] = NULL;
|
picture->data[2] = NULL;
|
||||||
picture->linesize[0] = stride;
|
picture->linesize[0] = stride;
|
||||||
return size;
|
return size;
|
||||||
|
case PIX_FMT_AYUV4444:
|
||||||
|
case PIX_FMT_RGB32:
|
||||||
case PIX_FMT_RGBA32:
|
case PIX_FMT_RGBA32:
|
||||||
stride = width * 4;
|
stride = width * 4;
|
||||||
size = stride * height;
|
size = stride * height;
|
||||||
|
|
|
@ -126,6 +126,7 @@ gst_ffmpegcsp_caps_remove_format_info (GstCaps * caps)
|
||||||
gst_structure_remove_field (structure, "red_mask");
|
gst_structure_remove_field (structure, "red_mask");
|
||||||
gst_structure_remove_field (structure, "green_mask");
|
gst_structure_remove_field (structure, "green_mask");
|
||||||
gst_structure_remove_field (structure, "blue_mask");
|
gst_structure_remove_field (structure, "blue_mask");
|
||||||
|
gst_structure_remove_field (structure, "alpha_mask");
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_caps_do_simplify (caps);
|
gst_caps_do_simplify (caps);
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct PixFmtInfo
|
||||||
} PixFmtInfo;
|
} PixFmtInfo;
|
||||||
|
|
||||||
/* this table gives more information about formats */
|
/* this table gives more information about formats */
|
||||||
|
/* FIXME, this table is also in ffmpegcodecmap */
|
||||||
static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
|
static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
|
||||||
/* YUV formats */
|
/* YUV formats */
|
||||||
[PIX_FMT_YUV420P] = {
|
[PIX_FMT_YUV420P] = {
|
||||||
|
@ -162,6 +163,14 @@ static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
|
||||||
.depth = 8,
|
.depth = 8,
|
||||||
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
||||||
},
|
},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.name = "rgb32",
|
||||||
|
.nb_channels = 4,
|
||||||
|
.color_type = FF_COLOR_RGB,
|
||||||
|
.pixel_type = FF_PIXEL_PACKED,
|
||||||
|
.depth = 8,
|
||||||
|
.x_chroma_shift = 0,.y_chroma_shift = 0,
|
||||||
|
},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.name = "rgba32",
|
.name = "rgba32",
|
||||||
.nb_channels = 4,.is_alpha = 1,
|
.nb_channels = 4,.is_alpha = 1,
|
||||||
|
@ -1457,6 +1466,37 @@ bitcopy_n (unsigned int a, int n)
|
||||||
|
|
||||||
#include "imgconvert_template.h"
|
#include "imgconvert_template.h"
|
||||||
|
|
||||||
|
/* rgb32 handling */
|
||||||
|
|
||||||
|
#define RGB_NAME rgb32
|
||||||
|
#define FMT_RGBA32
|
||||||
|
|
||||||
|
#define RGB_IN(r, g, b, s)\
|
||||||
|
{\
|
||||||
|
unsigned int v = ((const uint32_t *)(s))[0];\
|
||||||
|
r = (v >> 16) & 0xff;\
|
||||||
|
g = (v >> 8) & 0xff;\
|
||||||
|
b = v & 0xff;\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RGBA_IN(r, g, b, a, s)\
|
||||||
|
{\
|
||||||
|
unsigned int v = ((const uint32_t *)(s))[0];\
|
||||||
|
a = 0xff;\
|
||||||
|
r = (v >> 16) & 0xff;\
|
||||||
|
g = (v >> 8) & 0xff;\
|
||||||
|
b = v & 0xff;\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RGBA_OUT(d, r, g, b, a)\
|
||||||
|
{\
|
||||||
|
((uint32_t *)(d))[0] = (a << 24) | (r << 16) | (g << 8) | b;\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BPP 4
|
||||||
|
|
||||||
|
#include "imgconvert_template.h"
|
||||||
|
|
||||||
/* rgba32 handling */
|
/* rgba32 handling */
|
||||||
|
|
||||||
#define RGB_NAME rgba32
|
#define RGB_NAME rgba32
|
||||||
|
@ -1639,6 +1679,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = yuv420p_to_bgr24},
|
.convert = yuv420p_to_bgr24},
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
.convert = yuv420p_to_rgb24},
|
.convert = yuv420p_to_rgb24},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = yuv420p_to_rgb32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = yuv420p_to_rgba32},
|
.convert = yuv420p_to_rgba32},
|
||||||
},
|
},
|
||||||
|
@ -1663,6 +1705,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = yuvj420p_to_bgr24},
|
.convert = yuvj420p_to_bgr24},
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
.convert = yuvj420p_to_rgb24},
|
.convert = yuvj420p_to_rgb24},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = yuvj420p_to_rgb32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = yuvj420p_to_rgba32},
|
.convert = yuvj420p_to_rgba32},
|
||||||
},
|
},
|
||||||
|
@ -1693,6 +1737,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = rgb24_to_rgb565},
|
.convert = rgb24_to_rgb565},
|
||||||
[PIX_FMT_RGB555] = {
|
[PIX_FMT_RGB555] = {
|
||||||
.convert = rgb24_to_rgb555},
|
.convert = rgb24_to_rgb555},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = rgb24_to_rgb32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = rgb24_to_rgba32},
|
.convert = rgb24_to_rgba32},
|
||||||
[PIX_FMT_BGR24] = {
|
[PIX_FMT_BGR24] = {
|
||||||
|
@ -1707,6 +1753,20 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = rgb24_to_yuvj420p},
|
.convert = rgb24_to_yuvj420p},
|
||||||
[PIX_FMT_YUVJ444P] = {
|
[PIX_FMT_YUVJ444P] = {
|
||||||
.convert = rgb24_to_yuvj444p},
|
.convert = rgb24_to_yuvj444p},
|
||||||
|
[PIX_FMT_AYUV4444] = {
|
||||||
|
.convert = rgb24_to_ayuv4444},
|
||||||
|
},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
[PIX_FMT_RGB24] = {
|
||||||
|
.convert = rgb32_to_rgb24},
|
||||||
|
[PIX_FMT_RGB555] = {
|
||||||
|
.convert = rgba32_to_rgb555},
|
||||||
|
[PIX_FMT_PAL8] = {
|
||||||
|
.convert = rgb32_to_pal8},
|
||||||
|
[PIX_FMT_YUV420P] = {
|
||||||
|
.convert = rgb32_to_yuv420p},
|
||||||
|
[PIX_FMT_GRAY8] = {
|
||||||
|
.convert = rgb32_to_gray},
|
||||||
},
|
},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
|
@ -1719,6 +1779,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = rgba32_to_yuv420p},
|
.convert = rgba32_to_yuv420p},
|
||||||
[PIX_FMT_GRAY8] = {
|
[PIX_FMT_GRAY8] = {
|
||||||
.convert = rgba32_to_gray},
|
.convert = rgba32_to_gray},
|
||||||
|
[PIX_FMT_AYUV4444] = {
|
||||||
|
.convert = rgba32_to_ayuv4444},
|
||||||
},
|
},
|
||||||
[PIX_FMT_BGR24] = {
|
[PIX_FMT_BGR24] = {
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
|
@ -1731,6 +1793,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
[PIX_FMT_RGB555] = {
|
[PIX_FMT_RGB555] = {
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
.convert = rgb555_to_rgb24},
|
.convert = rgb555_to_rgb24},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = rgb555_to_rgba32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = rgb555_to_rgba32},
|
.convert = rgb555_to_rgba32},
|
||||||
[PIX_FMT_YUV420P] = {
|
[PIX_FMT_YUV420P] = {
|
||||||
|
@ -1755,6 +1819,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = gray_to_rgb24},
|
.convert = gray_to_rgb24},
|
||||||
[PIX_FMT_BGR24] = {
|
[PIX_FMT_BGR24] = {
|
||||||
.convert = gray_to_bgr24},
|
.convert = gray_to_bgr24},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = gray_to_rgb32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = gray_to_rgba32},
|
.convert = gray_to_rgba32},
|
||||||
[PIX_FMT_MONOWHITE] = {
|
[PIX_FMT_MONOWHITE] = {
|
||||||
|
@ -1779,6 +1845,8 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = pal8_to_bgr24},
|
.convert = pal8_to_bgr24},
|
||||||
[PIX_FMT_RGB24] = {
|
[PIX_FMT_RGB24] = {
|
||||||
.convert = pal8_to_rgb24},
|
.convert = pal8_to_rgb24},
|
||||||
|
[PIX_FMT_RGB32] = {
|
||||||
|
.convert = pal8_to_rgb32},
|
||||||
[PIX_FMT_RGBA32] = {
|
[PIX_FMT_RGBA32] = {
|
||||||
.convert = pal8_to_rgba32},
|
.convert = pal8_to_rgba32},
|
||||||
},
|
},
|
||||||
|
@ -1787,6 +1855,14 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
|
||||||
.convert = uyvy411_to_yuv411p,
|
.convert = uyvy411_to_yuv411p,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
[PIX_FMT_AYUV4444] = {
|
||||||
|
[PIX_FMT_RGBA32] = {
|
||||||
|
.convert = ayuv4444_to_rgba32,
|
||||||
|
},
|
||||||
|
[PIX_FMT_RGB24] = {
|
||||||
|
.convert = ayuv4444_to_rgb24,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2093,6 +2169,9 @@ img_get_alpha_info (const AVPicture * src, int pix_fmt, int width, int height)
|
||||||
if (!pf->is_alpha)
|
if (!pf->is_alpha)
|
||||||
return 0;
|
return 0;
|
||||||
switch (pix_fmt) {
|
switch (pix_fmt) {
|
||||||
|
case PIX_FMT_RGB32:
|
||||||
|
ret = get_alpha_info_rgb32 (src, width, height);
|
||||||
|
break;
|
||||||
case PIX_FMT_RGBA32:
|
case PIX_FMT_RGBA32:
|
||||||
ret = get_alpha_info_rgba32 (src, width, height);
|
ret = get_alpha_info_rgba32 (src, width, height);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -468,6 +468,60 @@ static void glue(RGB_NAME, _to_rgba32)(AVPicture *dst, const AVPicture *src,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ayuv4444_to_rgba32(AVPicture *dst, const AVPicture *src,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
uint8_t *s, *d, *d1, *s1;
|
||||||
|
int w, y, cb, cr, r_add, g_add, b_add;
|
||||||
|
uint8_t *cm = cropTbl + MAX_NEG_CROP;
|
||||||
|
unsigned int r, g, b, a;
|
||||||
|
|
||||||
|
d = dst->data[0];
|
||||||
|
s = src->data[0];
|
||||||
|
for(;height > 0; height --) {
|
||||||
|
d1 = d;
|
||||||
|
s1 = s;
|
||||||
|
for(w = width; w > 0; w--) {
|
||||||
|
a = s1[0];
|
||||||
|
YUV_TO_RGB1_CCIR(s1[2], s1[3]);
|
||||||
|
|
||||||
|
YUV_TO_RGB2_CCIR(r, g, b, s1[1]);
|
||||||
|
RGBA_OUT(d1, r, g, b, a);
|
||||||
|
d1 += BPP;
|
||||||
|
s1 += 4;
|
||||||
|
}
|
||||||
|
d += dst->linesize[0];
|
||||||
|
s += src->linesize[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rgba32_to_ayuv4444(AVPicture *dst, const AVPicture *src,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
int src_wrap, dst_wrap, x, y;
|
||||||
|
int r, g, b, a;
|
||||||
|
uint8_t *d;
|
||||||
|
const uint8_t *p;
|
||||||
|
|
||||||
|
src_wrap = src->linesize[0] - width * BPP;
|
||||||
|
dst_wrap = dst->linesize[0] - width * 4;
|
||||||
|
d = dst->data[0];
|
||||||
|
p = src->data[0];
|
||||||
|
for(y=0;y<height;y++) {
|
||||||
|
for(x=0;x<width;x++) {
|
||||||
|
RGBA_IN(r, g, b, a, p);
|
||||||
|
d[0] = a;
|
||||||
|
d[1] = RGB_TO_Y_CCIR(r, g, b);
|
||||||
|
d[2] = RGB_TO_U_CCIR(r, g, b, 0);
|
||||||
|
d[3] = RGB_TO_V_CCIR(r, g, b, 0);
|
||||||
|
p += BPP;
|
||||||
|
d += 4;
|
||||||
|
}
|
||||||
|
p += src_wrap;
|
||||||
|
d += dst_wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined(FMT_RGBA32) && defined(RGBA_IN) */
|
#endif /* !defined(FMT_RGBA32) && defined(RGBA_IN) */
|
||||||
|
|
||||||
#ifndef FMT_RGB24
|
#ifndef FMT_RGB24
|
||||||
|
@ -769,6 +823,58 @@ static void rgb24_to_yuvj444p(AVPicture *dst, const AVPicture *src,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ayuv4444_to_rgb24(AVPicture *dst, const AVPicture *src,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
uint8_t *s, *d, *d1, *s1;
|
||||||
|
int w, y, cb, cr, r_add, g_add, b_add;
|
||||||
|
uint8_t *cm = cropTbl + MAX_NEG_CROP;
|
||||||
|
unsigned int r, g, b;
|
||||||
|
|
||||||
|
d = dst->data[0];
|
||||||
|
s = src->data[0];
|
||||||
|
for(;height > 0; height --) {
|
||||||
|
d1 = d;
|
||||||
|
s1 = s;
|
||||||
|
for(w = width; w > 0; w--) {
|
||||||
|
YUV_TO_RGB1_CCIR(s1[2], s1[3]);
|
||||||
|
|
||||||
|
YUV_TO_RGB2_CCIR(r, g, b, s1[1]);
|
||||||
|
RGB_OUT(d1, r, g, b);
|
||||||
|
d1 += BPP;
|
||||||
|
s1 += 4;
|
||||||
|
}
|
||||||
|
d += dst->linesize[0];
|
||||||
|
s += src->linesize[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rgb24_to_ayuv4444(AVPicture *dst, const AVPicture *src,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
int src_wrap, dst_wrap, x, y;
|
||||||
|
int r, g, b;
|
||||||
|
uint8_t *d;
|
||||||
|
const uint8_t *p;
|
||||||
|
|
||||||
|
src_wrap = src->linesize[0] - width * BPP;
|
||||||
|
dst_wrap = dst->linesize[0] - width * 4;
|
||||||
|
d = dst->data[0];
|
||||||
|
p = src->data[0];
|
||||||
|
for(y=0;y<height;y++) {
|
||||||
|
for(x=0;x<width;x++) {
|
||||||
|
RGB_IN(r, g, b, p);
|
||||||
|
d[0] = 0xff;
|
||||||
|
d[1] = RGB_TO_Y_CCIR(r, g, b);
|
||||||
|
d[2] = RGB_TO_U_CCIR(r, g, b, 0);
|
||||||
|
d[3] = RGB_TO_V_CCIR(r, g, b, 0);
|
||||||
|
p += BPP;
|
||||||
|
d += 4;
|
||||||
|
}
|
||||||
|
p += src_wrap;
|
||||||
|
d += dst_wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif /* FMT_RGB24 */
|
#endif /* FMT_RGB24 */
|
||||||
|
|
||||||
#if defined(FMT_RGB24) || defined(FMT_RGBA32)
|
#if defined(FMT_RGB24) || defined(FMT_RGBA32)
|
||||||
|
|
Loading…
Reference in a new issue