Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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="
"
EXAMPLE_LIST
=
"
avcodec_example
decode_audio_example
decode_video_example
encode_audio_example
encode_video_example
filter_audio_example
metadata_example
output_example
...
...
@@ -2436,9 +2437,10 @@ scale_qsv_filter_deps="libmfx"
scale_vaapi_filter_deps
=
"vaapi VAProcPipelineParameterBuffer"
# examples
avcodec_example_deps
=
"avcodec avutil"
decode_audio_example_deps
=
"avcodec avutil"
decode_video_example_deps
=
"avcodec avutil"
encode_audio_example_deps
=
"avcodec avutil"
encode_video_example_deps
=
"avcodec avutil"
filter_audio_example_deps
=
"avfilter avutil"
metadata_example_deps
=
"avformat avutil"
output_example_deps
=
"avcodec avformat avutil swscale"
...
...
doc/Makefile
View file @
7b1f0347
...
...
@@ -16,16 +16,22 @@ DOCS-$(CONFIG_POD2MAN) += $(MANPAGES) $(PODPAGES)
DOCS-$(CONFIG_TEXI2HTML)
+=
$(HTMLPAGES)
DOCS
=
$
(
DOCS-yes
)
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE)
+=
avcodec
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_VIDEO_EXAMPLE)
+=
encode_video
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE)
+=
filter_audio
DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE)
+=
metadata
DOC_EXAMPLES-$(CONFIG_OUTPUT_EXAMPLE)
+=
output
DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE)
+=
qsvdec
DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE)
+=
transcode_aac
ALL_DOC_EXAMPLES
=
avcodec decode_audio encode_audio filter_audio metadata
\
output transcode_aac
ALL_DOC_EXAMPLES
=
decode_audio
\
decode_video
\
encode_audio
\
encode_video
\
filter_audio
\
metadata output
\
transcode_aac
\
DOC_EXAMPLES
:=
$
(
DOC_EXAMPLES-yes:%
=
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 @@
/**
* @file
*
libavcodec API use example.
*
video decoding with libavcodec API example
*
* @example avcodec.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.
* @example decode_video.c
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavcodec/avcodec.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/imgutils.h"
#include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"
#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
,
char
*
filename
)
{
...
...
@@ -186,8 +50,9 @@ static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
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
;
AVCodecContext
*
c
=
NULL
;
int
frame
,
got_picture
,
len
;
...
...
@@ -197,13 +62,20 @@ static void video_decode_example(const char *outfilename, const char *filename)
char
buf
[
1024
];
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
);
/* 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
);
printf
(
"Video decoding
\n
"
);
/* find the MPEG-1 video decoder */
codec
=
avcodec_find_decoder
(
AV_CODEC_ID_MPEG1VIDEO
);
if
(
!
codec
)
{
...
...
@@ -301,24 +173,6 @@ static void video_decode_example(const char *outfilename, const char *filename)
avcodec_free_context
(
&
c
);
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
;
}
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