Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
BC
public
external
libvpx
Commits
c761bd78
Commit
c761bd78
authored
11 years ago
by
Dmitry Kovalev
Committed by
Gerrit Code Review
11 years ago
Browse files
Options
Download
Plain Diff
Merge "Cleaning up {simple, twopass}_encoder examples."
parents
52c1550e
592936b4
v1.14.0-linphone
1.4.X
feature/update_to_v1.9.0-linphone
feature/uwp_nuget
frame_parallel
highbitdepth
indianrunnerduck
javanwhistlingduck
khakicampbell
linphone
linphone-android
linphone-old
longtailedduck
m49-2623
m52-2743
m54-2840
m56-2924
m66-3359
m68-3440
mandarinduck
nextgen
nextgenv2
playground
sandbox/Jingning/experimental
sandbox/Jingning/transcode
sandbox/Jingning/vpx
sandbox/aconverse@google.com/ansbench
sandbox/hkuang/frame_parallel
sandbox/hkuang@google.com/decode
sandbox/jimbankoski@google.com/proposed-aom
sandbox/jingning@google.com/decoder_test_suite
sandbox/jingning@google.com/experimental
sandbox/jzern@google.com/test
sandbox/wangch@google.com/vp9
sandbox/yaowu@google.com/mergeaom
v1.12.0-linphone
v1.6.1_linphone
v1.7.0-linphone
v1.9.0-linphone
v1.9.0
v1.9.0-rc1
v1.8.2
v1.8.1
v1.8.0
v1.7.0
v1.6.1
v1.6.0
v1.5.0
v1.4.0
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
examples.mk
+4
-0
examples.mk
examples/simple_encoder.c
+22
-39
examples/simple_encoder.c
examples/twopass_encoder.c
+145
-191
examples/twopass_encoder.c
tools_common.c
+22
-0
tools_common.c
tools_common.h
+4
-0
tools_common.h
with
197 additions
and
230 deletions
examples.mk
+
4
−
0
View file @
c761bd78
...
...
@@ -107,6 +107,10 @@ simple_encoder.SRCS += video_writer.h video_writer.c
simple_encoder.GUID
=
4607D299-8A71-4D2C-9B1D-071899B6FBFD
simple_encoder.DESCRIPTION
=
Simplified encoder loop
EXAMPLES-$(CONFIG_VP8_ENCODER)
+=
twopass_encoder.c
twopass_encoder.SRCS
+=
ivfenc.h ivfenc.c
twopass_encoder.SRCS
+=
tools_common.h tools_common.c
twopass_encoder.SRCS
+=
video_common.h
twopass_encoder.SRCS
+=
video_writer.h video_writer.c
twopass_encoder.GUID
=
73494FA6-4AF9-4763-8FBB-265C92402FD8
twopass_encoder.DESCRIPTION
=
Two-pass encoder loop
EXAMPLES-$(CONFIG_VP8_ENCODER)
+=
force_keyframe.c
...
...
This diff is collapsed.
Click to expand it.
examples/simple_encoder.c
+
22
−
39
View file @
c761bd78
...
...
@@ -86,7 +86,6 @@
#include
<string.h>
#define VPX_CODEC_DISABLE_COMPAT 1
#include
"vpx/vp8cx.h"
#include
"vpx/vpx_encoder.h"
...
...
@@ -102,33 +101,17 @@ void usage_exit() {
exit
(
EXIT_FAILURE
);
}
static
int
read_frame
(
FILE
*
f
,
vpx_image_t
*
img
)
{
int
res
=
1
;
size_t
to_read
=
img
->
w
*
img
->
h
*
3
/
2
;
size_t
nbytes
=
fread
(
img
->
planes
[
0
],
1
,
to_read
,
f
);
if
(
nbytes
!=
to_read
)
{
res
=
0
;
if
(
nbytes
>
0
)
printf
(
"Warning: Read partial frame. Check your width & height!
\n
"
);
}
return
res
;
}
static
int
is_valid_dimension
(
int
value
)
{
return
value
>=
16
&&
(
value
%
2
==
0
);
}
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
infile
;
FILE
*
infile
=
NULL
;
vpx_codec_ctx_t
codec
;
vpx_codec_enc_cfg_t
cfg
;
int
frame_count
=
0
;
vpx_image_t
raw
;
vpx_codec_err_t
res
;
VpxVideoInfo
info
;
VpxVideoWriter
*
writer
;
const
int
fps
=
30
;
// TODO(dkovalev) add command line argument
const
int
bitrate
=
1
00
;
// kbit/s TODO(dkovalev) add command line argument
VpxVideoInfo
info
=
{
0
}
;
VpxVideoWriter
*
writer
=
NULL
;
const
int
fps
=
30
;
// TODO(dkovalev) add command line argument
const
int
bitrate
=
2
00
;
// kbit/s TODO(dkovalev) add command line argument
exec_name
=
argv
[
0
];
...
...
@@ -141,21 +124,23 @@ int main(int argc, char **argv) {
info
.
time_base
.
numerator
=
1
;
info
.
time_base
.
denominator
=
fps
;
if
(
!
is_valid_dimension
(
info
.
frame_width
)
||
!
is_valid_dimension
(
info
.
frame_height
))
die
(
"Invalid resolution: %dx%d"
,
info
.
frame_width
,
info
.
frame_height
);
if
(
info
.
frame_width
<=
0
||
info
.
frame_height
<=
0
||
(
info
.
frame_width
%
2
)
!=
0
||
(
info
.
frame_height
%
2
)
!=
0
)
{
die
(
"Invalid frame size: %dx%d"
,
info
.
frame_width
,
info
.
frame_height
);
}
if
(
!
vpx_img_alloc
(
&
raw
,
VPX_IMG_FMT_I420
,
info
.
frame_width
,
info
.
frame_height
,
1
))
die
(
"Failed to allocate image"
);
info
.
frame_height
,
1
))
{
die
(
"Failed to allocate image."
);
}
printf
(
"Using %s
\n
"
,
vpx_codec_iface_name
(
interface
));
res
=
vpx_codec_enc_config_default
(
interface
,
&
cfg
,
0
);
if
(
res
)
{
printf
(
"Failed to get config: %s
\n
"
,
vpx_codec_err_to_string
(
res
));
return
EXIT_FAILURE
;
}
if
(
res
)
die_codec
(
&
codec
,
"Failed to get default codec config."
);
cfg
.
g_w
=
info
.
frame_width
;
cfg
.
g_h
=
info
.
frame_height
;
...
...
@@ -167,25 +152,23 @@ int main(int argc, char **argv) {
if
(
!
writer
)
die
(
"Failed to open %s for writing."
,
argv
[
4
]);
// Open input file for this encoding pass
if
(
!
(
infile
=
fopen
(
argv
[
3
],
"rb"
)))
die
(
"Failed to open %s for reading."
,
argv
[
3
]);
// Initialize codec
if
(
vpx_codec_enc_init
(
&
codec
,
interface
,
&
cfg
,
0
))
die_codec
(
&
codec
,
"Failed to initialize encoder"
);
while
(
read_frame
(
infile
,
&
raw
))
{
while
(
vpx_img_read
(
&
raw
,
infile
))
{
vpx_codec_iter_t
iter
=
NULL
;
const
vpx_codec_cx_pkt_t
*
pkt
=
NULL
;
++
frame_count
;
res
=
vpx_codec_encode
(
&
codec
,
&
raw
,
frame_count
,
1
,
0
,
VPX_DL_GOOD_QUALITY
);
if
(
res
!=
VPX_CODEC_OK
)
die_codec
(
&
codec
,
"Failed to encode frame"
);
++
frame_count
;
while
((
pkt
=
vpx_codec_get_cx_data
(
&
codec
,
&
iter
))
!=
NULL
)
{
if
(
pkt
->
kind
==
VPX_CODEC_CX_FRAME_PKT
)
{
const
int
keyframe
=
(
pkt
->
data
.
frame
.
flags
&
VPX_FRAME_IS_KEY
)
!=
0
;
...
...
@@ -195,14 +178,14 @@ int main(int argc, char **argv) {
pkt
->
data
.
frame
.
pts
))
die_codec
(
&
codec
,
"Failed to write compressed frame."
);
printf
(
keyframe
?
"K"
:
"."
);
fflush
(
stdout
);
}
}
}
printf
(
"
\n
"
);
fclose
(
infile
);
printf
(
"Processed %d frames.
\n
"
,
frame_count
);
vpx_img_free
(
&
raw
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec."
);
...
...
This diff is collapsed.
Click to expand it.
examples/twopass_encoder.c
+
145
−
191
View file @
c761bd78
...
...
@@ -50,218 +50,172 @@
#include
<stdio.h>
#include
<stdlib.h>
#include
<stdarg.h>
#include
<string.h>
#define VPX_CODEC_DISABLE_COMPAT 1
#include
"vpx/vpx_encoder.h"
#include
"vpx/vp8cx.h"
#define interface (vpx_codec_vp8_cx())
#define fourcc 0x30385056
#define IVF_FILE_HDR_SZ (32)
#define IVF_FRAME_HDR_SZ (12)
static
void
mem_put_le16
(
char
*
mem
,
unsigned
int
val
)
{
mem
[
0
]
=
val
;
mem
[
1
]
=
val
>>
8
;
}
static
void
mem_put_le32
(
char
*
mem
,
unsigned
int
val
)
{
mem
[
0
]
=
val
;
mem
[
1
]
=
val
>>
8
;
mem
[
2
]
=
val
>>
16
;
mem
[
3
]
=
val
>>
24
;
}
#include
"vpx/vpx_encoder.h"
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
ap
;
#include
"./tools_common.h"
#include
"./video_writer.h"
va_start
(
ap
,
fmt
);
vprintf
(
fmt
,
ap
);
if
(
fmt
[
strlen
(
fmt
)
-
1
]
!=
'\n'
)
printf
(
"
\n
"
);
exit
(
EXIT_FAILURE
);
}
#define interface (vpx_codec_vp8_cx())
static
void
die_codec
(
vpx_codec_ctx_t
*
ctx
,
const
char
*
s
)
{
const
char
*
detail
=
vpx_codec_error_detail
(
ctx
);
static
const
char
*
exec_name
;
printf
(
"%s: %s
\n
"
,
s
,
vpx_codec_error
(
ctx
));
if
(
detail
)
printf
(
" %s
\n
"
,
detail
);
exit
(
EXIT_FAILURE
);
void
usage_exit
()
{
fprintf
(
stderr
,
"Usage: %s <width> <height> <infile> <outfile>
\n
"
,
exec_name
);
exit
(
EXIT_FAILURE
);
}
static
int
read_frame
(
FILE
*
f
,
vpx_image_t
*
img
)
{
size_t
nbytes
,
to_read
;
int
res
=
1
;
to_read
=
img
->
w
*
img
->
h
*
3
/
2
;
nbytes
=
fread
(
img
->
planes
[
0
],
1
,
to_read
,
f
);
if
(
nbytes
!=
to_read
)
{
res
=
0
;
if
(
nbytes
>
0
)
printf
(
"Warning: Read partial frame. Check your width & height!
\n
"
);
static
void
get_frame_stats
(
vpx_codec_ctx_t
*
ctx
,
const
vpx_image_t
*
img
,
vpx_codec_pts_t
pts
,
uint64_t
duration
,
vpx_enc_frame_flags_t
flags
,
uint64_t
deadline
,
vpx_fixed_buf_t
*
stats
)
{
vpx_codec_iter_t
iter
=
NULL
;
const
vpx_codec_cx_pkt_t
*
pkt
=
NULL
;
const
vpx_codec_err_t
res
=
vpx_codec_encode
(
ctx
,
img
,
pts
,
duration
,
flags
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
die_codec
(
ctx
,
"Failed to get frame stats."
);
while
((
pkt
=
vpx_codec_get_cx_data
(
ctx
,
&
iter
))
!=
NULL
)
{
if
(
pkt
->
kind
==
VPX_CODEC_STATS_PKT
)
{
const
uint8_t
*
const
pkt_buf
=
pkt
->
data
.
twopass_stats
.
buf
;
const
size_t
pkt_size
=
pkt
->
data
.
twopass_stats
.
sz
;
stats
->
buf
=
realloc
(
stats
->
buf
,
stats
->
sz
+
pkt_size
);
memcpy
((
uint8_t
*
)
stats
->
buf
+
stats
->
sz
,
pkt_buf
,
pkt_size
);
stats
->
sz
+=
pkt_size
;
}
return
res
;
}
}
static
void
write_ivf_file_header
(
FILE
*
outfile
,
const
vpx_codec_enc_cfg_t
*
cfg
,
int
frame_cnt
)
{
char
header
[
32
];
if
(
cfg
->
g_pass
!=
VPX_RC_ONE_PASS
&&
cfg
->
g_pass
!=
VPX_RC_LAST_PASS
)
return
;
header
[
0
]
=
'D'
;
header
[
1
]
=
'K'
;
header
[
2
]
=
'I'
;
header
[
3
]
=
'F'
;
mem_put_le16
(
header
+
4
,
0
);
/* version */
mem_put_le16
(
header
+
6
,
32
);
/* headersize */
mem_put_le32
(
header
+
8
,
fourcc
);
/* headersize */
mem_put_le16
(
header
+
12
,
cfg
->
g_w
);
/* width */
mem_put_le16
(
header
+
14
,
cfg
->
g_h
);
/* height */
mem_put_le32
(
header
+
16
,
cfg
->
g_timebase
.
den
);
/* rate */
mem_put_le32
(
header
+
20
,
cfg
->
g_timebase
.
num
);
/* scale */
mem_put_le32
(
header
+
24
,
frame_cnt
);
/* length */
mem_put_le32
(
header
+
28
,
0
);
/* unused */
(
void
)
fwrite
(
header
,
1
,
32
,
outfile
);
static
void
encode_frame
(
vpx_codec_ctx_t
*
ctx
,
const
vpx_image_t
*
img
,
vpx_codec_pts_t
pts
,
uint64_t
duration
,
vpx_enc_frame_flags_t
flags
,
uint64_t
deadline
,
VpxVideoWriter
*
writer
)
{
vpx_codec_iter_t
iter
=
NULL
;
const
vpx_codec_cx_pkt_t
*
pkt
=
NULL
;
const
vpx_codec_err_t
res
=
vpx_codec_encode
(
ctx
,
img
,
pts
,
duration
,
flags
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
die_codec
(
ctx
,
"Failed to encode frame."
);
while
((
pkt
=
vpx_codec_get_cx_data
(
ctx
,
&
iter
))
!=
NULL
)
{
if
(
pkt
->
kind
==
VPX_CODEC_CX_FRAME_PKT
)
{
const
int
keyframe
=
(
pkt
->
data
.
frame
.
flags
&
VPX_FRAME_IS_KEY
)
!=
0
;
if
(
!
vpx_video_writer_write_frame
(
writer
,
pkt
->
data
.
frame
.
buf
,
pkt
->
data
.
frame
.
sz
,
pkt
->
data
.
frame
.
pts
))
die_codec
(
ctx
,
"Failed to write compressed frame."
);
printf
(
keyframe
?
"K"
:
"."
);
fflush
(
stdout
);
}
}
}
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
infile
=
NULL
;
VpxVideoWriter
*
writer
=
NULL
;
vpx_codec_ctx_t
codec
;
vpx_codec_enc_cfg_t
cfg
;
vpx_image_t
raw
;
vpx_codec_err_t
res
;
vpx_fixed_buf_t
stats
=
{
0
};
VpxVideoInfo
info
=
{
0
};
int
pass
;
const
int
fps
=
30
;
// TODO(dkovalev) add command line argument
const
int
bitrate
=
200
;
// kbit/s TODO(dkovalev) add command line argument
if
(
argc
!=
5
)
die
(
"Invalid number of arguments."
);
info
.
codec_fourcc
=
VP8_FOURCC
;
info
.
time_base
.
numerator
=
1
;
info
.
time_base
.
denominator
=
fps
;
info
.
frame_width
=
strtol
(
argv
[
1
],
NULL
,
0
);
info
.
frame_height
=
strtol
(
argv
[
2
],
NULL
,
0
);
if
(
info
.
frame_width
<=
0
||
info
.
frame_height
<=
0
||
(
info
.
frame_width
%
2
)
!=
0
||
(
info
.
frame_height
%
2
)
!=
0
)
{
die
(
"Invalid frame size: %dx%d"
,
info
.
frame_width
,
info
.
frame_height
);
}
if
(
!
vpx_img_alloc
(
&
raw
,
VPX_IMG_FMT_I420
,
info
.
frame_width
,
info
.
frame_height
,
1
))
{
die
(
"Failed to allocate image"
,
info
.
frame_width
,
info
.
frame_height
);
}
writer
=
vpx_video_writer_open
(
argv
[
4
],
kContainerIVF
,
&
info
);
if
(
!
writer
)
die
(
"Failed to open %s for writing"
,
argv
[
4
]);
printf
(
"Using %s
\n
"
,
vpx_codec_iface_name
(
interface
));
res
=
vpx_codec_enc_config_default
(
interface
,
&
cfg
,
0
);
if
(
res
)
die_codec
(
&
codec
,
"Failed to get default codec config."
);
cfg
.
g_w
=
info
.
frame_width
;
cfg
.
g_h
=
info
.
frame_height
;
cfg
.
g_timebase
.
num
=
info
.
time_base
.
numerator
;
cfg
.
g_timebase
.
den
=
info
.
time_base
.
denominator
;
cfg
.
rc_target_bitrate
=
bitrate
;
for
(
pass
=
0
;
pass
<
2
;
++
pass
)
{
int
frame_count
=
0
;
if
(
pass
==
0
)
{
cfg
.
g_pass
=
VPX_RC_FIRST_PASS
;
}
else
{
cfg
.
g_pass
=
VPX_RC_LAST_PASS
;
cfg
.
rc_twopass_stats_in
=
stats
;
}
static
void
write_ivf_frame_header
(
FILE
*
outfile
,
const
vpx_codec_cx_pkt_t
*
pkt
)
{
char
header
[
12
];
vpx_codec_pts_t
pts
;
if
(
pkt
->
kind
!=
VPX_CODEC_CX_FRAME_PKT
)
return
;
if
(
!
(
infile
=
fopen
(
argv
[
3
],
"rb"
)))
die
(
"Failed to open %s for reading"
,
argv
[
3
]);
pts
=
pkt
->
data
.
frame
.
pts
;
mem_put_le32
(
header
,
pkt
->
data
.
frame
.
sz
);
mem_put_le32
(
header
+
4
,
pts
&
0xFFFFFFFF
);
mem_put_le32
(
header
+
8
,
pts
>>
32
);
if
(
vpx_codec_enc_init
(
&
codec
,
interface
,
&
cfg
,
0
))
die_codec
(
&
codec
,
"Failed to initialize encoder"
);
(
void
)
fwrite
(
header
,
1
,
12
,
out
file
)
;
}
while
(
vpx_img_read
(
&
raw
,
in
file
)
)
{
++
frame_count
;
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
infile
,
*
outfile
;
vpx_codec_ctx_t
codec
;
vpx_codec_enc_cfg_t
cfg
;
int
frame_cnt
=
0
;
vpx_image_t
raw
;
vpx_codec_err_t
res
;
long
width
;
long
height
;
int
frame_avail
;
int
got_data
;
int
flags
=
0
;
int
pass
;
vpx_fixed_buf_t
stats
=
{
0
};
/* Open files */
if
(
argc
!=
5
)
die
(
"Usage: %s <width> <height> <infile> <outfile>
\n
"
,
argv
[
0
]);
width
=
strtol
(
argv
[
1
],
NULL
,
0
);
height
=
strtol
(
argv
[
2
],
NULL
,
0
);
if
(
width
<
16
||
width
%
2
||
height
<
16
||
height
%
2
)
die
(
"Invalid resolution: %ldx%ld"
,
width
,
height
);
if
(
!
vpx_img_alloc
(
&
raw
,
VPX_IMG_FMT_I420
,
width
,
height
,
1
))
die
(
"Faile to allocate image"
,
width
,
height
);
if
(
!
(
outfile
=
fopen
(
argv
[
4
],
"wb"
)))
die
(
"Failed to open %s for writing"
,
argv
[
4
]);
printf
(
"Using %s
\n
"
,
vpx_codec_iface_name
(
interface
));
/* Populate encoder configuration */
res
=
vpx_codec_enc_config_default
(
interface
,
&
cfg
,
0
);
if
(
res
)
{
printf
(
"Failed to get config: %s
\n
"
,
vpx_codec_err_to_string
(
res
));
return
EXIT_FAILURE
;
if
(
pass
==
0
)
{
get_frame_stats
(
&
codec
,
&
raw
,
frame_count
,
1
,
0
,
VPX_DL_BEST_QUALITY
,
&
stats
);
}
else
{
encode_frame
(
&
codec
,
&
raw
,
frame_count
,
1
,
0
,
VPX_DL_BEST_QUALITY
,
writer
);
}
}
/* Update the default configuration with our settings */
cfg
.
rc_target_bitrate
=
width
*
height
*
cfg
.
rc_target_bitrate
/
cfg
.
g_w
/
cfg
.
g_h
;
cfg
.
g_w
=
width
;
cfg
.
g_h
=
height
;
write_ivf_file_header
(
outfile
,
&
cfg
,
0
);
for
(
pass
=
0
;
pass
<
2
;
pass
++
)
{
frame_cnt
=
0
;
if
(
pass
==
0
)
cfg
.
g_pass
=
VPX_RC_FIRST_PASS
;
else
{
cfg
.
g_pass
=
VPX_RC_LAST_PASS
;
cfg
.
rc_twopass_stats_in
=
stats
;
}
/* Open input file for this encoding pass */
if
(
!
(
infile
=
fopen
(
argv
[
3
],
"rb"
)))
die
(
"Failed to open %s for reading"
,
argv
[
3
]);
/* Initialize codec */
if
(
vpx_codec_enc_init
(
&
codec
,
interface
,
&
cfg
,
0
))
die_codec
(
&
codec
,
"Failed to initialize encoder"
);
frame_avail
=
1
;
got_data
=
0
;
while
(
frame_avail
||
got_data
)
{
vpx_codec_iter_t
iter
=
NULL
;
const
vpx_codec_cx_pkt_t
*
pkt
;
frame_avail
=
read_frame
(
infile
,
&
raw
);
if
(
vpx_codec_encode
(
&
codec
,
frame_avail
?
&
raw
:
NULL
,
frame_cnt
,
1
,
flags
,
VPX_DL_BEST_QUALITY
))
die_codec
(
&
codec
,
"Failed to encode frame"
);
got_data
=
0
;
while
(
(
pkt
=
vpx_codec_get_cx_data
(
&
codec
,
&
iter
))
)
{
got_data
=
1
;
switch
(
pkt
->
kind
)
{
case
VPX_CODEC_CX_FRAME_PKT
:
write_ivf_frame_header
(
outfile
,
pkt
);
(
void
)
fwrite
(
pkt
->
data
.
frame
.
buf
,
1
,
pkt
->
data
.
frame
.
sz
,
outfile
);
break
;
case
VPX_CODEC_STATS_PKT
:
stats
.
buf
=
realloc
(
stats
.
buf
,
stats
.
sz
+
pkt
->
data
.
twopass_stats
.
sz
);
if
(
!
stats
.
buf
)
die
(
"Memory reallocation failed.
\n
"
);
memcpy
((
char
*
)
stats
.
buf
+
stats
.
sz
,
pkt
->
data
.
twopass_stats
.
buf
,
pkt
->
data
.
twopass_stats
.
sz
);
stats
.
sz
+=
pkt
->
data
.
twopass_stats
.
sz
;
break
;
default:
break
;
}
printf
(
pkt
->
kind
==
VPX_CODEC_CX_FRAME_PKT
&&
(
pkt
->
data
.
frame
.
flags
&
VPX_FRAME_IS_KEY
)
?
"K"
:
"."
);
fflush
(
stdout
);
}
frame_cnt
++
;
}
printf
(
"
\n
"
);
fclose
(
infile
);
printf
(
"Pass %d complete.
\n
"
,
pass
+
1
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec"
);
if
(
pass
==
0
)
{
get_frame_stats
(
&
codec
,
NULL
,
frame_count
,
1
,
0
,
VPX_DL_BEST_QUALITY
,
&
stats
);
}
else
{
printf
(
"
\n
"
);
}
printf
(
"Processed %d frames.
\n
"
,
frame_cnt
-
1
);
vpx_img_free
(
&
raw
);
free
(
stats
.
buf
);
fclose
(
infile
);
printf
(
"Pass %d complete. Processed %d frames.
\n
"
,
pass
+
1
,
frame_count
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec."
);
}
vpx_img_free
(
&
raw
);
free
(
stats
.
buf
);
vpx_video_writer_close
(
writer
);
/* Try to rewrite the file header with the actual frame count */
if
(
!
fseek
(
outfile
,
0
,
SEEK_SET
))
write_ivf_file_header
(
outfile
,
&
cfg
,
frame_cnt
-
1
);
fclose
(
outfile
);
return
EXIT_SUCCESS
;
return
EXIT_SUCCESS
;
}
This diff is collapsed.
Click to expand it.
tools_common.c
+
22
−
0
View file @
c761bd78
...
...
@@ -168,9 +168,31 @@ void vpx_img_write(const vpx_image_t *img, FILE *file) {
const
int
stride
=
img
->
stride
[
plane
];
const
int
w
=
plane
?
(
img
->
d_w
+
1
)
>>
1
:
img
->
d_w
;
const
int
h
=
plane
?
(
img
->
d_h
+
1
)
>>
1
:
img
->
d_h
;
for
(
y
=
0
;
y
<
h
;
++
y
)
{
fwrite
(
buf
,
1
,
w
,
file
);
buf
+=
stride
;
}
}
}
int
vpx_img_read
(
vpx_image_t
*
img
,
FILE
*
file
)
{
int
plane
;
for
(
plane
=
0
;
plane
<
3
;
++
plane
)
{
unsigned
char
*
buf
=
img
->
planes
[
plane
];
const
int
stride
=
img
->
stride
[
plane
];
const
int
w
=
plane
?
(
img
->
d_w
+
1
)
>>
1
:
img
->
d_w
;
const
int
h
=
plane
?
(
img
->
d_h
+
1
)
>>
1
:
img
->
d_h
;
int
y
;
for
(
y
=
0
;
y
<
h
;
++
y
)
{
if
(
fread
(
buf
,
1
,
w
,
file
)
!=
w
)
return
0
;
buf
+=
stride
;
}
}
return
1
;
}
This diff is collapsed.
Click to expand it.
tools_common.h
+
4
−
0
View file @
c761bd78
...
...
@@ -129,6 +129,10 @@ vpx_codec_iface_t *get_codec_interface(unsigned int fourcc);
// of vpx_image_t support
void
vpx_img_write
(
const
vpx_image_t
*
img
,
FILE
*
file
);
// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
// of vpx_image_t support
int
vpx_img_read
(
vpx_image_t
*
img
,
FILE
*
file
);
#ifdef __cplusplus
}
/* extern "C" */
#endif
...
...
This diff is collapsed.
Click to expand it.
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets