*/
#include "libavutil/avassert.h"
+#include "libavutil/mem_internal.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"
[AVCOL_TRC_GAMMA28] = { 1.0, 0.0, 1.0 / 2.8, 0.0 },
[AVCOL_TRC_SMPTE170M] = { 1.099, 0.018, 0.45, 4.5 },
[AVCOL_TRC_SMPTE240M] = { 1.1115, 0.0228, 0.45, 4.0 },
+ [AVCOL_TRC_LINEAR] = { 1.0, 0.0, 1.0, 0.0 },
[AVCOL_TRC_IEC61966_2_1] = { 1.055, 0.0031308, 1.0 / 2.4, 12.92 },
[AVCOL_TRC_IEC61966_2_4] = { 1.099, 0.018, 0.45, 4.5 },
[AVCOL_TRC_BT2020_10] = { 1.099, 0.018, 0.45, 4.5 },
}
}
-struct ThreadData {
+typedef struct ThreadData {
AVFrame *in, *out;
ptrdiff_t in_linesize[3], out_linesize[3];
int in_ss_h, out_ss_h;
-};
+} ThreadData;
static int convert(AVFilterContext *ctx, void *data, int job_nr, int n_jobs)
{
- struct ThreadData *td = data;
+ const ThreadData *td = data;
ColorSpaceContext *s = ctx->priv;
uint8_t *in_data[3], *out_data[3];
int16_t *rgb[3];
int res;
ptrdiff_t rgb_stride = FFALIGN(in->width * sizeof(int16_t), 32);
unsigned rgb_sz = rgb_stride * in->height;
- struct ThreadData td;
+ ThreadData td;
if (!out) {
av_frame_free(&in);
res = av_frame_copy_props(out, in);
if (res < 0) {
av_frame_free(&in);
+ av_frame_free(&out);
return res;
}
!s->dither_scratch_base[1][0] || !s->dither_scratch_base[1][1] ||
!s->dither_scratch_base[2][0] || !s->dither_scratch_base[2][1]) {
uninit(ctx);
+ av_frame_free(&in);
+ av_frame_free(&out);
return AVERROR(ENOMEM);
}
s->rgb_sz = rgb_sz;
}
res = create_filtergraph(ctx, in, out);
- if (res < 0)
+ if (res < 0) {
+ av_frame_free(&in);
+ av_frame_free(&out);
return res;
+ }
s->rgb_stride = rgb_stride / sizeof(int16_t);
td.in = in;
td.out = out;
td.out_ss_h = av_pix_fmt_desc_get(out->format)->log2_chroma_h;
if (s->yuv2yuv_passthrough) {
res = av_frame_copy(out, in);
- if (res < 0)
+ if (res < 0) {
+ av_frame_free(&in);
+ av_frame_free(&out);
return res;
+ }
} else {
ctx->internal->execute(ctx, convert, &td, NULL,
FFMIN((in->height + 1) >> 1, ff_filter_get_nb_threads(ctx)));
return AVERROR(ENOMEM);
if (s->user_format == AV_PIX_FMT_NONE)
return ff_set_common_formats(ctx, formats);
- res = ff_formats_ref(formats, &ctx->inputs[0]->out_formats);
+ res = ff_formats_ref(formats, &ctx->inputs[0]->outcfg.formats);
if (res < 0)
return res;
formats = NULL;
if (res < 0)
return res;
- return ff_formats_ref(formats, &ctx->outputs[0]->in_formats);
+ return ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats);
}
static int config_props(AVFilterLink *outlink)
ENUM("gamma28", AVCOL_TRC_GAMMA28, "trc"),
ENUM("smpte170m", AVCOL_TRC_SMPTE170M, "trc"),
ENUM("smpte240m", AVCOL_TRC_SMPTE240M, "trc"),
+ ENUM("linear", AVCOL_TRC_LINEAR, "trc"),
ENUM("srgb", AVCOL_TRC_IEC61966_2_1, "trc"),
ENUM("iec61966-2-1", AVCOL_TRC_IEC61966_2_1, "trc"),
ENUM("xvycc", AVCOL_TRC_IEC61966_2_4, "trc"),
{ NULL }
};
-AVFilter ff_vf_colorspace = {
+const AVFilter ff_vf_colorspace = {
.name = "colorspace",
.description = NULL_IF_CONFIG_SMALL("Convert between colorspaces."),
.init = init,