static int image_scale(unsigned char* src, int src_width, int src_height, int src_format, unsigned char* dst, int dst_width, int dst_height, int dst_format)
{
AVFrame src_frame = { 0 }, dst_frame = { 0 };
struct SwsContext* img_convert_ctx = NULL;
av_image_fill_arrays(src_frame.data, src_frame.linesize, src, (AVPixelFormat)src_format, src_width, src_height, 1);
av_image_fill_arrays(dst_frame.data, dst_frame.linesize, dst, (AVPixelFormat)dst_format, dst_width, dst_height, 1);
img_convert_ctx = sws_getContext(src_width, src_height, (AVPixelFormat)src_format, dst_width, dst_height, (AVPixelFormat)dst_format, SWS_BICUBIC, NULL, NULL, NULL);
sws_scale(img_convert_ctx, src_frame.data, src_frame.linesize, 0, src_height, dst_frame.data, dst_frame.linesize);
sws_freeContext(img_convert_ctx);
return 0;
}
static int image_scale_bgr24_to_yuv420p(unsigned char* src, int src_width, int src_height, unsigned char* dst, int dst_width, int dst_height)
{
struct SwsContext* img_convert_ctx = NULL;
unsigned char* src_planes[3] = { src, NULL, NULL };
int src_stride[3] = { src_width * 3, 0, 0 };
unsigned char* dst_planes[3] = { dst, dst + dst_width * dst_height, dst + (dst_width * dst_height * 5 / 4) };
int dest_stride[3] = { dst_width, dst_width / 2, dst_width / 2 };
img_convert_ctx = sws_getContext(src_width, src_height, AV_PIX_FMT_BGR24, dst_width, dst_height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
sws_scale(img_convert_ctx, src_planes, src_stride, 0, src_height, dst_planes, dest_stride);
sws_freeContext(img_convert_ctx);
return 0;
}
static int image_scale_yuv420p_to_bgr24(unsigned char* src, int src_width, int src_height, unsigned char* dst, int dst_width, int dst_height)
{
struct SwsContext* img_convert_ctx = NULL;
unsigned char* src_planes[3] = { src, src + src_width * src_height, src + (src_width * src_height * 5 / 4) };
int src_stride[3] = { src_width, src_width / 2, src_width / 2 };
unsigned char* dst_planes[3] = { dst, NULL, NULL };
int dst_stride[3] = { dst_width * 3, 0, 0 };
img_convert_ctx = sws_getContext(src_width, src_height, AV_PIX_FMT_YUV420P, dst_width, dst_height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
sws_scale(img_convert_ctx, src_planes, src_stride, 0, src_height, dst_planes, dst_stride);
sws_freeContext(img_convert_ctx);
return 0;
}