2 * Copyright (c) 2009 Stefano Sabatini
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/common.h"
27 #include "libavutil/pixdesc.h"
33 const AVPixFmtDescriptor
*pix_desc
;
37 static av_cold
void uninit(AVFilterContext
*ctx
)
39 PixdescTestContext
*priv
= ctx
->priv
;
40 av_freep(&priv
->line
);
43 static int config_props(AVFilterLink
*inlink
)
45 PixdescTestContext
*priv
= inlink
->dst
->priv
;
47 priv
->pix_desc
= av_pix_fmt_desc_get(inlink
->format
);
49 if (!(priv
->line
= av_malloc(sizeof(*priv
->line
) * inlink
->w
)))
50 return AVERROR(ENOMEM
);
55 static int filter_frame(AVFilterLink
*inlink
, AVFilterBufferRef
*in
)
57 PixdescTestContext
*priv
= inlink
->dst
->priv
;
58 AVFilterLink
*outlink
= inlink
->dst
->outputs
[0];
59 AVFilterBufferRef
*out
;
60 int i
, c
, w
= inlink
->w
, h
= inlink
->h
;
62 out
= ff_get_video_buffer(outlink
, AV_PERM_WRITE
,
63 outlink
->w
, outlink
->h
);
65 avfilter_unref_bufferp(&in
);
66 return AVERROR(ENOMEM
);
69 avfilter_copy_buffer_ref_props(out
, in
);
71 for (i
= 0; i
< 4; i
++) {
73 h
= i
== 1 || i
== 2 ? h
>>priv
->pix_desc
->log2_chroma_h
: h
;
75 uint8_t *data
= out
->data
[i
] +
76 (out
->linesize
[i
] > 0 ? 0 : out
->linesize
[i
] * (h
-1));
77 memset(data
, 0, FFABS(out
->linesize
[i
]) * h
);
82 if (priv
->pix_desc
->flags
& PIX_FMT_PAL
||
83 priv
->pix_desc
->flags
& PIX_FMT_PSEUDOPAL
)
84 memcpy(out
->data
[1], in
->data
[1], 256*4);
86 for (c
= 0; c
< priv
->pix_desc
->nb_components
; c
++) {
87 int w1
= c
== 1 || c
== 2 ? w
>>priv
->pix_desc
->log2_chroma_w
: w
;
88 int h1
= c
== 1 || c
== 2 ? h
>>priv
->pix_desc
->log2_chroma_h
: h
;
90 for (i
= 0; i
< h1
; i
++) {
91 av_read_image_line(priv
->line
,
97 av_write_image_line(priv
->line
,
105 avfilter_unref_bufferp(&in
);
106 return ff_filter_frame(outlink
, out
);
109 static const AVFilterPad avfilter_vf_pixdesctest_inputs
[] = {
112 .type
= AVMEDIA_TYPE_VIDEO
,
113 .filter_frame
= filter_frame
,
114 .config_props
= config_props
,
115 .min_perms
= AV_PERM_READ
,
120 static const AVFilterPad avfilter_vf_pixdesctest_outputs
[] = {
123 .type
= AVMEDIA_TYPE_VIDEO
,
128 AVFilter avfilter_vf_pixdesctest
= {
129 .name
= "pixdesctest",
130 .description
= NULL_IF_CONFIG_SMALL("Test pixel format definitions."),
132 .priv_size
= sizeof(PixdescTestContext
),
135 .inputs
= avfilter_vf_pixdesctest_inputs
,
137 .outputs
= avfilter_vf_pixdesctest_outputs
,