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 "
avfilter.h
"
27
#include "
libavutil/pixdesc.h
"
28
#include "
libavutil/colorspace.h
"
29
#include "
libavutil/imgutils.h
"
30
#include "
libavutil/mathematics.h
"
31
#include "
libavutil/parseutils.h
"
32
#include "
drawutils.h
"
33
34
typedef
struct
{
35
int
w
, h;
36
uint8_t
color
[4];
37
AVRational
time_base
;
38
uint8_t *
line
[4];
39
int
line_step[4];
40
int
hsub,
vsub
;
41
uint64_t
pts
;
42
}
ColorContext
;
43
44
static
av_cold
int
color_init
(
AVFilterContext
*ctx,
const
char
*args,
void
*opaque)
45
{
46
ColorContext
*
color
= ctx->
priv
;
47
char
color_string[128] =
"black"
;
48
char
frame_size [128] =
"320x240"
;
49
char
frame_rate
[128] =
"25"
;
50
AVRational
frame_rate_q;
51
int
ret;
52
53
if
(args)
54
sscanf(args,
"%127[^:]:%127[^:]:%127s"
, color_string, frame_size, frame_rate);
55
56
if
(
av_parse_video_size
(&color->
w
, &color->
h
, frame_size) < 0) {
57
av_log
(ctx,
AV_LOG_ERROR
,
"Invalid frame size: %s\n"
, frame_size);
58
return
AVERROR
(EINVAL);
59
}
60
61
if
(
av_parse_video_rate
(&frame_rate_q, frame_rate) < 0 ||
62
frame_rate_q.
den
<= 0 || frame_rate_q.
num
<= 0) {
63
av_log
(ctx,
AV_LOG_ERROR
,
"Invalid frame rate: %s\n"
, frame_rate);
64
return
AVERROR
(EINVAL);
65
}
66
color->
time_base
.
num
= frame_rate_q.
den
;
67
color->
time_base
.
den
= frame_rate_q.
num
;
68
69
if
((ret =
av_parse_color
(color->
color
, color_string, -1, ctx)) < 0)
70
return
ret;
71
72
return
0;
73
}
74
75
static
av_cold
void
color_uninit
(
AVFilterContext
*ctx)
76
{
77
ColorContext
*
color
= ctx->
priv
;
78
int
i;
79
80
for
(i = 0; i < 4; i++) {
81
av_freep
(&color->
line
[i]);
82
color->
line_step
[i] = 0;
83
}
84
}
85
86
static
int
query_formats
(
AVFilterContext
*ctx)
87
{
88
static
const
enum
PixelFormat
pix_fmts[] = {
89
PIX_FMT_ARGB
,
PIX_FMT_RGBA
,
90
PIX_FMT_ABGR
,
PIX_FMT_BGRA
,
91
PIX_FMT_RGB24
,
PIX_FMT_BGR24
,
92
93
PIX_FMT_YUV444P
,
PIX_FMT_YUV422P
,
94
PIX_FMT_YUV420P
,
PIX_FMT_YUV411P
,
95
PIX_FMT_YUV410P
,
PIX_FMT_YUV440P
,
96
PIX_FMT_YUVJ444P
,
PIX_FMT_YUVJ422P
,
97
PIX_FMT_YUVJ420P
,
PIX_FMT_YUVJ440P
,
98
PIX_FMT_YUVA420P
,
99
100
PIX_FMT_NONE
101
};
102
103
avfilter_set_common_formats
(ctx,
avfilter_make_format_list
(pix_fmts));
104
return
0;
105
}
106
107
static
int
color_config_props
(
AVFilterLink
*inlink)
108
{
109
AVFilterContext
*ctx = inlink->
src
;
110
ColorContext
*
color
= ctx->
priv
;
111
uint8_t rgba_color[4];
112
int
is_packed_rgba;
113
const
AVPixFmtDescriptor
*pix_desc = &
av_pix_fmt_descriptors
[inlink->
format
];
114
115
color->
hsub
= pix_desc->
log2_chroma_w
;
116
color->
vsub
= pix_desc->
log2_chroma_h
;
117
118
color->
w
&= ~((1 << color->
hsub
) - 1);
119
color->
h
&= ~((1 << color->
vsub
) - 1);
120
if
(
av_image_check_size
(color->
w
, color->
h
, 0, ctx) < 0)
121
return
AVERROR
(EINVAL);
122
123
memcpy(rgba_color, color->
color
,
sizeof
(rgba_color));
124
ff_fill_line_with_color
(color->
line
, color->
line_step
, color->
w
, color->
color
,
125
inlink->
format
, rgba_color, &is_packed_rgba,
NULL
);
126
127
av_log
(ctx,
AV_LOG_INFO
,
"w:%d h:%d r:%d/%d color:0x%02x%02x%02x%02x[%s]\n"
,
128
color->
w
, color->
h
, color->
time_base
.
den
, color->
time_base
.
num
,
129
color->
color
[0], color->
color
[1], color->
color
[2], color->
color
[3],
130
is_packed_rgba ?
"rgba"
:
"yuva"
);
131
inlink->
w
= color->
w
;
132
inlink->
h
= color->
h
;
133
inlink->
time_base
= color->
time_base
;
134
135
return
0;
136
}
137
138
static
int
color_request_frame
(
AVFilterLink
*link)
139
{
140
ColorContext
*
color
= link->
src
->
priv
;
141
AVFilterBufferRef
*picref =
avfilter_get_video_buffer
(link,
AV_PERM_WRITE
, color->
w
, color->
h
);
142
picref->
video
->
pixel_aspect
= (
AVRational
) {1, 1};
143
picref->
pts
= color->
pts
++;
144
picref->
pos
= -1;
145
146
avfilter_start_frame
(link,
avfilter_ref_buffer
(picref, ~0));
147
ff_draw_rectangle
(picref->
data
, picref->
linesize
,
148
color->
line
, color->
line_step
, color->
hsub
, color->
vsub
,
149
0, 0, color->
w
, color->
h
);
150
avfilter_draw_slice
(link, 0, color->
h
, 1);
151
avfilter_end_frame
(link);
152
avfilter_unref_buffer
(picref);
153
154
return
0;
155
}
156
157
AVFilter
avfilter_vsrc_color
= {
158
.
name
=
"color"
,
159
.description =
NULL_IF_CONFIG_SMALL
(
"Provide an uniformly colored input, syntax is: [color[:size[:rate]]]"
),
160
161
.priv_size =
sizeof
(
ColorContext
),
162
.
init
=
color_init
,
163
.
uninit
=
color_uninit
,
164
165
.
query_formats
=
query_formats
,
166
167
.inputs = (
AVFilterPad
[]) {{ .name =
NULL
}},
168
169
.outputs = (
AVFilterPad
[]) {{ .name =
"default"
,
170
.type =
AVMEDIA_TYPE_VIDEO
,
171
.request_frame =
color_request_frame
,
172
.config_props =
color_config_props
},
173
{ .name =
NULL
}},
174
};