FS-8867: create conversion function stubs in the core so modules do not need to use libyuv directly
This commit is contained in:
parent
cd2c86b427
commit
ed78d38994
|
@ -339,7 +339,30 @@ SWITCH_DECLARE(switch_status_t) switch_img_fit(switch_image_t **srcP, int width,
|
|||
SWITCH_DECLARE(switch_img_position_t) parse_img_position(const char *name);
|
||||
SWITCH_DECLARE(switch_img_fit_t) parse_img_fit(const char *name);
|
||||
SWITCH_DECLARE(void) switch_img_find_position(switch_img_position_t pos, int sw, int sh, int iw, int ih, int *xP, int *yP);
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_convert(switch_image_t *src, switch_convert_fmt_t fmt, void *dest, switch_size_t *size);
|
||||
|
||||
/*!\brief convert img to raw format
|
||||
*
|
||||
* dest should be pre-allocated and big enough for the target fmt
|
||||
*
|
||||
* \param[in] src The image descriptor
|
||||
* \param[in] dest The target memory address
|
||||
* \param[in] size The size of target memory address used for bounds check
|
||||
* \param[in] fmt The target format
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_to_raw(switch_image_t *src, void *dest, switch_size_t size, switch_img_fmt_t fmt);
|
||||
/*!\brief convert raw memory to switch_img_t
|
||||
*
|
||||
* if dest is NULL then a new img is created, user should destroy it later,
|
||||
* otherwize it will re-used the dest img, and the dest img size must match the src width and height,
|
||||
* width and height can be 0 in the latter case and it will figure out according to the dest img
|
||||
*
|
||||
* \param[in] dest The image descriptor
|
||||
* \param[in] src The raw data memory address
|
||||
* \param[in] fmt The raw data format
|
||||
* \param[in] width The raw data width
|
||||
* \param[in] height The raw data height
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_from_raw(switch_image_t *dest, void *src, switch_img_fmt_t fmt, int width, int height);
|
||||
SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_bool_t full, const char *text);
|
||||
|
||||
SWITCH_DECLARE(switch_image_t *) switch_img_read_file(const char* file_name);
|
||||
|
|
|
@ -59,9 +59,33 @@ SWITCH_BEGIN_EXTERN_C
|
|||
#define VPX_IMG_FMT_HIGH 0x800 /**< Image uses 16bit framebuffer */
|
||||
#endif
|
||||
|
||||
#define SWITCH_IMG_FMT_HIGH VPX_IMG_FMT_HIGH
|
||||
#define SWITCH_IMG_FMT_I420 VPX_IMG_FMT_I420
|
||||
#define SWITCH_IMG_FMT_ARGB VPX_IMG_FMT_ARGB
|
||||
#define SWITCH_IMG_FMT_NONE VPX_IMG_FMT_NONE
|
||||
#define SWITCH_IMG_FMT_RGB24 VPX_IMG_FMT_RGB24
|
||||
#define SWITCH_IMG_FMT_RGB32 VPX_IMG_FMT_RGB32
|
||||
#define SWITCH_IMG_FMT_RGB565 VPX_IMG_FMT_RGB565
|
||||
#define SWITCH_IMG_FMT_RGB555 VPX_IMG_FMT_RGB555
|
||||
#define SWITCH_IMG_FMT_UYVY VPX_IMG_FMT_UYVY
|
||||
#define SWITCH_IMG_FMT_YUY2 VPX_IMG_FMT_YUY2
|
||||
#define SWITCH_IMG_FMT_YVYU VPX_IMG_FMT_YVYU
|
||||
#define SWITCH_IMG_FMT_BGR24 VPX_IMG_FMT_BGR24
|
||||
#define SWITCH_IMG_FMT_RGB32_LE VPX_IMG_FMT_RGB32_LE
|
||||
#define SWITCH_IMG_FMT_ARGB VPX_IMG_FMT_ARGB
|
||||
#define SWITCH_IMG_FMT_ARGB_LE VPX_IMG_FMT_ARGB_LE
|
||||
#define SWITCH_IMG_FMT_RGB565_LE VPX_IMG_FMT_RGB565_LE
|
||||
#define SWITCH_IMG_FMT_RGB555_LE VPX_IMG_FMT_RGB555_LE
|
||||
#define SWITCH_IMG_FMT_YV12 VPX_IMG_FMT_YV12
|
||||
#define SWITCH_IMG_FMT_I420 VPX_IMG_FMT_I420
|
||||
#define SWITCH_IMG_FMT_VPXYV12 VPX_IMG_FMT_VPXYV12
|
||||
#define SWITCH_IMG_FMT_VPXI420 VPX_IMG_FMT_VPXI420
|
||||
#define SWITCH_IMG_FMT_I422 VPX_IMG_FMT_I422
|
||||
#define SWITCH_IMG_FMT_I444 VPX_IMG_FMT_I444
|
||||
#define SWITCH_IMG_FMT_I440 VPX_IMG_FMT_I440
|
||||
#define SWITCH_IMG_FMT_444A VPX_IMG_FMT_444A
|
||||
#define SWITCH_IMG_FMT_I42016 VPX_IMG_FMT_I42016
|
||||
#define SWITCH_IMG_FMT_I42216 VPX_IMG_FMT_I42216
|
||||
#define SWITCH_IMG_FMT_I44416 VPX_IMG_FMT_I44416
|
||||
#define SWITCH_IMG_FMT_I44016 VPX_IMG_FMT_I44016
|
||||
/* experimental */
|
||||
#define SWITCH_IMG_FMT_GD VPX_IMG_FMT_NONE
|
||||
|
||||
typedef vpx_img_fmt_t switch_img_fmt_t;
|
||||
|
|
|
@ -39,7 +39,6 @@ using namespace std;
|
|||
using namespace cv;
|
||||
|
||||
#include <switch.h>
|
||||
#include <libyuv.h>
|
||||
|
||||
#include <cv.h>
|
||||
#include "cvaux.h"
|
||||
|
@ -724,12 +723,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
|
|||
switch_assert(context->rawImage->width * 3 == context->rawImage->widthStep);
|
||||
}
|
||||
|
||||
libyuv::I420ToRGB24(frame->img->planes[0], frame->img->stride[0],
|
||||
frame->img->planes[1], frame->img->stride[1],
|
||||
frame->img->planes[2], frame->img->stride[2],
|
||||
(uint8_t *)context->rawImage->imageData, context->rawImage->widthStep,
|
||||
context->rawImage->width, context->rawImage->height);
|
||||
|
||||
switch_img_to_raw(frame->img, context->rawImage->imageData, context->rawImage->widthStep * context->h, SWITCH_IMG_FMT_RGB24);
|
||||
detectAndDraw(context);
|
||||
|
||||
if (context->detected.simo_count > 20) {
|
||||
|
@ -824,11 +818,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
|
|||
}
|
||||
|
||||
if (context->rawImage && (context->debug || !context->overlay_count)) {
|
||||
libyuv::RGB24ToI420((uint8_t *)context->rawImage->imageData, context->w * 3,
|
||||
frame->img->planes[0], frame->img->stride[0],
|
||||
frame->img->planes[1], frame->img->stride[1],
|
||||
frame->img->planes[2], frame->img->stride[2],
|
||||
context->rawImage->width, context->rawImage->height);
|
||||
switch_img_from_raw(frame->img, (uint8_t *)context->rawImage->imageData, SWITCH_IMG_FMT_RGB24, context->rawImage->width, context->rawImage->height);
|
||||
}
|
||||
|
||||
int abs = 0;
|
||||
|
|
|
@ -34,8 +34,6 @@
|
|||
|
||||
|
||||
#include <switch.h>
|
||||
#include <libyuv.h>
|
||||
|
||||
|
||||
#if defined(__clang__)
|
||||
/* the imagemagick header files are very badly broken on clang. They really should be fixing this, in the mean time, this dirty hack works */
|
||||
|
@ -263,12 +261,7 @@ static switch_status_t read_page(pdf_file_context_t *context)
|
|||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
RAWToI420(storage, w * 3,
|
||||
context->img->planes[0], context->img->stride[0],
|
||||
context->img->planes[1], context->img->stride[1],
|
||||
context->img->planes[2], context->img->stride[2],
|
||||
context->img->d_w, context->img->d_h);
|
||||
|
||||
switch_img_from_raw(context->img, storage, SWITCH_IMG_FMT_BGR24, w, h);
|
||||
free(storage);
|
||||
} else {
|
||||
switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_ARGB, image->columns, image->rows, 0);
|
||||
|
|
|
@ -1642,8 +1642,7 @@ int vlc_write_video_imem_get_callback(void *data, const char *cookie, int64_t *
|
|||
}
|
||||
|
||||
*output = context->video_frame_buffer;
|
||||
*size = 0;
|
||||
switch_img_convert(img, SWITCH_CONVERT_FMT_YUYV, *output, size);
|
||||
switch_img_to_raw(img, *output, *size, SWITCH_IMG_FMT_YUY2);
|
||||
switch_img_free(&img);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1936,29 +1936,121 @@ SWITCH_DECLARE(switch_status_t) switch_img_fit(switch_image_t **srcP, int width,
|
|||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_convert(switch_image_t *src, switch_convert_fmt_t fmt, void *dest, switch_size_t *size)
|
||||
static inline uint32_t switch_img_fmt2fourcc(switch_img_fmt_t fmt)
|
||||
{
|
||||
#ifdef SWITCH_HAVE_YUV
|
||||
switch_assert(src->fmt == SWITCH_IMG_FMT_I420);
|
||||
uint32_t fourcc;
|
||||
|
||||
switch (fmt) {
|
||||
case SWITCH_CONVERT_FMT_YUYV:
|
||||
{
|
||||
switch_size_t size_in = *size;
|
||||
ConvertFromI420(src->planes[0], src->stride[0],
|
||||
src->planes[1], src->stride[1],
|
||||
src->planes[2], src->stride[2],
|
||||
dest, size_in,
|
||||
src->d_w, src->d_h,
|
||||
FOURCC_YUY2);
|
||||
*size = src->d_w * src->d_h * 2;
|
||||
switch(fmt) {
|
||||
case SWITCH_IMG_FMT_NONE: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_RGB24: fourcc = FOURCC_24BG; break;
|
||||
case SWITCH_IMG_FMT_RGB32: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_RGB565: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_RGB555: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_UYVY: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_YUY2: fourcc = FOURCC_YUY2; break;
|
||||
case SWITCH_IMG_FMT_YVYU: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_BGR24: fourcc = FOURCC_RAW ; break;
|
||||
case SWITCH_IMG_FMT_RGB32_LE: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_ARGB: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_ARGB_LE: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_RGB565_LE: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_RGB555_LE: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_YV12: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I420: fourcc = FOURCC_I420; break;
|
||||
case SWITCH_IMG_FMT_VPXYV12: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_VPXI420: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I422: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I444: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I440: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_444A: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I42016: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I42216: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I44416: fourcc = FOURCC_ANY ; break;
|
||||
case SWITCH_IMG_FMT_I44016: fourcc = FOURCC_ANY ; break;
|
||||
default: fourcc = FOURCC_ANY;
|
||||
}
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
return fourcc;
|
||||
#else
|
||||
return 0xFFFFFFFF;
|
||||
#endif
|
||||
}
|
||||
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_to_raw(switch_image_t *src, void *dest, switch_size_t size, switch_img_fmt_t fmt)
|
||||
{
|
||||
#ifdef SWITCH_HAVE_YUV
|
||||
uint32_t fourcc;
|
||||
int ret;
|
||||
|
||||
switch_assert(src->fmt == SWITCH_IMG_FMT_I420); // todo: support other formats
|
||||
switch_assert(dest);
|
||||
|
||||
fourcc = switch_img_fmt2fourcc(fmt);
|
||||
|
||||
if (fourcc == FOURCC_ANY) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unsupported format: %d\n", fmt);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
ret = ConvertFromI420(src->planes[0], src->stride[0],
|
||||
src->planes[1], src->stride[1],
|
||||
src->planes[2], src->stride[2],
|
||||
dest, size,
|
||||
src->d_w, src->d_h,
|
||||
fourcc);
|
||||
|
||||
return ret == 0 ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
|
||||
#else
|
||||
return SWITCH_STATUS_FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
SWITCH_DECLARE(switch_status_t) switch_img_from_raw(switch_image_t *dest, void *src, switch_img_fmt_t fmt, int width, int height)
|
||||
{
|
||||
#ifdef SWITCH_HAVE_YUV
|
||||
uint32_t fourcc;
|
||||
int ret;
|
||||
|
||||
fourcc = switch_img_fmt2fourcc(fmt);
|
||||
|
||||
if (fourcc == FOURCC_ANY) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unsupported format: %d\n", fmt);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if (!dest && width > 0 && height > 0) dest = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, height, 1);
|
||||
if (!dest) return SWITCH_STATUS_FALSE;
|
||||
|
||||
if (width == 0 || height == 0) {
|
||||
width = dest->d_w;
|
||||
height = dest->d_h;
|
||||
}
|
||||
|
||||
/*
|
||||
int ConvertToI420(const uint8* src_frame, size_t src_size,
|
||||
uint8* dst_y, int dst_stride_y,
|
||||
uint8* dst_u, int dst_stride_u,
|
||||
uint8* dst_v, int dst_stride_v,
|
||||
int crop_x, int crop_y,
|
||||
int src_width, int src_height,
|
||||
int crop_width, int crop_height,
|
||||
enum RotationMode rotation,
|
||||
uint32 format);
|
||||
|
||||
src_size is only used when FOURCC_MJPG which we don't support so always 0
|
||||
*/
|
||||
|
||||
ret = ConvertToI420(src, 0,
|
||||
dest->planes[0], dest->stride[0],
|
||||
dest->planes[1], dest->stride[1],
|
||||
dest->planes[2], dest->stride[2],
|
||||
0, 0,
|
||||
width, height,
|
||||
width, height,
|
||||
0, fourcc);
|
||||
|
||||
return ret == 0 ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
|
||||
#else
|
||||
return SWITCH_STATUS_FALSE;
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue