FS-10205: [freeswitch-core,mod_conference,mod_video_filter] Add 8 bit filter #resolve
This commit is contained in:
parent
95b3011614
commit
e26e873268
|
@ -50,7 +50,8 @@ typedef enum {
|
||||||
SCV_FILTER_GRAY_FG = (1 << 0),
|
SCV_FILTER_GRAY_FG = (1 << 0),
|
||||||
SCV_FILTER_GRAY_BG = (1 << 1),
|
SCV_FILTER_GRAY_BG = (1 << 1),
|
||||||
SCV_FILTER_SEPIA_FG = (1 << 2),
|
SCV_FILTER_SEPIA_FG = (1 << 2),
|
||||||
SCV_FILTER_SEPIA_BG = (1 << 3)
|
SCV_FILTER_SEPIA_BG = (1 << 3),
|
||||||
|
SCV_FILTER_8BIT_FG = (1 << 4)
|
||||||
} switch_core_video_filter_t;
|
} switch_core_video_filter_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -322,6 +323,7 @@ SWITCH_DECLARE(switch_image_t *) switch_img_copy_rect(switch_image_t *img, uint3
|
||||||
* \param[in] color RGB color
|
* \param[in] color RGB color
|
||||||
*/
|
*/
|
||||||
SWITCH_DECLARE(void) switch_img_fill(switch_image_t *img, int x, int y, int w, int h, switch_rgb_color_t *color);
|
SWITCH_DECLARE(void) switch_img_fill(switch_image_t *img, int x, int y, int w, int h, switch_rgb_color_t *color);
|
||||||
|
SWITCH_DECLARE(void) switch_img_8bit(switch_image_t *img);
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_img_gray(switch_image_t *img, int x, int y, int w, int h);
|
SWITCH_DECLARE(void) switch_img_gray(switch_image_t *img, int x, int y, int w, int h);
|
||||||
SWITCH_DECLARE(void) switch_img_sepia(switch_image_t *img, int x, int y, int w, int h);
|
SWITCH_DECLARE(void) switch_img_sepia(switch_image_t *img, int x, int y, int w, int h);
|
||||||
|
|
|
@ -2586,6 +2586,15 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
|
||||||
if (member->video_filters & SCV_FILTER_SEPIA_FG) {
|
if (member->video_filters & SCV_FILTER_SEPIA_FG) {
|
||||||
switch_img_sepia(img, 0, 0, img->d_w, img->d_h);
|
switch_img_sepia(img, 0, 0, img->d_w, img->d_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (member->video_filters & SCV_FILTER_8BIT_FG) {
|
||||||
|
switch_image_t *tmp = NULL;
|
||||||
|
int w = img->d_w, h = img->d_h;
|
||||||
|
|
||||||
|
switch_img_scale(img, &tmp, w/8 ,h/8);
|
||||||
|
switch_img_scale(tmp, &img, w,h);
|
||||||
|
switch_img_8bit(img);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*imgP = img;
|
*imgP = img;
|
||||||
|
|
|
@ -318,6 +318,16 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
|
||||||
|
|
||||||
patch_data = context->data;
|
patch_data = context->data;
|
||||||
|
|
||||||
|
if (context->video_filters & SCV_FILTER_8BIT_FG) {
|
||||||
|
switch_image_t *tmp = NULL;
|
||||||
|
int w = frame->img->d_w, h = frame->img->d_h;
|
||||||
|
|
||||||
|
switch_img_scale(frame->img, &tmp, w/8 ,h/8);
|
||||||
|
switch_img_scale(tmp, &frame->img, w,h);
|
||||||
|
switch_img_8bit(frame->img);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch_img_to_raw(frame->img, context->data, frame->img->d_w * 4, SWITCH_IMG_FMT_ARGB);
|
switch_img_to_raw(frame->img, context->data, frame->img->d_w * 4, SWITCH_IMG_FMT_ARGB);
|
||||||
img = switch_img_wrap(NULL, SWITCH_IMG_FMT_ARGB, frame->img->d_w, frame->img->d_h, 1, context->data);
|
img = switch_img_wrap(NULL, SWITCH_IMG_FMT_ARGB, frame->img->d_w, frame->img->d_h, 1, context->data);
|
||||||
|
|
||||||
|
@ -333,6 +343,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
|
||||||
switch_img_sepia(img, 0, 0, img->d_w, img->d_h);
|
switch_img_sepia(img, 0, 0, img->d_w, img->d_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (context->bgimg) {
|
if (context->bgimg) {
|
||||||
switch_image_t *tmp = NULL;
|
switch_image_t *tmp = NULL;
|
||||||
|
|
||||||
|
|
|
@ -1419,6 +1419,59 @@ SWITCH_DECLARE(void) switch_img_fill_noalpha(switch_image_t *img, int x, int y,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) switch_img_8bit(switch_image_t *img)
|
||||||
|
{
|
||||||
|
#ifdef SWITCH_HAVE_YUV
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (img->fmt == SWITCH_IMG_FMT_ARGB) {
|
||||||
|
int max_w = img->d_w;
|
||||||
|
int max_h = img->d_h;
|
||||||
|
int j;
|
||||||
|
switch_rgb_color_t *rgb;
|
||||||
|
uint32_t *bytes;
|
||||||
|
|
||||||
|
for (i = 0; i < max_h; i++) {
|
||||||
|
for (j = 0; j < max_w; j++) {
|
||||||
|
rgb = (switch_rgb_color_t *)(img->planes[SWITCH_PLANE_PACKED] + i * img->stride[SWITCH_PLANE_PACKED] + j * 4);
|
||||||
|
//if (rgb);
|
||||||
|
|
||||||
|
|
||||||
|
if (!rgb->a) continue;;
|
||||||
|
|
||||||
|
//rgb->r = rgb->r & 0xE0, rgb->g = rgb->g & 0xE0, rgb->b = rgb->b & 0xC0;
|
||||||
|
bytes = (uint32_t *) rgb;
|
||||||
|
|
||||||
|
#if SWITCH_BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
*bytes = *bytes & 0xE0E0C0FF;
|
||||||
|
#else
|
||||||
|
*bytes = *bytes & 0xFFC0E0E0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (img->fmt == SWITCH_IMG_FMT_I420) {
|
||||||
|
switch_image_t *tmp_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_ARGB, img->d_w, img->d_h, 1);
|
||||||
|
|
||||||
|
I420ToARGB(img->planes[SWITCH_PLANE_Y], img->stride[SWITCH_PLANE_Y],
|
||||||
|
img->planes[SWITCH_PLANE_U], img->stride[SWITCH_PLANE_U],
|
||||||
|
img->planes[SWITCH_PLANE_V], img->stride[SWITCH_PLANE_V],
|
||||||
|
tmp_img->planes[SWITCH_PLANE_PACKED], tmp_img->stride[SWITCH_PLANE_PACKED],
|
||||||
|
img->d_w, img->d_h);
|
||||||
|
|
||||||
|
switch_img_8bit(tmp_img);
|
||||||
|
|
||||||
|
ARGBToI420(tmp_img->planes[SWITCH_PLANE_PACKED], tmp_img->stride[SWITCH_PLANE_PACKED],
|
||||||
|
img->planes[SWITCH_PLANE_Y], img->stride[SWITCH_PLANE_Y],
|
||||||
|
img->planes[SWITCH_PLANE_U], img->stride[SWITCH_PLANE_U],
|
||||||
|
img->planes[SWITCH_PLANE_V], img->stride[SWITCH_PLANE_V],
|
||||||
|
tmp_img->d_w, tmp_img->d_h);
|
||||||
|
|
||||||
|
switch_img_free(&tmp_img);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_img_sepia(switch_image_t *img, int x, int y, int w, int h)
|
SWITCH_DECLARE(void) switch_img_sepia(switch_image_t *img, int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
#ifdef SWITCH_HAVE_YUV
|
#ifdef SWITCH_HAVE_YUV
|
||||||
|
@ -3331,6 +3384,10 @@ SWITCH_DECLARE(void) switch_core_video_parse_filter_string(switch_core_video_fil
|
||||||
if (switch_stristr("bg-sepia", filter_str)) {
|
if (switch_stristr("bg-sepia", filter_str)) {
|
||||||
*filters |= SCV_FILTER_SEPIA_BG;
|
*filters |= SCV_FILTER_SEPIA_BG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (switch_stristr("fg-8bit", filter_str)) {
|
||||||
|
*filters |= SCV_FILTER_8BIT_FG;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue