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
afd8a395
Commit
afd8a395
authored
Mar 30, 2012
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
output-example: K&R formatting cosmetics, comment spelling fixes
parent
93f6d047
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
100 additions
and
97 deletions
+100
-97
output-example.c
libavformat/output-example.c
+100
-97
No files found.
libavformat/output-example.c
View file @
afd8a395
...
@@ -86,7 +86,7 @@ static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
...
@@ -86,7 +86,7 @@ static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
c
->
channels
=
2
;
c
->
channels
=
2
;
// some formats want stream headers to be separate
// some formats want stream headers to be separate
if
(
oc
->
oformat
->
flags
&
AVFMT_GLOBALHEADER
)
if
(
oc
->
oformat
->
flags
&
AVFMT_GLOBALHEADER
)
c
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
c
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
return
st
;
return
st
;
...
@@ -114,21 +114,22 @@ static void open_audio(AVFormatContext *oc, AVStream *st)
...
@@ -114,21 +114,22 @@ static void open_audio(AVFormatContext *oc, AVStream *st)
audio_input_frame_size
=
10000
;
audio_input_frame_size
=
10000
;
else
else
audio_input_frame_size
=
c
->
frame_size
;
audio_input_frame_size
=
c
->
frame_size
;
samples
=
av_malloc
(
audio_input_frame_size
*
av_get_bytes_per_sample
(
c
->
sample_fmt
)
samples
=
av_malloc
(
audio_input_frame_size
*
*
c
->
channels
);
av_get_bytes_per_sample
(
c
->
sample_fmt
)
*
c
->
channels
);
}
}
/*
p
repare a 16 bit dummy audio frame of 'frame_size' samples and
/*
P
repare a 16 bit dummy audio frame of 'frame_size' samples and
'nb_channels' channels
*/
* 'nb_channels' channels.
*/
static
void
get_audio_frame
(
int16_t
*
samples
,
int
frame_size
,
int
nb_channels
)
static
void
get_audio_frame
(
int16_t
*
samples
,
int
frame_size
,
int
nb_channels
)
{
{
int
j
,
i
,
v
;
int
j
,
i
,
v
;
int16_t
*
q
;
int16_t
*
q
;
q
=
samples
;
q
=
samples
;
for
(
j
=
0
;
j
<
frame_size
;
j
++
)
{
for
(
j
=
0
;
j
<
frame_size
;
j
++
)
{
v
=
(
int
)(
sin
(
t
)
*
10000
);
v
=
(
int
)(
sin
(
t
)
*
10000
);
for
(
i
=
0
;
i
<
nb_channels
;
i
++
)
for
(
i
=
0
;
i
<
nb_channels
;
i
++
)
*
q
++
=
v
;
*
q
++
=
v
;
t
+=
tincr
;
t
+=
tincr
;
tincr
+=
tincr2
;
tincr
+=
tincr2
;
...
@@ -147,17 +148,19 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
...
@@ -147,17 +148,19 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
get_audio_frame
(
samples
,
audio_input_frame_size
,
c
->
channels
);
get_audio_frame
(
samples
,
audio_input_frame_size
,
c
->
channels
);
frame
->
nb_samples
=
audio_input_frame_size
;
frame
->
nb_samples
=
audio_input_frame_size
;
avcodec_fill_audio_frame
(
frame
,
c
->
channels
,
c
->
sample_fmt
,
(
uint8_t
*
)
samples
,
avcodec_fill_audio_frame
(
frame
,
c
->
channels
,
c
->
sample_fmt
,
audio_input_frame_size
*
av_get_bytes_per_sample
(
c
->
sample_fmt
)
(
uint8_t
*
)
samples
,
*
c
->
channels
,
1
);
audio_input_frame_size
*
av_get_bytes_per_sample
(
c
->
sample_fmt
)
*
c
->
channels
,
1
);
avcodec_encode_audio2
(
c
,
&
pkt
,
frame
,
&
got_packet
);
avcodec_encode_audio2
(
c
,
&
pkt
,
frame
,
&
got_packet
);
if
(
!
got_packet
)
if
(
!
got_packet
)
return
;
return
;
pkt
.
stream_index
=
st
->
index
;
pkt
.
stream_index
=
st
->
index
;
/*
write the compressed frame in the media file
*/
/*
Write the compressed frame to the media file.
*/
if
(
av_interleaved_write_frame
(
oc
,
&
pkt
)
!=
0
)
{
if
(
av_interleaved_write_frame
(
oc
,
&
pkt
)
!=
0
)
{
fprintf
(
stderr
,
"Error while writing audio frame
\n
"
);
fprintf
(
stderr
,
"Error while writing audio frame
\n
"
);
exit
(
1
);
exit
(
1
);
...
@@ -178,7 +181,7 @@ static AVFrame *picture, *tmp_picture;
...
@@ -178,7 +181,7 @@ static AVFrame *picture, *tmp_picture;
static
uint8_t
*
video_outbuf
;
static
uint8_t
*
video_outbuf
;
static
int
frame_count
,
video_outbuf_size
;
static
int
frame_count
,
video_outbuf_size
;
/*
add a video output stream
*/
/*
Add a video output stream.
*/
static
AVStream
*
add_video_stream
(
AVFormatContext
*
oc
,
enum
CodecID
codec_id
)
static
AVStream
*
add_video_stream
(
AVFormatContext
*
oc
,
enum
CodecID
codec_id
)
{
{
AVCodecContext
*
c
;
AVCodecContext
*
c
;
...
@@ -200,15 +203,15 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
...
@@ -200,15 +203,15 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
c
=
st
->
codec
;
c
=
st
->
codec
;
/*
put sample parameters
*/
/*
Put sample parameters.
*/
c
->
bit_rate
=
400000
;
c
->
bit_rate
=
400000
;
/*
resolution must be a multiple of two
*/
/*
Resolution must be a multiple of two.
*/
c
->
width
=
352
;
c
->
width
=
352
;
c
->
height
=
288
;
c
->
height
=
288
;
/* time
base: t
his is the fundamental unit of time (in seconds) in terms
/* time
base: T
his is the fundamental unit of time (in seconds) in terms
of which frame timestamps are represented. f
or fixed-fps content,
* of which frame timestamps are represented. F
or fixed-fps content,
timebase should be 1/framerate and timestamp increments should be
*
timebase should be 1/framerate and timestamp increments should be
identically
1. */
* identical to
1. */
c
->
time_base
.
den
=
STREAM_FRAME_RATE
;
c
->
time_base
.
den
=
STREAM_FRAME_RATE
;
c
->
time_base
.
num
=
1
;
c
->
time_base
.
num
=
1
;
c
->
gop_size
=
12
;
/* emit one intra frame every twelve frames at most */
c
->
gop_size
=
12
;
/* emit one intra frame every twelve frames at most */
...
@@ -217,14 +220,14 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
...
@@ -217,14 +220,14 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
/* just for testing, we also add B frames */
/* just for testing, we also add B frames */
c
->
max_b_frames
=
2
;
c
->
max_b_frames
=
2
;
}
}
if
(
c
->
codec_id
==
CODEC_ID_MPEG1VIDEO
){
if
(
c
->
codec_id
==
CODEC_ID_MPEG1VIDEO
)
{
/* Needed to avoid using macroblocks in which some coeffs overflow.
/* Needed to avoid using macroblocks in which some coeffs overflow.
This does not happen with normal video, it just happens here as
*
This does not happen with normal video, it just happens here as
the motion of the chroma plane does not match the luma plane. */
*
the motion of the chroma plane does not match the luma plane. */
c
->
mb_decision
=
2
;
c
->
mb_decision
=
2
;
}
}
/
/ some formats want stream headers to be separate
/
* Some formats want stream headers to be separate. */
if
(
oc
->
oformat
->
flags
&
AVFMT_GLOBALHEADER
)
if
(
oc
->
oformat
->
flags
&
AVFMT_GLOBALHEADER
)
c
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
c
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
return
st
;
return
st
;
...
@@ -264,26 +267,26 @@ static void open_video(AVFormatContext *oc, AVStream *st)
...
@@ -264,26 +267,26 @@ static void open_video(AVFormatContext *oc, AVStream *st)
video_outbuf
=
NULL
;
video_outbuf
=
NULL
;
if
(
!
(
oc
->
oformat
->
flags
&
AVFMT_RAWPICTURE
))
{
if
(
!
(
oc
->
oformat
->
flags
&
AVFMT_RAWPICTURE
))
{
/*
allocate output buffer
*/
/*
Allocate output buffer.
*/
/* XXX: API change will be done */
/* XXX: API change will be done
.
*/
/*
b
uffers passed into lav* can be allocated any way you prefer,
/*
B
uffers passed into lav* can be allocated any way you prefer,
as long as they're aligned enough for the architecture, and
*
as long as they're aligned enough for the architecture, and
they're freed appropriately (such as using av_free for buffers
*
they're freed appropriately (such as using av_free for buffers
allocated with av_malloc)
*/
* allocated with av_malloc).
*/
video_outbuf_size
=
200000
;
video_outbuf_size
=
200000
;
video_outbuf
=
av_malloc
(
video_outbuf_size
);
video_outbuf
=
av_malloc
(
video_outbuf_size
);
}
}
/*
allocate the encoded raw picture
*/
/*
Allocate the encoded raw picture.
*/
picture
=
alloc_picture
(
c
->
pix_fmt
,
c
->
width
,
c
->
height
);
picture
=
alloc_picture
(
c
->
pix_fmt
,
c
->
width
,
c
->
height
);
if
(
!
picture
)
{
if
(
!
picture
)
{
fprintf
(
stderr
,
"Could not allocate picture
\n
"
);
fprintf
(
stderr
,
"Could not allocate picture
\n
"
);
exit
(
1
);
exit
(
1
);
}
}
/*
i
f the output format is not YUV420P, then a temporary YUV420P
/*
I
f the output format is not YUV420P, then a temporary YUV420P
picture is needed too. It is then converted to the required
*
picture is needed too. It is then converted to the required
output format
*/
* output format.
*/
tmp_picture
=
NULL
;
tmp_picture
=
NULL
;
if
(
c
->
pix_fmt
!=
PIX_FMT_YUV420P
)
{
if
(
c
->
pix_fmt
!=
PIX_FMT_YUV420P
)
{
tmp_picture
=
alloc_picture
(
PIX_FMT_YUV420P
,
c
->
width
,
c
->
height
);
tmp_picture
=
alloc_picture
(
PIX_FMT_YUV420P
,
c
->
width
,
c
->
height
);
...
@@ -294,23 +297,22 @@ static void open_video(AVFormatContext *oc, AVStream *st)
...
@@ -294,23 +297,22 @@ static void open_video(AVFormatContext *oc, AVStream *st)
}
}
}
}
/* prepare a dummy image */
/* Prepare a dummy image. */
static
void
fill_yuv_image
(
AVFrame
*
pict
,
int
frame_index
,
int
width
,
int
height
)
static
void
fill_yuv_image
(
AVFrame
*
pict
,
int
frame_index
,
int
width
,
int
height
)
{
{
int
x
,
y
,
i
;
int
x
,
y
,
i
;
i
=
frame_index
;
i
=
frame_index
;
/* Y */
/* Y */
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
y
=
0
;
y
<
height
;
y
++
)
for
(
x
=
0
;
x
<
width
;
x
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
pict
->
data
[
0
][
y
*
pict
->
linesize
[
0
]
+
x
]
=
x
+
y
+
i
*
3
;
pict
->
data
[
0
][
y
*
pict
->
linesize
[
0
]
+
x
]
=
x
+
y
+
i
*
3
;
}
}
/* Cb and Cr */
/* Cb and Cr */
for
(
y
=
0
;
y
<
height
/
2
;
y
++
)
{
for
(
y
=
0
;
y
<
height
/
2
;
y
++
)
{
for
(
x
=
0
;
x
<
width
/
2
;
x
++
)
{
for
(
x
=
0
;
x
<
width
/
2
;
x
++
)
{
pict
->
data
[
1
][
y
*
pict
->
linesize
[
1
]
+
x
]
=
128
+
y
+
i
*
2
;
pict
->
data
[
1
][
y
*
pict
->
linesize
[
1
]
+
x
]
=
128
+
y
+
i
*
2
;
pict
->
data
[
2
][
y
*
pict
->
linesize
[
2
]
+
x
]
=
64
+
x
+
i
*
5
;
pict
->
data
[
2
][
y
*
pict
->
linesize
[
2
]
+
x
]
=
64
+
x
+
i
*
5
;
}
}
...
@@ -326,13 +328,13 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
...
@@ -326,13 +328,13 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
c
=
st
->
codec
;
c
=
st
->
codec
;
if
(
frame_count
>=
STREAM_NB_FRAMES
)
{
if
(
frame_count
>=
STREAM_NB_FRAMES
)
{
/*
no more frame
to compress. The codec has a latency of a few
/*
No more frames
to compress. The codec has a latency of a few
frames if using B
frames, so we get the last frames by
* frames if using B-
frames, so we get the last frames by
passing the same picture again
*/
* passing the same picture again.
*/
}
else
{
}
else
{
if
(
c
->
pix_fmt
!=
PIX_FMT_YUV420P
)
{
if
(
c
->
pix_fmt
!=
PIX_FMT_YUV420P
)
{
/* as we only generate a YUV420P picture, we must convert it
/* as we only generate a YUV420P picture, we must convert it
to the codec pixel format if needed */
*
to the codec pixel format if needed */
if
(
img_convert_ctx
==
NULL
)
{
if
(
img_convert_ctx
==
NULL
)
{
img_convert_ctx
=
sws_getContext
(
c
->
width
,
c
->
height
,
img_convert_ctx
=
sws_getContext
(
c
->
width
,
c
->
height
,
PIX_FMT_YUV420P
,
PIX_FMT_YUV420P
,
...
@@ -340,7 +342,8 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
...
@@ -340,7 +342,8 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
c
->
pix_fmt
,
c
->
pix_fmt
,
sws_flags
,
NULL
,
NULL
,
NULL
);
sws_flags
,
NULL
,
NULL
,
NULL
);
if
(
img_convert_ctx
==
NULL
)
{
if
(
img_convert_ctx
==
NULL
)
{
fprintf
(
stderr
,
"Cannot initialize the conversion context
\n
"
);
fprintf
(
stderr
,
"Cannot initialize the conversion context
\n
"
);
exit
(
1
);
exit
(
1
);
}
}
}
}
...
@@ -352,36 +355,37 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
...
@@ -352,36 +355,37 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
}
}
}
}
if
(
oc
->
oformat
->
flags
&
AVFMT_RAWPICTURE
)
{
if
(
oc
->
oformat
->
flags
&
AVFMT_RAWPICTURE
)
{
/*
raw video case. T
he API will change slightly in the near
/*
Raw video case - t
he API will change slightly in the near
futur for that
*/
* future for that.
*/
AVPacket
pkt
;
AVPacket
pkt
;
av_init_packet
(
&
pkt
);
av_init_packet
(
&
pkt
);
pkt
.
flags
|=
AV_PKT_FLAG_KEY
;
pkt
.
flags
|=
AV_PKT_FLAG_KEY
;
pkt
.
stream_index
=
st
->
index
;
pkt
.
stream_index
=
st
->
index
;
pkt
.
data
=
(
uint8_t
*
)
picture
;
pkt
.
data
=
(
uint8_t
*
)
picture
;
pkt
.
size
=
sizeof
(
AVPicture
);
pkt
.
size
=
sizeof
(
AVPicture
);
ret
=
av_interleaved_write_frame
(
oc
,
&
pkt
);
ret
=
av_interleaved_write_frame
(
oc
,
&
pkt
);
}
else
{
}
else
{
/* encode the image */
/* encode the image */
out_size
=
avcodec_encode_video
(
c
,
video_outbuf
,
video_outbuf_size
,
picture
);
out_size
=
avcodec_encode_video
(
c
,
video_outbuf
,
/* if zero size, it means the image was buffered */
video_outbuf_size
,
picture
);
/* If size is zero, it means the image was buffered. */
if
(
out_size
>
0
)
{
if
(
out_size
>
0
)
{
AVPacket
pkt
;
AVPacket
pkt
;
av_init_packet
(
&
pkt
);
av_init_packet
(
&
pkt
);
if
(
c
->
coded_frame
->
pts
!=
AV_NOPTS_VALUE
)
if
(
c
->
coded_frame
->
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
=
av_rescale_q
(
c
->
coded_frame
->
pts
,
c
->
time_base
,
st
->
time_base
);
pkt
.
pts
=
av_rescale_q
(
c
->
coded_frame
->
pts
,
if
(
c
->
coded_frame
->
key_frame
)
c
->
time_base
,
st
->
time_base
);
if
(
c
->
coded_frame
->
key_frame
)
pkt
.
flags
|=
AV_PKT_FLAG_KEY
;
pkt
.
flags
|=
AV_PKT_FLAG_KEY
;
pkt
.
stream_index
=
st
->
index
;
pkt
.
stream_index
=
st
->
index
;
pkt
.
data
=
video_outbuf
;
pkt
.
data
=
video_outbuf
;
pkt
.
size
=
out_size
;
pkt
.
size
=
out_size
;
/*
write the compressed frame in the media file
*/
/*
Write the compressed frame to the media file.
*/
ret
=
av_interleaved_write_frame
(
oc
,
&
pkt
);
ret
=
av_interleaved_write_frame
(
oc
,
&
pkt
);
}
else
{
}
else
{
ret
=
0
;
ret
=
0
;
...
@@ -418,7 +422,7 @@ int main(int argc, char **argv)
...
@@ -418,7 +422,7 @@ int main(int argc, char **argv)
double
audio_pts
,
video_pts
;
double
audio_pts
,
video_pts
;
int
i
;
int
i
;
/*
initialize libavcodec, and register all codecs and formats
*/
/*
Initialize libavcodec, and register all codecs and formats.
*/
av_register_all
();
av_register_all
();
if
(
argc
!=
2
)
{
if
(
argc
!=
2
)
{
...
@@ -432,8 +436,7 @@ int main(int argc, char **argv)
...
@@ -432,8 +436,7 @@ int main(int argc, char **argv)
filename
=
argv
[
1
];
filename
=
argv
[
1
];
/* auto detect the output format from the name. default is
/* Autodetect the output format from the name. default is MPEG. */
mpeg. */
fmt
=
av_guess_format
(
NULL
,
filename
,
NULL
);
fmt
=
av_guess_format
(
NULL
,
filename
,
NULL
);
if
(
!
fmt
)
{
if
(
!
fmt
)
{
printf
(
"Could not deduce output format from file extension: using MPEG.
\n
"
);
printf
(
"Could not deduce output format from file extension: using MPEG.
\n
"
);
...
@@ -444,7 +447,7 @@ int main(int argc, char **argv)
...
@@ -444,7 +447,7 @@ int main(int argc, char **argv)
return
1
;
return
1
;
}
}
/*
allocate the output media context
*/
/*
Allocate the output media context.
*/
oc
=
avformat_alloc_context
();
oc
=
avformat_alloc_context
();
if
(
!
oc
)
{
if
(
!
oc
)
{
fprintf
(
stderr
,
"Memory error
\n
"
);
fprintf
(
stderr
,
"Memory error
\n
"
);
...
@@ -453,8 +456,8 @@ int main(int argc, char **argv)
...
@@ -453,8 +456,8 @@ int main(int argc, char **argv)
oc
->
oformat
=
fmt
;
oc
->
oformat
=
fmt
;
snprintf
(
oc
->
filename
,
sizeof
(
oc
->
filename
),
"%s"
,
filename
);
snprintf
(
oc
->
filename
,
sizeof
(
oc
->
filename
),
"%s"
,
filename
);
/*
a
dd the audio and video streams using the default format codecs
/*
A
dd the audio and video streams using the default format codecs
and initialize the codecs
*/
* and initialize the codecs.
*/
video_st
=
NULL
;
video_st
=
NULL
;
audio_st
=
NULL
;
audio_st
=
NULL
;
if
(
fmt
->
video_codec
!=
CODEC_ID_NONE
)
{
if
(
fmt
->
video_codec
!=
CODEC_ID_NONE
)
{
...
@@ -464,8 +467,8 @@ int main(int argc, char **argv)
...
@@ -464,8 +467,8 @@ int main(int argc, char **argv)
audio_st
=
add_audio_stream
(
oc
,
fmt
->
audio_codec
);
audio_st
=
add_audio_stream
(
oc
,
fmt
->
audio_codec
);
}
}
/*
n
ow that all the parameters are set, we can open the audio and
/*
N
ow that all the parameters are set, we can open the audio and
video codecs and allocate the necessary encode buffers
*/
* video codecs and allocate the necessary encode buffers.
*/
if
(
video_st
)
if
(
video_st
)
open_video
(
oc
,
video_st
);
open_video
(
oc
,
video_st
);
if
(
audio_st
)
if
(
audio_st
)
...
@@ -481,18 +484,19 @@ int main(int argc, char **argv)
...
@@ -481,18 +484,19 @@ int main(int argc, char **argv)
}
}
}
}
/*
write the stream header, if any
*/
/*
Write the stream header, if any.
*/
avformat_write_header
(
oc
,
NULL
);
avformat_write_header
(
oc
,
NULL
);
for
(;;)
{
for
(;;)
{
/*
compute current audio and video time
*/
/*
Compute current audio and video time.
*/
if
(
audio_st
)
if
(
audio_st
)
audio_pts
=
(
double
)
audio_st
->
pts
.
val
*
audio_st
->
time_base
.
num
/
audio_st
->
time_base
.
den
;
audio_pts
=
(
double
)
audio_st
->
pts
.
val
*
audio_st
->
time_base
.
num
/
audio_st
->
time_base
.
den
;
else
else
audio_pts
=
0
.
0
;
audio_pts
=
0
.
0
;
if
(
video_st
)
if
(
video_st
)
video_pts
=
(
double
)
video_st
->
pts
.
val
*
video_st
->
time_base
.
num
/
video_st
->
time_base
.
den
;
video_pts
=
(
double
)
video_st
->
pts
.
val
*
video_st
->
time_base
.
num
/
video_st
->
time_base
.
den
;
else
else
video_pts
=
0
.
0
;
video_pts
=
0
.
0
;
...
@@ -508,28 +512,27 @@ int main(int argc, char **argv)
...
@@ -508,28 +512,27 @@ int main(int argc, char **argv)
}
}
}
}
/*
write the trailer, if any. the trailer must be written
/*
Write the trailer, if any. The trailer must be written before you
*
before you close the CodecContexts open when you wrote th
e
*
close the CodecContexts open when you wrote the header; otherwis
e
*
header; otherwise write_trailer may try to use memory that
*
av_write_trailer() may try to use memory that was freed on
*
was freed on av_codec_close()
*/
*
av_codec_close().
*/
av_write_trailer
(
oc
);
av_write_trailer
(
oc
);
/*
close each codec
*/
/*
Close each codec.
*/
if
(
video_st
)
if
(
video_st
)
close_video
(
oc
,
video_st
);
close_video
(
oc
,
video_st
);
if
(
audio_st
)
if
(
audio_st
)
close_audio
(
oc
,
audio_st
);
close_audio
(
oc
,
audio_st
);
/*
free the streams
*/
/*
Free the streams.
*/
for
(
i
=
0
;
i
<
oc
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
oc
->
nb_streams
;
i
++
)
{
av_freep
(
&
oc
->
streams
[
i
]
->
codec
);
av_freep
(
&
oc
->
streams
[
i
]
->
codec
);
av_freep
(
&
oc
->
streams
[
i
]);
av_freep
(
&
oc
->
streams
[
i
]);
}
}
if
(
!
(
fmt
->
flags
&
AVFMT_NOFILE
))
{
if
(
!
(
fmt
->
flags
&
AVFMT_NOFILE
))
/*
close the output file
*/
/*
Close the output file.
*/
avio_close
(
oc
->
pb
);
avio_close
(
oc
->
pb
);
}
/* free the stream */
/* free the stream */
av_free
(
oc
);
av_free
(
oc
);
...
...
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