mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-10-03 01:21:46 +02:00
swscale/utils: Move functions to avoid forward declarations
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
baccc1c541
commit
ff39dcb129
@ -59,13 +59,6 @@
|
||||
#include "swscale.h"
|
||||
#include "swscale_internal.h"
|
||||
|
||||
static SwsVector *sws_getIdentityVec(void);
|
||||
static void sws_addVec(SwsVector *a, SwsVector *b);
|
||||
static void sws_shiftVec(SwsVector *a, int shift);
|
||||
static void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level);
|
||||
|
||||
static void handle_formats(SwsContext *c);
|
||||
|
||||
typedef struct FormatEntry {
|
||||
uint8_t is_supported_in :1;
|
||||
uint8_t is_supported_out :1;
|
||||
@ -926,6 +919,74 @@ static void fill_xyztables(struct SwsContext *c)
|
||||
}
|
||||
}
|
||||
|
||||
static int handle_jpeg(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_YUVJ420P:
|
||||
*format = AV_PIX_FMT_YUV420P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ411P:
|
||||
*format = AV_PIX_FMT_YUV411P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ422P:
|
||||
*format = AV_PIX_FMT_YUV422P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ444P:
|
||||
*format = AV_PIX_FMT_YUV444P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ440P:
|
||||
*format = AV_PIX_FMT_YUV440P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_GRAY8:
|
||||
case AV_PIX_FMT_YA8:
|
||||
case AV_PIX_FMT_GRAY9LE:
|
||||
case AV_PIX_FMT_GRAY9BE:
|
||||
case AV_PIX_FMT_GRAY10LE:
|
||||
case AV_PIX_FMT_GRAY10BE:
|
||||
case AV_PIX_FMT_GRAY12LE:
|
||||
case AV_PIX_FMT_GRAY12BE:
|
||||
case AV_PIX_FMT_GRAY14LE:
|
||||
case AV_PIX_FMT_GRAY14BE:
|
||||
case AV_PIX_FMT_GRAY16LE:
|
||||
case AV_PIX_FMT_GRAY16BE:
|
||||
case AV_PIX_FMT_YA16BE:
|
||||
case AV_PIX_FMT_YA16LE:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int handle_0alpha(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_0BGR : *format = AV_PIX_FMT_ABGR ; return 1;
|
||||
case AV_PIX_FMT_BGR0 : *format = AV_PIX_FMT_BGRA ; return 4;
|
||||
case AV_PIX_FMT_0RGB : *format = AV_PIX_FMT_ARGB ; return 1;
|
||||
case AV_PIX_FMT_RGB0 : *format = AV_PIX_FMT_RGBA ; return 4;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int handle_xyz(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_XYZ12BE : *format = AV_PIX_FMT_RGB48BE; return 1;
|
||||
case AV_PIX_FMT_XYZ12LE : *format = AV_PIX_FMT_RGB48LE; return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_formats(SwsContext *c)
|
||||
{
|
||||
c->src0Alpha |= handle_0alpha(&c->srcFormat);
|
||||
c->dst0Alpha |= handle_0alpha(&c->dstFormat);
|
||||
c->srcXYZ |= handle_xyz(&c->srcFormat);
|
||||
c->dstXYZ |= handle_xyz(&c->dstFormat);
|
||||
if (c->srcXYZ || c->dstXYZ)
|
||||
fill_xyztables(c);
|
||||
}
|
||||
|
||||
static int range_override_needed(enum AVPixelFormat format)
|
||||
{
|
||||
return !isYUV(format) && !isGray(format);
|
||||
@ -1112,74 +1173,6 @@ int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_jpeg(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_YUVJ420P:
|
||||
*format = AV_PIX_FMT_YUV420P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ411P:
|
||||
*format = AV_PIX_FMT_YUV411P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ422P:
|
||||
*format = AV_PIX_FMT_YUV422P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ444P:
|
||||
*format = AV_PIX_FMT_YUV444P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_YUVJ440P:
|
||||
*format = AV_PIX_FMT_YUV440P;
|
||||
return 1;
|
||||
case AV_PIX_FMT_GRAY8:
|
||||
case AV_PIX_FMT_YA8:
|
||||
case AV_PIX_FMT_GRAY9LE:
|
||||
case AV_PIX_FMT_GRAY9BE:
|
||||
case AV_PIX_FMT_GRAY10LE:
|
||||
case AV_PIX_FMT_GRAY10BE:
|
||||
case AV_PIX_FMT_GRAY12LE:
|
||||
case AV_PIX_FMT_GRAY12BE:
|
||||
case AV_PIX_FMT_GRAY14LE:
|
||||
case AV_PIX_FMT_GRAY14BE:
|
||||
case AV_PIX_FMT_GRAY16LE:
|
||||
case AV_PIX_FMT_GRAY16BE:
|
||||
case AV_PIX_FMT_YA16BE:
|
||||
case AV_PIX_FMT_YA16LE:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int handle_0alpha(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_0BGR : *format = AV_PIX_FMT_ABGR ; return 1;
|
||||
case AV_PIX_FMT_BGR0 : *format = AV_PIX_FMT_BGRA ; return 4;
|
||||
case AV_PIX_FMT_0RGB : *format = AV_PIX_FMT_ARGB ; return 1;
|
||||
case AV_PIX_FMT_RGB0 : *format = AV_PIX_FMT_RGBA ; return 4;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int handle_xyz(enum AVPixelFormat *format)
|
||||
{
|
||||
switch (*format) {
|
||||
case AV_PIX_FMT_XYZ12BE : *format = AV_PIX_FMT_RGB48BE; return 1;
|
||||
case AV_PIX_FMT_XYZ12LE : *format = AV_PIX_FMT_RGB48LE; return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_formats(SwsContext *c)
|
||||
{
|
||||
c->src0Alpha |= handle_0alpha(&c->srcFormat);
|
||||
c->dst0Alpha |= handle_0alpha(&c->dstFormat);
|
||||
c->srcXYZ |= handle_xyz(&c->srcFormat);
|
||||
c->dstXYZ |= handle_xyz(&c->dstFormat);
|
||||
if (c->srcXYZ || c->dstXYZ)
|
||||
fill_xyztables(c);
|
||||
}
|
||||
|
||||
SwsContext *sws_alloc_context(void)
|
||||
{
|
||||
SwsContext *c = av_mallocz(sizeof(SwsContext));
|
||||
@ -1271,55 +1264,6 @@ static enum AVPixelFormat alphaless_fmt(enum AVPixelFormat fmt)
|
||||
static int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter,
|
||||
SwsFilter *dstFilter);
|
||||
|
||||
static int context_init_threaded(SwsContext *c,
|
||||
SwsFilter *src_filter, SwsFilter *dst_filter)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = avpriv_slicethread_create(&c->slicethread, (void*)c,
|
||||
ff_sws_slice_worker, NULL, c->nb_threads);
|
||||
if (ret == AVERROR(ENOSYS)) {
|
||||
c->nb_threads = 1;
|
||||
return 0;
|
||||
} else if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->nb_threads = ret;
|
||||
|
||||
c->slice_ctx = av_calloc(c->nb_threads, sizeof(*c->slice_ctx));
|
||||
c->slice_err = av_calloc(c->nb_threads, sizeof(*c->slice_err));
|
||||
if (!c->slice_ctx || !c->slice_err)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (int i = 0; i < c->nb_threads; i++) {
|
||||
c->slice_ctx[i] = sws_alloc_context();
|
||||
if (!c->slice_ctx[i])
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
c->slice_ctx[i]->parent = c;
|
||||
|
||||
ret = av_opt_copy((void*)c->slice_ctx[i], (void*)c);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->slice_ctx[i]->nb_threads = 1;
|
||||
|
||||
ret = sws_init_single_context(c->slice_ctx[i], src_filter, dst_filter);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->nb_slice_ctx++;
|
||||
|
||||
if (c->slice_ctx[i]->dither == SWS_DITHER_ED) {
|
||||
av_log(c, AV_LOG_VERBOSE,
|
||||
"Error-diffusion dither is in use, scaling will be single-threaded.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter,
|
||||
SwsFilter *dstFilter)
|
||||
{
|
||||
@ -2037,6 +1981,55 @@ fail: // FIXME replace things by appropriate error codes
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int context_init_threaded(SwsContext *c,
|
||||
SwsFilter *src_filter, SwsFilter *dst_filter)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = avpriv_slicethread_create(&c->slicethread, (void*)c,
|
||||
ff_sws_slice_worker, NULL, c->nb_threads);
|
||||
if (ret == AVERROR(ENOSYS)) {
|
||||
c->nb_threads = 1;
|
||||
return 0;
|
||||
} else if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->nb_threads = ret;
|
||||
|
||||
c->slice_ctx = av_calloc(c->nb_threads, sizeof(*c->slice_ctx));
|
||||
c->slice_err = av_calloc(c->nb_threads, sizeof(*c->slice_err));
|
||||
if (!c->slice_ctx || !c->slice_err)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (int i = 0; i < c->nb_threads; i++) {
|
||||
c->slice_ctx[i] = sws_alloc_context();
|
||||
if (!c->slice_ctx[i])
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
c->slice_ctx[i]->parent = c;
|
||||
|
||||
ret = av_opt_copy((void*)c->slice_ctx[i], (void*)c);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->slice_ctx[i]->nb_threads = 1;
|
||||
|
||||
ret = sws_init_single_context(c->slice_ctx[i], src_filter, dst_filter);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
c->nb_slice_ctx++;
|
||||
|
||||
if (c->slice_ctx[i]->dither == SWS_DITHER_ED) {
|
||||
av_log(c, AV_LOG_VERBOSE,
|
||||
"Error-diffusion dither is in use, scaling will be single-threaded.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
|
||||
SwsFilter *dstFilter)
|
||||
{
|
||||
@ -2123,89 +2116,6 @@ static void makenan_vec(SwsVector *a)
|
||||
a->coeff[i] = NAN;
|
||||
}
|
||||
|
||||
SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
|
||||
float lumaSharpen, float chromaSharpen,
|
||||
float chromaHShift, float chromaVShift,
|
||||
int verbose)
|
||||
{
|
||||
SwsFilter *filter = av_malloc(sizeof(SwsFilter));
|
||||
if (!filter)
|
||||
return NULL;
|
||||
|
||||
if (lumaGBlur != 0.0) {
|
||||
filter->lumH = sws_getGaussianVec(lumaGBlur, 3.0);
|
||||
filter->lumV = sws_getGaussianVec(lumaGBlur, 3.0);
|
||||
} else {
|
||||
filter->lumH = sws_getIdentityVec();
|
||||
filter->lumV = sws_getIdentityVec();
|
||||
}
|
||||
|
||||
if (chromaGBlur != 0.0) {
|
||||
filter->chrH = sws_getGaussianVec(chromaGBlur, 3.0);
|
||||
filter->chrV = sws_getGaussianVec(chromaGBlur, 3.0);
|
||||
} else {
|
||||
filter->chrH = sws_getIdentityVec();
|
||||
filter->chrV = sws_getIdentityVec();
|
||||
}
|
||||
|
||||
if (!filter->lumH || !filter->lumV || !filter->chrH || !filter->chrV)
|
||||
goto fail;
|
||||
|
||||
if (chromaSharpen != 0.0) {
|
||||
SwsVector *id = sws_getIdentityVec();
|
||||
if (!id)
|
||||
goto fail;
|
||||
sws_scaleVec(filter->chrH, -chromaSharpen);
|
||||
sws_scaleVec(filter->chrV, -chromaSharpen);
|
||||
sws_addVec(filter->chrH, id);
|
||||
sws_addVec(filter->chrV, id);
|
||||
sws_freeVec(id);
|
||||
}
|
||||
|
||||
if (lumaSharpen != 0.0) {
|
||||
SwsVector *id = sws_getIdentityVec();
|
||||
if (!id)
|
||||
goto fail;
|
||||
sws_scaleVec(filter->lumH, -lumaSharpen);
|
||||
sws_scaleVec(filter->lumV, -lumaSharpen);
|
||||
sws_addVec(filter->lumH, id);
|
||||
sws_addVec(filter->lumV, id);
|
||||
sws_freeVec(id);
|
||||
}
|
||||
|
||||
if (chromaHShift != 0.0)
|
||||
sws_shiftVec(filter->chrH, (int)(chromaHShift + 0.5));
|
||||
|
||||
if (chromaVShift != 0.0)
|
||||
sws_shiftVec(filter->chrV, (int)(chromaVShift + 0.5));
|
||||
|
||||
sws_normalizeVec(filter->chrH, 1.0);
|
||||
sws_normalizeVec(filter->chrV, 1.0);
|
||||
sws_normalizeVec(filter->lumH, 1.0);
|
||||
sws_normalizeVec(filter->lumV, 1.0);
|
||||
|
||||
if (isnan_vec(filter->chrH) ||
|
||||
isnan_vec(filter->chrV) ||
|
||||
isnan_vec(filter->lumH) ||
|
||||
isnan_vec(filter->lumV))
|
||||
goto fail;
|
||||
|
||||
if (verbose)
|
||||
sws_printVec2(filter->chrH, NULL, AV_LOG_DEBUG);
|
||||
if (verbose)
|
||||
sws_printVec2(filter->lumH, NULL, AV_LOG_DEBUG);
|
||||
|
||||
return filter;
|
||||
|
||||
fail:
|
||||
sws_freeVec(filter->lumH);
|
||||
sws_freeVec(filter->lumV);
|
||||
sws_freeVec(filter->chrH);
|
||||
sws_freeVec(filter->chrV);
|
||||
av_freep(&filter);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SwsVector *sws_allocVec(int length)
|
||||
{
|
||||
SwsVector *vec;
|
||||
@ -2417,6 +2327,89 @@ void sws_freeFilter(SwsFilter *filter)
|
||||
av_free(filter);
|
||||
}
|
||||
|
||||
SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
|
||||
float lumaSharpen, float chromaSharpen,
|
||||
float chromaHShift, float chromaVShift,
|
||||
int verbose)
|
||||
{
|
||||
SwsFilter *filter = av_malloc(sizeof(SwsFilter));
|
||||
if (!filter)
|
||||
return NULL;
|
||||
|
||||
if (lumaGBlur != 0.0) {
|
||||
filter->lumH = sws_getGaussianVec(lumaGBlur, 3.0);
|
||||
filter->lumV = sws_getGaussianVec(lumaGBlur, 3.0);
|
||||
} else {
|
||||
filter->lumH = sws_getIdentityVec();
|
||||
filter->lumV = sws_getIdentityVec();
|
||||
}
|
||||
|
||||
if (chromaGBlur != 0.0) {
|
||||
filter->chrH = sws_getGaussianVec(chromaGBlur, 3.0);
|
||||
filter->chrV = sws_getGaussianVec(chromaGBlur, 3.0);
|
||||
} else {
|
||||
filter->chrH = sws_getIdentityVec();
|
||||
filter->chrV = sws_getIdentityVec();
|
||||
}
|
||||
|
||||
if (!filter->lumH || !filter->lumV || !filter->chrH || !filter->chrV)
|
||||
goto fail;
|
||||
|
||||
if (chromaSharpen != 0.0) {
|
||||
SwsVector *id = sws_getIdentityVec();
|
||||
if (!id)
|
||||
goto fail;
|
||||
sws_scaleVec(filter->chrH, -chromaSharpen);
|
||||
sws_scaleVec(filter->chrV, -chromaSharpen);
|
||||
sws_addVec(filter->chrH, id);
|
||||
sws_addVec(filter->chrV, id);
|
||||
sws_freeVec(id);
|
||||
}
|
||||
|
||||
if (lumaSharpen != 0.0) {
|
||||
SwsVector *id = sws_getIdentityVec();
|
||||
if (!id)
|
||||
goto fail;
|
||||
sws_scaleVec(filter->lumH, -lumaSharpen);
|
||||
sws_scaleVec(filter->lumV, -lumaSharpen);
|
||||
sws_addVec(filter->lumH, id);
|
||||
sws_addVec(filter->lumV, id);
|
||||
sws_freeVec(id);
|
||||
}
|
||||
|
||||
if (chromaHShift != 0.0)
|
||||
sws_shiftVec(filter->chrH, (int)(chromaHShift + 0.5));
|
||||
|
||||
if (chromaVShift != 0.0)
|
||||
sws_shiftVec(filter->chrV, (int)(chromaVShift + 0.5));
|
||||
|
||||
sws_normalizeVec(filter->chrH, 1.0);
|
||||
sws_normalizeVec(filter->chrV, 1.0);
|
||||
sws_normalizeVec(filter->lumH, 1.0);
|
||||
sws_normalizeVec(filter->lumV, 1.0);
|
||||
|
||||
if (isnan_vec(filter->chrH) ||
|
||||
isnan_vec(filter->chrV) ||
|
||||
isnan_vec(filter->lumH) ||
|
||||
isnan_vec(filter->lumV))
|
||||
goto fail;
|
||||
|
||||
if (verbose)
|
||||
sws_printVec2(filter->chrH, NULL, AV_LOG_DEBUG);
|
||||
if (verbose)
|
||||
sws_printVec2(filter->lumH, NULL, AV_LOG_DEBUG);
|
||||
|
||||
return filter;
|
||||
|
||||
fail:
|
||||
sws_freeVec(filter->lumH);
|
||||
sws_freeVec(filter->lumV);
|
||||
sws_freeVec(filter->chrH);
|
||||
sws_freeVec(filter->chrV);
|
||||
av_freep(&filter);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void sws_freeContext(SwsContext *c)
|
||||
{
|
||||
int i;
|
||||
|
Loading…
Reference in New Issue
Block a user