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
7b1f0347
Commit
7b1f0347
authored
Oct 19, 2016
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
examples/avcodec: split the remaining two examples into separate files
parent
90265814
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
192 additions
and
166 deletions
+192
-166
configure
configure
+4
-2
Makefile
doc/Makefile
+9
-3
decode_video.c
doc/examples/decode_video.c
+15
-161
encode_video.c
doc/examples/encode_video.c
+164
-0
No files found.
configure
View file @
7b1f0347
...
@@ -1209,9 +1209,10 @@ COMPONENT_LIST="
...
@@ -1209,9 +1209,10 @@ COMPONENT_LIST="
"
"
EXAMPLE_LIST
=
"
EXAMPLE_LIST
=
"
avcodec_example
decode_audio_example
decode_audio_example
decode_video_example
encode_audio_example
encode_audio_example
encode_video_example
filter_audio_example
filter_audio_example
metadata_example
metadata_example
output_example
output_example
...
@@ -2436,9 +2437,10 @@ scale_qsv_filter_deps="libmfx"
...
@@ -2436,9 +2437,10 @@ scale_qsv_filter_deps="libmfx"
scale_vaapi_filter_deps
=
"vaapi VAProcPipelineParameterBuffer"
scale_vaapi_filter_deps
=
"vaapi VAProcPipelineParameterBuffer"
# examples
# examples
avcodec_example_deps
=
"avcodec avutil"
decode_audio_example_deps
=
"avcodec avutil"
decode_audio_example_deps
=
"avcodec avutil"
decode_video_example_deps
=
"avcodec avutil"
encode_audio_example_deps
=
"avcodec avutil"
encode_audio_example_deps
=
"avcodec avutil"
encode_video_example_deps
=
"avcodec avutil"
filter_audio_example_deps
=
"avfilter avutil"
filter_audio_example_deps
=
"avfilter avutil"
metadata_example_deps
=
"avformat avutil"
metadata_example_deps
=
"avformat avutil"
output_example_deps
=
"avcodec avformat avutil swscale"
output_example_deps
=
"avcodec avformat avutil swscale"
...
...
doc/Makefile
View file @
7b1f0347
...
@@ -16,16 +16,22 @@ DOCS-$(CONFIG_POD2MAN) += $(MANPAGES) $(PODPAGES)
...
@@ -16,16 +16,22 @@ DOCS-$(CONFIG_POD2MAN) += $(MANPAGES) $(PODPAGES)
DOCS-$(CONFIG_TEXI2HTML)
+=
$(HTMLPAGES)
DOCS-$(CONFIG_TEXI2HTML)
+=
$(HTMLPAGES)
DOCS
=
$
(
DOCS-yes
)
DOCS
=
$
(
DOCS-yes
)
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE)
+=
avcodec
DOC_EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE)
+=
decode_audio
DOC_EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE)
+=
decode_audio
DOC_EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE)
+=
decode_video
DOC_EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE)
+=
encode_audio
DOC_EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE)
+=
encode_audio
DOC_EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE)
+=
encode_video
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE)
+=
filter_audio
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE)
+=
filter_audio
DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE)
+=
metadata
DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE)
+=
metadata
DOC_EXAMPLES-$(CONFIG_OUTPUT_EXAMPLE)
+=
output
DOC_EXAMPLES-$(CONFIG_OUTPUT_EXAMPLE)
+=
output
DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE)
+=
qsvdec
DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE)
+=
qsvdec
DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE)
+=
transcode_aac
DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE)
+=
transcode_aac
ALL_DOC_EXAMPLES
=
avcodec decode_audio encode_audio filter_audio metadata
\
ALL_DOC_EXAMPLES
=
decode_audio
\
output transcode_aac
decode_video
\
encode_audio
\
encode_video
\
filter_audio
\
metadata output
\
transcode_aac
\
DOC_EXAMPLES
:=
$
(
DOC_EXAMPLES-yes:%
=
doc/examples/%
$(EXESUF)
)
DOC_EXAMPLES
:=
$
(
DOC_EXAMPLES-yes:%
=
doc/examples/%
$(EXESUF)
)
ALL_DOC_EXAMPLES
:=
$
(
ALL_DOC_EXAMPLES:%
=
doc/examples/%
$(EXESUF)
)
ALL_DOC_EXAMPLES
:=
$
(
ALL_DOC_EXAMPLES:%
=
doc/examples/%
$(EXESUF)
)
...
...
doc/examples/
avcodec
.c
→
doc/examples/
decode_video
.c
View file @
7b1f0347
...
@@ -20,159 +20,23 @@
...
@@ -20,159 +20,23 @@
/**
/**
* @file
* @file
*
libavcodec API use example.
*
video decoding with libavcodec API example
*
*
* @example avcodec.c
* @example decode_video.c
* Note that this library only handles codecs (MPEG, MPEG-4, etc...),
* not file formats (AVI, VOB, etc...). See library 'libavformat' for the
* format handling.
*/
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavcodec/avcodec.h"
#include "libavcodec/avcodec.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/common.h"
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "libavutil/mathematics.h"
#include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"
#define INBUF_SIZE 4096
#define INBUF_SIZE 4096
/*
* Video encoding example
*/
static
void
video_encode_example
(
const
char
*
filename
)
{
AVCodec
*
codec
;
AVCodecContext
*
c
=
NULL
;
int
i
,
ret
,
x
,
y
,
got_output
;
FILE
*
f
;
AVFrame
*
picture
;
AVPacket
pkt
;
uint8_t
endcode
[]
=
{
0
,
0
,
1
,
0xb7
};
printf
(
"Video encoding
\n
"
);
/* find the mpeg1video encoder */
codec
=
avcodec_find_encoder
(
AV_CODEC_ID_MPEG1VIDEO
);
if
(
!
codec
)
{
fprintf
(
stderr
,
"codec not found
\n
"
);
exit
(
1
);
}
c
=
avcodec_alloc_context3
(
codec
);
picture
=
av_frame_alloc
();
/* put sample parameters */
c
->
bit_rate
=
400000
;
/* resolution must be a multiple of two */
c
->
width
=
352
;
c
->
height
=
288
;
/* frames per second */
c
->
time_base
=
(
AVRational
){
1
,
25
};
c
->
gop_size
=
10
;
/* emit one intra frame every ten frames */
c
->
max_b_frames
=
1
;
c
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
/* open it */
if
(
avcodec_open2
(
c
,
codec
,
NULL
)
<
0
)
{
fprintf
(
stderr
,
"could not open codec
\n
"
);
exit
(
1
);
}
f
=
fopen
(
filename
,
"wb"
);
if
(
!
f
)
{
fprintf
(
stderr
,
"could not open %s
\n
"
,
filename
);
exit
(
1
);
}
ret
=
av_image_alloc
(
picture
->
data
,
picture
->
linesize
,
c
->
width
,
c
->
height
,
c
->
pix_fmt
,
32
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"could not alloc raw picture buffer
\n
"
);
exit
(
1
);
}
picture
->
format
=
c
->
pix_fmt
;
picture
->
width
=
c
->
width
;
picture
->
height
=
c
->
height
;
/* encode 1 second of video */
for
(
i
=
0
;
i
<
25
;
i
++
)
{
av_init_packet
(
&
pkt
);
pkt
.
data
=
NULL
;
// packet data will be allocated by the encoder
pkt
.
size
=
0
;
fflush
(
stdout
);
/* prepare a dummy image */
/* Y */
for
(
y
=
0
;
y
<
c
->
height
;
y
++
)
{
for
(
x
=
0
;
x
<
c
->
width
;
x
++
)
{
picture
->
data
[
0
][
y
*
picture
->
linesize
[
0
]
+
x
]
=
x
+
y
+
i
*
3
;
}
}
/* Cb and Cr */
for
(
y
=
0
;
y
<
c
->
height
/
2
;
y
++
)
{
for
(
x
=
0
;
x
<
c
->
width
/
2
;
x
++
)
{
picture
->
data
[
1
][
y
*
picture
->
linesize
[
1
]
+
x
]
=
128
+
y
+
i
*
2
;
picture
->
data
[
2
][
y
*
picture
->
linesize
[
2
]
+
x
]
=
64
+
x
+
i
*
5
;
}
}
picture
->
pts
=
i
;
/* encode the image */
ret
=
avcodec_encode_video2
(
c
,
&
pkt
,
picture
,
&
got_output
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"error encoding frame
\n
"
);
exit
(
1
);
}
if
(
got_output
)
{
printf
(
"encoding frame %3d (size=%5d)
\n
"
,
i
,
pkt
.
size
);
fwrite
(
pkt
.
data
,
1
,
pkt
.
size
,
f
);
av_packet_unref
(
&
pkt
);
}
}
/* get the delayed frames */
for
(
got_output
=
1
;
got_output
;
i
++
)
{
fflush
(
stdout
);
ret
=
avcodec_encode_video2
(
c
,
&
pkt
,
NULL
,
&
got_output
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"error encoding frame
\n
"
);
exit
(
1
);
}
if
(
got_output
)
{
printf
(
"encoding frame %3d (size=%5d)
\n
"
,
i
,
pkt
.
size
);
fwrite
(
pkt
.
data
,
1
,
pkt
.
size
,
f
);
av_packet_unref
(
&
pkt
);
}
}
/* add sequence end code to have a real MPEG file */
fwrite
(
endcode
,
1
,
sizeof
(
endcode
),
f
);
fclose
(
f
);
avcodec_free_context
(
&
c
);
av_freep
(
&
picture
->
data
[
0
]);
av_frame_free
(
&
picture
);
printf
(
"
\n
"
);
}
/*
* Video decoding example
*/
static
void
pgm_save
(
unsigned
char
*
buf
,
int
wrap
,
int
xsize
,
int
ysize
,
static
void
pgm_save
(
unsigned
char
*
buf
,
int
wrap
,
int
xsize
,
int
ysize
,
char
*
filename
)
char
*
filename
)
{
{
...
@@ -186,8 +50,9 @@ static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
...
@@ -186,8 +50,9 @@ static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
fclose
(
f
);
fclose
(
f
);
}
}
static
void
video_decode_example
(
const
char
*
outfilename
,
const
char
*
filename
)
int
main
(
int
argc
,
char
**
argv
)
{
{
const
char
*
filename
,
*
outfilename
;
AVCodec
*
codec
;
AVCodec
*
codec
;
AVCodecContext
*
c
=
NULL
;
AVCodecContext
*
c
=
NULL
;
int
frame
,
got_picture
,
len
;
int
frame
,
got_picture
,
len
;
...
@@ -197,13 +62,20 @@ static void video_decode_example(const char *outfilename, const char *filename)
...
@@ -197,13 +62,20 @@ static void video_decode_example(const char *outfilename, const char *filename)
char
buf
[
1024
];
char
buf
[
1024
];
AVPacket
avpkt
;
AVPacket
avpkt
;
if
(
argc
<=
2
)
{
fprintf
(
stderr
,
"Usage: %s <input file> <output file>
\n
"
,
argv
[
0
]);
exit
(
0
);
}
filename
=
argv
[
1
];
outfilename
=
argv
[
2
];
avcodec_register_all
();
av_init_packet
(
&
avpkt
);
av_init_packet
(
&
avpkt
);
/* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
/* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
memset
(
inbuf
+
INBUF_SIZE
,
0
,
AV_INPUT_BUFFER_PADDING_SIZE
);
memset
(
inbuf
+
INBUF_SIZE
,
0
,
AV_INPUT_BUFFER_PADDING_SIZE
);
printf
(
"Video decoding
\n
"
);
/* find the MPEG-1 video decoder */
/* find the MPEG-1 video decoder */
codec
=
avcodec_find_decoder
(
AV_CODEC_ID_MPEG1VIDEO
);
codec
=
avcodec_find_decoder
(
AV_CODEC_ID_MPEG1VIDEO
);
if
(
!
codec
)
{
if
(
!
codec
)
{
...
@@ -301,24 +173,6 @@ static void video_decode_example(const char *outfilename, const char *filename)
...
@@ -301,24 +173,6 @@ static void video_decode_example(const char *outfilename, const char *filename)
avcodec_free_context
(
&
c
);
avcodec_free_context
(
&
c
);
av_frame_free
(
&
picture
);
av_frame_free
(
&
picture
);
printf
(
"
\n
"
);
}
int
main
(
int
argc
,
char
**
argv
)
{
const
char
*
filename
;
/* register all the codecs */
avcodec_register_all
();
if
(
argc
<=
1
)
{
video_encode_example
(
"/tmp/test.mpg"
);
filename
=
"/tmp/test.mpg"
;
}
else
{
filename
=
argv
[
1
];
}
video_decode_example
(
"/tmp/test%d.pgm"
,
filename
);
return
0
;
return
0
;
}
}
doc/examples/encode_video.c
0 → 100644
View file @
7b1f0347
/*
* copyright (c) 2001 Fabrice Bellard
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* video encoding with libavcodec API example
*
* @example encode_video.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libavcodec/avcodec.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
int
main
(
int
argc
,
char
**
argv
)
{
const
char
*
filename
;
AVCodec
*
codec
;
AVCodecContext
*
c
=
NULL
;
int
i
,
ret
,
x
,
y
,
got_output
;
FILE
*
f
;
AVFrame
*
picture
;
AVPacket
pkt
;
uint8_t
endcode
[]
=
{
0
,
0
,
1
,
0xb7
};
if
(
argc
<=
1
)
{
fprintf
(
stderr
,
"Usage: %s <output file>
\n
"
,
argv
[
0
]);
exit
(
0
);
}
filename
=
argv
[
1
];
avcodec_register_all
();
/* find the mpeg1video encoder */
codec
=
avcodec_find_encoder
(
AV_CODEC_ID_MPEG1VIDEO
);
if
(
!
codec
)
{
fprintf
(
stderr
,
"codec not found
\n
"
);
exit
(
1
);
}
c
=
avcodec_alloc_context3
(
codec
);
picture
=
av_frame_alloc
();
/* put sample parameters */
c
->
bit_rate
=
400000
;
/* resolution must be a multiple of two */
c
->
width
=
352
;
c
->
height
=
288
;
/* frames per second */
c
->
time_base
=
(
AVRational
){
1
,
25
};
c
->
gop_size
=
10
;
/* emit one intra frame every ten frames */
c
->
max_b_frames
=
1
;
c
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
/* open it */
if
(
avcodec_open2
(
c
,
codec
,
NULL
)
<
0
)
{
fprintf
(
stderr
,
"could not open codec
\n
"
);
exit
(
1
);
}
f
=
fopen
(
filename
,
"wb"
);
if
(
!
f
)
{
fprintf
(
stderr
,
"could not open %s
\n
"
,
filename
);
exit
(
1
);
}
ret
=
av_image_alloc
(
picture
->
data
,
picture
->
linesize
,
c
->
width
,
c
->
height
,
c
->
pix_fmt
,
32
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"could not alloc raw picture buffer
\n
"
);
exit
(
1
);
}
picture
->
format
=
c
->
pix_fmt
;
picture
->
width
=
c
->
width
;
picture
->
height
=
c
->
height
;
/* encode 1 second of video */
for
(
i
=
0
;
i
<
25
;
i
++
)
{
av_init_packet
(
&
pkt
);
pkt
.
data
=
NULL
;
// packet data will be allocated by the encoder
pkt
.
size
=
0
;
fflush
(
stdout
);
/* prepare a dummy image */
/* Y */
for
(
y
=
0
;
y
<
c
->
height
;
y
++
)
{
for
(
x
=
0
;
x
<
c
->
width
;
x
++
)
{
picture
->
data
[
0
][
y
*
picture
->
linesize
[
0
]
+
x
]
=
x
+
y
+
i
*
3
;
}
}
/* Cb and Cr */
for
(
y
=
0
;
y
<
c
->
height
/
2
;
y
++
)
{
for
(
x
=
0
;
x
<
c
->
width
/
2
;
x
++
)
{
picture
->
data
[
1
][
y
*
picture
->
linesize
[
1
]
+
x
]
=
128
+
y
+
i
*
2
;
picture
->
data
[
2
][
y
*
picture
->
linesize
[
2
]
+
x
]
=
64
+
x
+
i
*
5
;
}
}
picture
->
pts
=
i
;
/* encode the image */
ret
=
avcodec_encode_video2
(
c
,
&
pkt
,
picture
,
&
got_output
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"error encoding frame
\n
"
);
exit
(
1
);
}
if
(
got_output
)
{
printf
(
"encoding frame %3d (size=%5d)
\n
"
,
i
,
pkt
.
size
);
fwrite
(
pkt
.
data
,
1
,
pkt
.
size
,
f
);
av_packet_unref
(
&
pkt
);
}
}
/* get the delayed frames */
for
(
got_output
=
1
;
got_output
;
i
++
)
{
fflush
(
stdout
);
ret
=
avcodec_encode_video2
(
c
,
&
pkt
,
NULL
,
&
got_output
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"error encoding frame
\n
"
);
exit
(
1
);
}
if
(
got_output
)
{
printf
(
"encoding frame %3d (size=%5d)
\n
"
,
i
,
pkt
.
size
);
fwrite
(
pkt
.
data
,
1
,
pkt
.
size
,
f
);
av_packet_unref
(
&
pkt
);
}
}
/* add sequence end code to have a real MPEG file */
fwrite
(
endcode
,
1
,
sizeof
(
endcode
),
f
);
fclose
(
f
);
avcodec_free_context
(
&
c
);
av_freep
(
&
picture
->
data
[
0
]);
av_frame_free
(
&
picture
);
return
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