Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
aom-rav1e
Commits
6440e295
Commit
6440e295
authored
Mar 03, 2014
by
Dmitry Kovalev
Committed by
Gerrit Code Review
Mar 03, 2014
Browse files
Merge "Merging error-resilient example into simple_encoder."
parents
07c4d225
194e6f29
Changes
3
Hide whitespace changes
Inline
Side-by-side
examples.mk
View file @
6440e295
...
...
@@ -142,10 +142,6 @@ EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c
endif
decode_with_partial_drops.GUID
=
61C2D026-5754-46AC-916F-1343ECC5537E
decode_with_partial_drops.DESCRIPTION
=
Drops parts of frames
while
decoding
EXAMPLES-$(CONFIG_VP8_ENCODER)
+=
error_resilient.c
error_resilient.GUID
=
DF5837B9-4145-4F92-A031-44E4F832E00C
error_resilient.DESCRIPTION
=
Error Resiliency Feature
EXAMPLES-$(CONFIG_VP8_ENCODER)
+=
vp8_set_maps.c
vp8_set_maps.SRCS
+=
ivfenc.h ivfenc.c
vp8_set_maps.SRCS
+=
tools_common.h tools_common.c
...
...
examples/error_resilient.c
deleted
100644 → 0
View file @
07c4d225
/*
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// Error Resiliency Features
// =========================
//
// This is an example demonstrating how to enable the error resiliency
// features of the codec.
//
// Configuration
// -------------
// Error resiliency is controlled by the g_error_resilient member of the
// configuration structure.
//
// Observing The Effects
// ---------------------
// Use the `decode_with_drops` example to decode with frames 5-10 dropped.
// Compare the output for a file encoded with this example versus one
// encoded with the `simple_encoder` example.
#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
;
}
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
ap
;
va_start
(
ap
,
fmt
);
vprintf
(
fmt
,
ap
);
if
(
fmt
[
strlen
(
fmt
)
-
1
]
!=
'\n'
)
printf
(
"
\n
"
);
exit
(
EXIT_FAILURE
);
}
static
void
die_codec
(
vpx_codec_ctx_t
*
ctx
,
const
char
*
s
)
{
const
char
*
detail
=
vpx_codec_error_detail
(
ctx
);
printf
(
"%s: %s
\n
"
,
s
,
vpx_codec_error
(
ctx
));
if
(
detail
)
printf
(
" %s
\n
"
,
detail
);
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
"
);
}
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
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
;
pts
=
pkt
->
data
.
frame
.
pts
;
mem_put_le32
(
header
,
(
unsigned
int
)
pkt
->
data
.
frame
.
sz
);
mem_put_le32
(
header
+
4
,
pts
&
0xFFFFFFFF
);
mem_put_le32
(
header
+
8
,
pts
>>
32
);
(
void
)
fwrite
(
header
,
1
,
12
,
outfile
);
}
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
;
/* 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
;
}
/* 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
;
/* Enable error resilient mode */
cfg
.
g_error_resilient
=
1
;
write_ivf_file_header
(
outfile
,
&
cfg
,
0
);
/* 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_REALTIME
))
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
;
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
(
"Processed %d frames.
\n
"
,
frame_cnt
-
1
);
vpx_img_free
(
&
raw
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec"
);
/* 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
;
}
examples/simple_encoder.c
View file @
6440e295
...
...
@@ -36,7 +36,7 @@
// ---------------------------------
// Encoders have the notion of "usage profiles." For example, an encoder
// may want to publish default configurations for both a video
// conferencing appliction and a best quality offline encoder. These
// conferencing applic
a
tion and a best quality offline encoder. These
// obviously have very different default settings. Consult the
// documentation for your codec to see if it provides any default
// configurations. All codecs provide a default configuration, number 0,
...
...
@@ -80,6 +80,13 @@
// an error, a descriptive message is printed and the program exits. With
// few exeptions, vpx_codec functions return an enumerated error status,
// with the value `0` indicating success.
//
// Error Resiliency Features
// -------------------------
// Error resiliency is controlled by the g_error_resilient member of the
// configuration structure. Use the `decode_with_drops` example to decode with
// frames 5-10 dropped. Compare the output for a file encoded with this example
// versus one encoded with the `simple_encoder` example.
#include <stdio.h>
#include <stdlib.h>
...
...
@@ -94,7 +101,10 @@
static
const
char
*
exec_name
;
void
usage_exit
()
{
fprintf
(
stderr
,
"Usage: %s <codec> <width> <height> <infile> <outfile>
\n
"
,
fprintf
(
stderr
,
"Usage: %s <codec> <width> <height> <infile> <outfile> "
"[<error-resilient>]
\n
See comments in simple_encoder.c for more "
"information.
\n
"
,
exec_name
);
exit
(
EXIT_FAILURE
);
}
...
...
@@ -138,17 +148,23 @@ int main(int argc, char **argv) {
const
VpxInterface
*
encoder
=
NULL
;
const
int
fps
=
30
;
// TODO(dkovalev) add command line argument
const
int
bitrate
=
200
;
// kbit/s TODO(dkovalev) add command line argument
const
char
*
const
codec_arg
=
argv
[
1
]
;
const
char
*
const
width_arg
=
argv
[
2
]
;
const
char
*
const
height_arg
=
argv
[
3
]
;
const
char
*
const
infile_arg
=
argv
[
4
]
;
const
char
*
const
outfile_arg
=
argv
[
5
]
;
const
char
*
codec_arg
=
NULL
;
const
char
*
width_arg
=
NULL
;
const
char
*
height_arg
=
NULL
;
const
char
*
infile_arg
=
NULL
;
const
char
*
outfile_arg
=
NULL
;
exec_name
=
argv
[
0
];
if
(
argc
!=
6
)
if
(
argc
<
6
)
die
(
"Invalid number of arguments"
);
codec_arg
=
argv
[
1
];
width_arg
=
argv
[
2
];
height_arg
=
argv
[
3
];
infile_arg
=
argv
[
4
];
outfile_arg
=
argv
[
5
];
encoder
=
get_vpx_encoder_by_name
(
codec_arg
);
if
(
!
encoder
)
die
(
"Unsupported codec."
);
...
...
@@ -182,6 +198,7 @@ int main(int argc, char **argv) {
cfg
.
g_timebase
.
num
=
info
.
time_base
.
numerator
;
cfg
.
g_timebase
.
den
=
info
.
time_base
.
denominator
;
cfg
.
rc_target_bitrate
=
bitrate
;
cfg
.
g_error_resilient
=
argc
>
6
?
strtol
(
argv
[
6
],
NULL
,
0
)
:
0
;
writer
=
vpx_video_writer_open
(
outfile_arg
,
kContainerIVF
,
&
info
);
if
(
!
writer
)
...
...
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