FS-8867: create conversion function stubs in the core so modules do not need to use libyuv directly

This commit is contained in:
Seven Du 2016-02-24 18:34:35 +08:00 committed by Michael Jerris
parent cd2c86b427
commit ed78d38994
6 changed files with 165 additions and 44 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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