Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavfilter
vsrc_color.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2010 Stefano Sabatini
3
*
4
* This file is part of Libav.
5
*
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.
10
*
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.
15
*
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
19
*/
20
26
#include <stdio.h>
27
#include <string.h>
28
29
#include "
avfilter.h
"
30
#include "
formats.h
"
31
#include "
internal.h
"
32
#include "
video.h
"
33
#include "
libavutil/pixdesc.h
"
34
#include "
libavutil/colorspace.h
"
35
#include "
libavutil/imgutils.h
"
36
#include "
libavutil/internal.h
"
37
#include "
libavutil/mathematics.h
"
38
#include "
libavutil/mem.h
"
39
#include "
libavutil/opt.h
"
40
#include "
libavutil/parseutils.h
"
41
#include "
drawutils.h
"
42
43
typedef
struct
{
44
const
AVClass
*
class
;
45
int
w
, h;
46
uint8_t
color
[4];
47
AVRational
time_base
;
48
uint8_t
*
line
[4];
49
int
line_step[4];
50
int
hsub,
vsub
;
51
uint64_t
pts
;
52
char
*
color_str
;
53
char
*
size_str
;
54
char
*
framerate_str
;
55
}
ColorContext
;
56
57
static
av_cold
int
color_init
(
AVFilterContext
*ctx)
58
{
59
ColorContext
*
color
= ctx->
priv
;
60
AVRational
frame_rate_q;
61
int
ret;
62
63
if
(
av_parse_video_size
(&color->
w
, &color->
h
, color->
size_str
) < 0) {
64
av_log
(ctx,
AV_LOG_ERROR
,
"Invalid frame size: %s\n"
, color->
size_str
);
65
return
AVERROR
(EINVAL);
66
}
67
68
if
(
av_parse_video_rate
(&frame_rate_q, color->
framerate_str
) < 0 ||
69
frame_rate_q.
den
<= 0 || frame_rate_q.
num
<= 0) {
70
av_log
(ctx,
AV_LOG_ERROR
,
"Invalid frame rate: %s\n"
, color->
framerate_str
);
71
return
AVERROR
(EINVAL);
72
}
73
color->
time_base
.
num
= frame_rate_q.
den
;
74
color->
time_base
.
den
= frame_rate_q.
num
;
75
76
if
((ret =
av_parse_color
(color->
color
, color->
color_str
, -1, ctx)) < 0)
77
return
ret;
78
79
return
0;
80
}
81
82
static
av_cold
void
color_uninit
(
AVFilterContext
*ctx)
83
{
84
ColorContext
*
color
= ctx->
priv
;
85
int
i;
86
87
for
(i = 0; i < 4; i++) {
88
av_freep
(&color->
line
[i]);
89
color->
line_step
[i] = 0;
90
}
91
}
92
93
static
int
query_formats
(
AVFilterContext
*ctx)
94
{
95
static
const
enum
AVPixelFormat
pix_fmts[] = {
96
AV_PIX_FMT_ARGB
,
AV_PIX_FMT_RGBA
,
97
AV_PIX_FMT_ABGR
,
AV_PIX_FMT_BGRA
,
98
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_BGR24
,
99
100
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV422P
,
101
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV411P
,
102
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV440P
,
103
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUVJ422P
,
104
AV_PIX_FMT_YUVJ420P
,
AV_PIX_FMT_YUVJ440P
,
105
AV_PIX_FMT_YUVA420P
,
106
107
AV_PIX_FMT_NONE
108
};
109
110
ff_set_common_formats
(ctx,
ff_make_format_list
(pix_fmts));
111
return
0;
112
}
113
114
static
int
color_config_props
(
AVFilterLink
*inlink)
115
{
116
AVFilterContext
*ctx = inlink->
src
;
117
ColorContext
*
color
= ctx->
priv
;
118
uint8_t
rgba_color[4];
119
int
is_packed_rgba;
120
const
AVPixFmtDescriptor
*pix_desc =
av_pix_fmt_desc_get
(inlink->
format
);
121
122
color->
hsub
= pix_desc->
log2_chroma_w
;
123
color->
vsub
= pix_desc->
log2_chroma_h
;
124
125
color->
w
&= ~((1 << color->
hsub
) - 1);
126
color->
h
&= ~((1 << color->
vsub
) - 1);
127
if
(
av_image_check_size
(color->
w
, color->
h
, 0, ctx) < 0)
128
return
AVERROR
(EINVAL);
129
130
memcpy(rgba_color, color->
color
,
sizeof
(rgba_color));
131
ff_fill_line_with_color
(color->
line
, color->
line_step
, color->
w
, color->
color
,
132
inlink->
format
, rgba_color, &is_packed_rgba,
NULL
);
133
134
av_log
(ctx,
AV_LOG_VERBOSE
,
"w:%d h:%d r:%d/%d color:0x%02x%02x%02x%02x[%s]\n"
,
135
color->
w
, color->
h
, color->
time_base
.
den
, color->
time_base
.
num
,
136
color->
color
[0], color->
color
[1], color->
color
[2], color->
color
[3],
137
is_packed_rgba ?
"rgba"
:
"yuva"
);
138
inlink->
w
= color->
w
;
139
inlink->
h
= color->
h
;
140
inlink->
time_base
= color->
time_base
;
141
142
return
0;
143
}
144
145
static
int
color_request_frame
(
AVFilterLink
*link)
146
{
147
ColorContext
*
color
= link->
src
->
priv
;
148
AVFrame
*frame =
ff_get_video_buffer
(link, color->
w
, color->
h
);
149
150
if
(!frame)
151
return
AVERROR
(ENOMEM);
152
153
frame->
sample_aspect_ratio
= (
AVRational
) {1, 1};
154
frame->
pts
= color->
pts
++;
155
156
ff_draw_rectangle
(frame->
data
, frame->
linesize
,
157
color->
line
, color->
line_step
, color->
hsub
, color->
vsub
,
158
0, 0, color->
w
, color->
h
);
159
return
ff_filter_frame
(link, frame);
160
}
161
162
#define OFFSET(x) offsetof(ColorContext, x)
163
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
164
static
const
AVOption
options
[] = {
165
{
"color"
,
"Output video color"
,
OFFSET
(color_str),
AV_OPT_TYPE_STRING
, { .str =
"black"
}, .flags =
FLAGS
},
166
{
"size"
,
"Output video size (wxh or an abbreviation)"
,
OFFSET
(size_str),
AV_OPT_TYPE_STRING
, { .str =
"320x240"
}, .flags =
FLAGS
},
167
{
"framerate"
,
"Output video framerate"
,
OFFSET
(framerate_str),
AV_OPT_TYPE_STRING
, { .str =
"25"
}, .flags =
FLAGS
},
168
{
NULL
},
169
};
170
171
static
const
AVClass
color_class
= {
172
.
class_name
=
"color"
,
173
.item_name =
av_default_item_name
,
174
.option =
options
,
175
.version =
LIBAVUTIL_VERSION_INT
,
176
};
177
178
static
const
AVFilterPad
avfilter_vsrc_color_outputs
[] = {
179
{
180
.
name
=
"default"
,
181
.type =
AVMEDIA_TYPE_VIDEO
,
182
.request_frame =
color_request_frame
,
183
.config_props =
color_config_props
184
},
185
{
NULL
}
186
};
187
188
AVFilter
ff_vsrc_color
= {
189
.
name
=
"color"
,
190
.description =
NULL_IF_CONFIG_SMALL
(
"Provide an uniformly colored input, syntax is: [color[:size[:rate]]]"
),
191
192
.priv_class = &
color_class
,
193
.priv_size =
sizeof
(
ColorContext
),
194
.
init
=
color_init
,
195
.
uninit
=
color_uninit
,
196
197
.
query_formats
=
query_formats
,
198
199
.
inputs
=
NULL
,
200
201
.
outputs
= avfilter_vsrc_color_outputs,
202
};
Generated on Thu Sep 30 2021 23:03:18 for Libav by
1.8.1.2