Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
fcc7d869
Commit
fcc7d869
authored
Jun 20, 2011
by
Stefano Sabatini
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
doc/examples: add decoding/filtering example program
parent
c762f9fa
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
231 additions
and
1 deletion
+231
-1
Makefile
doc/examples/Makefile
+1
-1
filtering.c
doc/examples/filtering.c
+230
-0
No files found.
doc/examples/Makefile
View file @
fcc7d869
...
...
@@ -3,7 +3,7 @@ FFMPEG_LIBS=libavdevice libavformat libavfilter libavcodec libswscale libavutil
CFLAGS
+=
$(
shell
pkg-config
--cflags
$(FFMPEG_LIBS))
LDFLAGS
+=
$(
shell
pkg-config
--libs
$(FFMPEG_LIBS))
EXAMPLES
=
encoding metadata muxing
EXAMPLES
=
encoding
filtering
metadata muxing
OBJS
=
$
(
addsuffix .o,
$(EXAMPLES)
)
...
...
doc/examples/filtering.c
0 → 100644
View file @
fcc7d869
/*
* Copyright (c) 2010 Nicolas George
* Copyright (c) 2011 Stefano Sabatini
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* @file
* API example for decoding and filtering
*/
#define _XOPEN_SOURCE 600
/* for usleep */
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfiltergraph.h>
#include <libavfilter/vsink_buffer.h>
#include <libavfilter/vsrc_buffer.h>
const
char
*
filter_descr
=
"scale=78:24"
;
static
AVFormatContext
*
fmt_ctx
;
static
AVCodecContext
*
dec_ctx
;
AVFilterContext
*
buffersink_ctx
;
AVFilterContext
*
buffersrc_ctx
;
AVFilterGraph
*
filter_graph
;
static
int
video_stream_index
=
-
1
;
static
int64_t
last_pts
=
AV_NOPTS_VALUE
;
static
int
open_input_file
(
const
char
*
filename
)
{
int
ret
,
i
;
AVCodec
*
dec
;
if
((
ret
=
avformat_open_input
(
&
fmt_ctx
,
filename
,
NULL
,
NULL
))
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot open input file
\n
"
);
return
ret
;
}
if
((
ret
=
av_find_stream_info
(
fmt_ctx
))
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot find stream information
\n
"
);
return
ret
;
}
/* select the video stream */
ret
=
av_find_best_stream
(
fmt_ctx
,
AVMEDIA_TYPE_VIDEO
,
-
1
,
-
1
,
&
dec
,
0
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot find a video stream in the input file
\n
"
);
return
ret
;
}
video_stream_index
=
ret
;
dec_ctx
=
fmt_ctx
->
streams
[
video_stream_index
]
->
codec
;
/* init the video decoder */
if
((
ret
=
avcodec_open
(
dec_ctx
,
dec
))
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot open video decoder
\n
"
);
return
ret
;
}
return
0
;
}
static
int
init_filters
(
const
char
*
filters_descr
)
{
char
args
[
512
];
int
ret
;
AVFilter
*
buffersrc
=
avfilter_get_by_name
(
"buffer"
);
AVFilter
*
buffersink
=
avfilter_get_by_name
(
"buffersink"
);
AVFilterInOut
*
outputs
=
avfilter_inout_alloc
();
AVFilterInOut
*
inputs
=
avfilter_inout_alloc
();
enum
PixelFormat
pix_fmts
[]
=
{
PIX_FMT_GRAY8
,
PIX_FMT_NONE
};
filter_graph
=
avfilter_graph_alloc
();
/* buffer video source: the decoded frames from the decoder will be inserted here. */
snprintf
(
args
,
sizeof
(
args
),
"%d:%d:%d:%d:%d:%d:%d"
,
dec_ctx
->
width
,
dec_ctx
->
height
,
dec_ctx
->
pix_fmt
,
dec_ctx
->
time_base
.
num
,
dec_ctx
->
time_base
.
den
,
dec_ctx
->
sample_aspect_ratio
.
num
,
dec_ctx
->
sample_aspect_ratio
.
den
);
ret
=
avfilter_graph_create_filter
(
&
buffersrc_ctx
,
buffersrc
,
"in"
,
args
,
NULL
,
filter_graph
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot create buffer source
\n
"
);
return
ret
;
}
/* buffer video sink: to terminate the filter chain. */
ret
=
avfilter_graph_create_filter
(
&
buffersink_ctx
,
buffersink
,
"out"
,
NULL
,
pix_fmts
,
filter_graph
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot create buffer sink
\n
"
);
return
ret
;
}
/* Endpoints for the filter graph. */
outputs
->
name
=
av_strdup
(
"in"
);
outputs
->
filter_ctx
=
buffersrc_ctx
;
outputs
->
pad_idx
=
0
;
outputs
->
next
=
NULL
;
inputs
->
name
=
av_strdup
(
"out"
);
inputs
->
filter_ctx
=
buffersink_ctx
;
inputs
->
pad_idx
=
0
;
inputs
->
next
=
NULL
;
if
((
ret
=
avfilter_graph_parse
(
filter_graph
,
filter_descr
,
&
inputs
,
&
outputs
,
NULL
))
<
0
)
return
ret
;
if
((
ret
=
avfilter_graph_config
(
filter_graph
,
NULL
))
<
0
)
return
ret
;
}
static
void
display_picref
(
AVFilterBufferRef
*
picref
,
AVRational
time_base
)
{
int
x
,
y
;
uint8_t
*
p0
,
*
p
;
int64_t
delay
;
if
(
picref
->
pts
!=
AV_NOPTS_VALUE
)
{
if
(
last_pts
!=
AV_NOPTS_VALUE
)
{
/* sleep roughly the right amount of time;
* usleep is in microseconds, just like AV_TIME_BASE. */
delay
=
av_rescale_q
(
picref
->
pts
-
last_pts
,
time_base
,
AV_TIME_BASE_Q
);
if
(
delay
>
0
&&
delay
<
1000000
)
usleep
(
delay
);
}
last_pts
=
picref
->
pts
;
}
/* Trivial ASCII grayscale display. */
p0
=
picref
->
data
[
0
];
puts
(
"
\033
c"
);
for
(
y
=
0
;
y
<
picref
->
video
->
h
;
y
++
)
{
p
=
p0
;
for
(
x
=
0
;
x
<
picref
->
video
->
w
;
x
++
)
putchar
(
" .-+#"
[
*
(
p
++
)
/
52
]);
putchar
(
'\n'
);
p0
+=
picref
->
linesize
[
0
];
}
fflush
(
stdout
);
}
int
main
(
int
argc
,
char
**
argv
)
{
int
ret
;
AVPacket
packet
;
AVFrame
frame
;
int
got_frame
;
if
(
argc
!=
2
)
{
fprintf
(
stderr
,
"Usage: %s file
\n
"
,
argv
[
0
]);
exit
(
1
);
}
avcodec_register_all
();
av_register_all
();
avfilter_register_all
();
if
((
ret
=
open_input_file
(
argv
[
1
])
<
0
))
goto
end
;
if
((
ret
=
init_filters
(
filter_descr
))
<
0
)
goto
end
;
/* read all packets */
while
(
1
)
{
AVFilterBufferRef
*
picref
;
if
((
ret
=
av_read_frame
(
fmt_ctx
,
&
packet
))
<
0
)
break
;
if
(
packet
.
stream_index
==
video_stream_index
)
{
avcodec_get_frame_defaults
(
&
frame
);
got_frame
=
0
;
ret
=
avcodec_decode_video2
(
dec_ctx
,
&
frame
,
&
got_frame
,
&
packet
);
av_free_packet
(
&
packet
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error decoding video
\n
"
);
break
;
}
if
(
got_frame
)
{
if
(
frame
.
pts
==
AV_NOPTS_VALUE
)
frame
.
pts
=
frame
.
pkt_dts
==
AV_NOPTS_VALUE
?
frame
.
pkt_dts
:
frame
.
pkt_pts
;
/* push the decoded frame into the filtergraph */
av_vsrc_buffer_add_frame
(
buffersrc_ctx
,
&
frame
);
/* pull filtered pictures from the filtergraph */
while
(
avfilter_poll_frame
(
buffersink_ctx
->
inputs
[
0
]))
{
av_vsink_buffer_get_video_buffer_ref
(
buffersink_ctx
,
&
picref
,
0
);
if
(
picref
)
{
display_picref
(
picref
,
buffersink_ctx
->
inputs
[
0
]
->
time_base
);
avfilter_unref_buffer
(
picref
);
}
}
}
}
}
end:
avfilter_graph_free
(
&
filter_graph
);
if
(
dec_ctx
)
avcodec_close
(
dec_ctx
);
av_close_input_file
(
fmt_ctx
);
if
(
ret
<
0
&&
ret
!=
AVERROR_EOF
)
{
char
buf
[
1024
];
av_strerror
(
ret
,
buf
,
sizeof
(
buf
));
fprintf
(
stderr
,
"Error occurred: %s
\n
"
,
buf
);
exit
(
1
);
}
exit
(
0
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment