FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavfilter
vf_pp.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2002 A'rpi
3
* Copyright (C) 2012 Clément Bœsch
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License along
18
* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
*/
21
22
/**
23
* @file
24
* libpostproc filter, ported from MPlayer.
25
*/
26
27
#include "
libavutil/avassert.h
"
28
#include "
libavutil/opt.h
"
29
#include "
internal.h
"
30
31
#include "
libpostproc/postprocess.h
"
32
33
typedef
struct
{
34
const
AVClass
*
class
;
35
char
*
subfilters
;
36
int
mode_id
;
37
pp_mode
*
modes
[
PP_QUALITY_MAX
+ 1];
38
void
*
pp_ctx
;
39
}
PPFilterContext
;
40
41
#define OFFSET(x) offsetof(PPFilterContext, x)
42
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
43
static
const
AVOption
pp_options
[] = {
44
{
"subfilters"
,
"set postprocess subfilters"
,
OFFSET
(subfilters),
AV_OPT_TYPE_STRING
, {.str=
"de"
}, .flags =
FLAGS
},
45
{ NULL }
46
};
47
48
AVFILTER_DEFINE_CLASS
(pp);
49
50
static
av_cold
int
pp_init
(
AVFilterContext
*ctx)
51
{
52
int
i;
53
PPFilterContext
*pp = ctx->
priv
;
54
55
for
(i = 0; i <=
PP_QUALITY_MAX
; i++) {
56
pp->
modes
[i] =
pp_get_mode_by_name_and_quality
(pp->
subfilters
, i);
57
if
(!pp->
modes
[i])
58
return
AVERROR_EXTERNAL
;
59
}
60
pp->
mode_id
=
PP_QUALITY_MAX
;
61
return
0;
62
}
63
64
static
int
pp_process_command
(
AVFilterContext
*ctx,
const
char
*cmd,
const
char
*
args
,
65
char
*
res
,
int
res_len,
int
flags
)
66
{
67
PPFilterContext
*pp = ctx->
priv
;
68
69
if
(!strcmp(cmd,
"quality"
)) {
70
pp->
mode_id
= av_clip(strtol(args, NULL, 10), 0,
PP_QUALITY_MAX
);
71
return
0;
72
}
73
return
AVERROR
(ENOSYS);
74
}
75
76
static
int
pp_query_formats
(
AVFilterContext
*ctx)
77
{
78
static
const
enum
PixelFormat
pix_fmts[] = {
79
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUVJ420P
,
80
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUVJ422P
,
81
AV_PIX_FMT_YUV411P
,
82
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUVJ444P
,
83
AV_PIX_FMT_NONE
84
};
85
ff_set_common_formats
(ctx,
ff_make_format_list
(pix_fmts));
86
return
0;
87
}
88
89
static
int
pp_config_props
(
AVFilterLink
*inlink)
90
{
91
int
flags
=
PP_CPU_CAPS_AUTO
;
92
PPFilterContext
*pp = inlink->
dst
->
priv
;
93
94
switch
(inlink->
format
) {
95
case
AV_PIX_FMT_YUVJ420P
:
96
case
AV_PIX_FMT_YUV420P
: flags |=
PP_FORMAT_420
;
break
;
97
case
AV_PIX_FMT_YUVJ422P
:
98
case
AV_PIX_FMT_YUV422P
: flags |=
PP_FORMAT_422
;
break
;
99
case
AV_PIX_FMT_YUV411P
: flags |=
PP_FORMAT_411
;
break
;
100
case
AV_PIX_FMT_YUVJ444P
:
101
case
AV_PIX_FMT_YUV444P
: flags |=
PP_FORMAT_444
;
break
;
102
default
:
av_assert0
(0);
103
}
104
105
pp->
pp_ctx
=
pp_get_context
(inlink->
w
, inlink->
h
, flags);
106
if
(!pp->
pp_ctx
)
107
return
AVERROR
(ENOMEM);
108
return
0;
109
}
110
111
static
int
pp_filter_frame
(
AVFilterLink
*inlink,
AVFrame
*inbuf)
112
{
113
AVFilterContext
*ctx = inlink->
dst
;
114
PPFilterContext
*pp = ctx->
priv
;
115
AVFilterLink
*outlink = ctx->
outputs
[0];
116
const
int
aligned_w =
FFALIGN
(outlink->
w
, 8);
117
const
int
aligned_h =
FFALIGN
(outlink->
h
, 8);
118
AVFrame
*outbuf;
119
int
qstride, qp_type;
120
int8_t *qp_table ;
121
122
outbuf =
ff_get_video_buffer
(outlink, aligned_w, aligned_h);
123
if
(!outbuf) {
124
av_frame_free
(&inbuf);
125
return
AVERROR
(ENOMEM);
126
}
127
av_frame_copy_props
(outbuf, inbuf);
128
outbuf->
width
= inbuf->
width
;
129
outbuf->
height
= inbuf->
height
;
130
qp_table =
av_frame_get_qp_table
(inbuf, &qstride, &qp_type);
131
132
pp_postprocess
((
const
uint8_t
**)inbuf->
data
, inbuf->
linesize
,
133
outbuf->
data
, outbuf->
linesize
,
134
aligned_w, outlink->
h
,
135
qp_table,
136
qstride,
137
pp->
modes
[pp->
mode_id
],
138
pp->
pp_ctx
,
139
outbuf->
pict_type
| (qp_type ?
PP_PICT_TYPE_QP2
: 0));
140
141
av_frame_free
(&inbuf);
142
return
ff_filter_frame
(outlink, outbuf);
143
}
144
145
static
av_cold
void
pp_uninit
(
AVFilterContext
*ctx)
146
{
147
int
i;
148
PPFilterContext
*pp = ctx->
priv
;
149
150
for
(i = 0; i <=
PP_QUALITY_MAX
; i++)
151
pp_free_mode
(pp->
modes
[i]);
152
if
(pp->
pp_ctx
)
153
pp_free_context
(pp->
pp_ctx
);
154
}
155
156
static
const
AVFilterPad
pp_inputs
[] = {
157
{
158
.
name
=
"default"
,
159
.type =
AVMEDIA_TYPE_VIDEO
,
160
.config_props =
pp_config_props
,
161
.filter_frame =
pp_filter_frame
,
162
},
163
{ NULL }
164
};
165
166
static
const
AVFilterPad
pp_outputs
[] = {
167
{
168
.
name
=
"default"
,
169
.type =
AVMEDIA_TYPE_VIDEO
,
170
},
171
{ NULL }
172
};
173
174
AVFilter
avfilter_vf_pp
= {
175
.
name
=
"pp"
,
176
.description =
NULL_IF_CONFIG_SMALL
(
"Filter video using libpostproc."
),
177
.priv_size =
sizeof
(
PPFilterContext
),
178
.
init
=
pp_init
,
179
.
uninit
=
pp_uninit
,
180
.
query_formats
=
pp_query_formats
,
181
.
inputs
= pp_inputs,
182
.
outputs
= pp_outputs,
183
.
process_command
=
pp_process_command
,
184
.priv_class = &pp_class,
185
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
,
186
};
Generated on Sat Jan 25 2014 19:52:01 for FFmpeg by
1.8.2