setup experimental infrastructure
This patch creates some basic infrastructure for doing bitstream- incompatible changes to the VP8 encoder. The key parts are: - --enable-experimental configure switch, to enable support for this incompatible bitstream. This switch is required to be set to enable any "experiments" - A list for "experiments" which translate into --enable-<experiment> options and CONFIG_<experiment> macros. - The high bit of the "Version" field is used to indicate that the bitstream was produced by an experimental encoder. The decoder will fail to decode an experimental bitstream without --enable-experimental. - A new "vp8x" encoder interface is created to set the experimental bit. - The vp8x encoder interface is made the default for ivfenc in experimental mode. Change-Id: Idbdd5eae4cec5becf75bb4770837dcd256b2abef
This commit is contained in:
parent
1689564bb5
commit
0952acb79a
18
configure
vendored
18
configure
vendored
@ -203,6 +203,8 @@ HAVE_LIST="
|
|||||||
pthread_h
|
pthread_h
|
||||||
sys_mman_h
|
sys_mman_h
|
||||||
"
|
"
|
||||||
|
EXPERIMENT_LIST="
|
||||||
|
"
|
||||||
CONFIG_LIST="
|
CONFIG_LIST="
|
||||||
external_build
|
external_build
|
||||||
install_docs
|
install_docs
|
||||||
@ -242,6 +244,9 @@ CONFIG_LIST="
|
|||||||
static_msvcrt
|
static_msvcrt
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
|
||||||
|
experimental
|
||||||
|
${EXPERIMENT_LIST}
|
||||||
"
|
"
|
||||||
CMDLINE_SELECT="
|
CMDLINE_SELECT="
|
||||||
extra_warnings
|
extra_warnings
|
||||||
@ -280,6 +285,7 @@ CMDLINE_SELECT="
|
|||||||
mem_tracker
|
mem_tracker
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
experimental
|
||||||
"
|
"
|
||||||
|
|
||||||
process_cmdline() {
|
process_cmdline() {
|
||||||
@ -287,6 +293,18 @@ process_cmdline() {
|
|||||||
optval="${opt#*=}"
|
optval="${opt#*=}"
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
||||||
|
--enable-?*|--disable-?*)
|
||||||
|
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
|
if echo "${EXPERIMENT_LIST}" | grep "^ *$option\$" >/dev/null; then
|
||||||
|
if enabled experimental; then
|
||||||
|
$action $option
|
||||||
|
else
|
||||||
|
log_echo "Ignoring $opt -- not in experimental mode."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
process_common_cmdline $opt
|
||||||
|
fi
|
||||||
|
;;
|
||||||
*) process_common_cmdline $opt
|
*) process_common_cmdline $opt
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
4
ivfenc.c
4
ivfenc.c
@ -29,6 +29,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "vpx_config.h"
|
||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#include "vpx_ports/mem_ops.h"
|
#include "vpx_ports/mem_ops.h"
|
||||||
#include "vpx_ports/vpx_timer.h"
|
#include "vpx_ports/vpx_timer.h"
|
||||||
@ -42,6 +43,9 @@ static const struct codec_item
|
|||||||
unsigned int fourcc;
|
unsigned int fourcc;
|
||||||
} codecs[] =
|
} codecs[] =
|
||||||
{
|
{
|
||||||
|
#if CONFIG_EXPERIMENTAL && CONFIG_VP8_ENCODER
|
||||||
|
{"vp8x", &vpx_codec_vp8x_cx_algo, 0x78385056},
|
||||||
|
#endif
|
||||||
#if CONFIG_VP8_ENCODER
|
#if CONFIG_VP8_ENCODER
|
||||||
{"vp8", &vpx_codec_vp8_cx_algo, 0x30385056},
|
{"vp8", &vpx_codec_vp8_cx_algo, 0x30385056},
|
||||||
#endif
|
#endif
|
||||||
|
@ -174,7 +174,16 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height)
|
|||||||
}
|
}
|
||||||
void vp8_setup_version(VP8_COMMON *cm)
|
void vp8_setup_version(VP8_COMMON *cm)
|
||||||
{
|
{
|
||||||
switch (cm->version)
|
if (cm->version & 0x4)
|
||||||
|
{
|
||||||
|
if (!CONFIG_EXPERIMENTAL)
|
||||||
|
vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM,
|
||||||
|
"Bitstream was created by an experimental "
|
||||||
|
"encoder");
|
||||||
|
cm->experimental = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cm->version & 0x3)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
cm->no_lpf = 0;
|
cm->no_lpf = 0;
|
||||||
@ -200,13 +209,6 @@ void vp8_setup_version(VP8_COMMON *cm)
|
|||||||
cm->use_bilinear_mc_filter = 1;
|
cm->use_bilinear_mc_filter = 1;
|
||||||
cm->full_pixel = 1;
|
cm->full_pixel = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
//4,5,6,7 are reserved for future use
|
|
||||||
cm->no_lpf = 0;
|
|
||||||
cm->simpler_lpf = 0;
|
|
||||||
cm->use_bilinear_mc_filter = 0;
|
|
||||||
cm->full_pixel = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void vp8_create_common(VP8_COMMON *oci)
|
void vp8_create_common(VP8_COMMON *oci)
|
||||||
|
@ -113,6 +113,7 @@ typedef struct VP8Common
|
|||||||
int mode_info_stride;
|
int mode_info_stride;
|
||||||
|
|
||||||
// prfile settings
|
// prfile settings
|
||||||
|
int experimental;
|
||||||
int mb_no_coeff_skip;
|
int mb_no_coeff_skip;
|
||||||
int no_lpf;
|
int no_lpf;
|
||||||
int simpler_lpf;
|
int simpler_lpf;
|
||||||
|
@ -35,7 +35,7 @@ struct vp8_extracfg
|
|||||||
unsigned int arnr_max_frames; /* alt_ref Noise Reduction Max Frame Count */
|
unsigned int arnr_max_frames; /* alt_ref Noise Reduction Max Frame Count */
|
||||||
unsigned int arnr_strength; /* alt_ref Noise Reduction Strength */
|
unsigned int arnr_strength; /* alt_ref Noise Reduction Strength */
|
||||||
unsigned int arnr_type; /* alt_ref filter type */
|
unsigned int arnr_type; /* alt_ref filter type */
|
||||||
|
unsigned int experimental;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct extraconfig_map
|
struct extraconfig_map
|
||||||
@ -65,6 +65,7 @@ static const struct extraconfig_map extracfg_map[] =
|
|||||||
0, /* arnr_max_frames */
|
0, /* arnr_max_frames */
|
||||||
0, /* arnr_strength */
|
0, /* arnr_strength */
|
||||||
0, /* arnr_type*/
|
0, /* arnr_type*/
|
||||||
|
0, /* experimental mode */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -232,7 +233,8 @@ static vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf,
|
|||||||
struct vp8_extracfg vp8_cfg)
|
struct vp8_extracfg vp8_cfg)
|
||||||
{
|
{
|
||||||
oxcf->multi_threaded = cfg.g_threads;
|
oxcf->multi_threaded = cfg.g_threads;
|
||||||
oxcf->Version = cfg.g_profile;
|
oxcf->Version = cfg.g_profile;
|
||||||
|
oxcf->Version |= vp8_cfg.experimental? 0x4 : 0;
|
||||||
|
|
||||||
oxcf->Width = cfg.g_w;
|
oxcf->Width = cfg.g_w;
|
||||||
oxcf->Height = cfg.g_h;
|
oxcf->Height = cfg.g_h;
|
||||||
@ -453,7 +455,10 @@ static vpx_codec_err_t set_param(vpx_codec_alg_priv_t *ctx,
|
|||||||
return res;
|
return res;
|
||||||
#undef MAP
|
#undef MAP
|
||||||
}
|
}
|
||||||
static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx)
|
|
||||||
|
|
||||||
|
static vpx_codec_err_t vp8e_common_init(vpx_codec_ctx_t *ctx,
|
||||||
|
int experimental)
|
||||||
{
|
{
|
||||||
vpx_codec_err_t res = VPX_DEC_OK;
|
vpx_codec_err_t res = VPX_DEC_OK;
|
||||||
struct vpx_codec_alg_priv *priv;
|
struct vpx_codec_alg_priv *priv;
|
||||||
@ -495,6 +500,7 @@ static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx)
|
|||||||
|
|
||||||
priv->vp8_cfg = extracfg_map[i].cfg;
|
priv->vp8_cfg = extracfg_map[i].cfg;
|
||||||
priv->vp8_cfg.pkt_list = &priv->pkt_list.head;
|
priv->vp8_cfg.pkt_list = &priv->pkt_list.head;
|
||||||
|
priv->vp8_cfg.experimental = experimental;
|
||||||
|
|
||||||
priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2;
|
priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2;
|
||||||
|
|
||||||
@ -523,6 +529,21 @@ static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
return vp8e_common_init(ctx, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_EXPERIMENTAL
|
||||||
|
static vpx_codec_err_t vp8e_exp_init(vpx_codec_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
return vp8e_common_init(ctx, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx)
|
static vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -1093,6 +1114,36 @@ vpx_codec_iface_t vpx_codec_vp8_cx_algo =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_EXPERIMENTAL
|
||||||
|
vpx_codec_iface_t vpx_codec_vp8x_cx_algo =
|
||||||
|
{
|
||||||
|
"VP8 Experimental Encoder" VERSION_STRING,
|
||||||
|
VPX_CODEC_INTERNAL_ABI_VERSION,
|
||||||
|
VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR,
|
||||||
|
/* vpx_codec_caps_t caps; */
|
||||||
|
vp8e_exp_init, /* vpx_codec_init_fn_t init; */
|
||||||
|
vp8e_destroy, /* vpx_codec_destroy_fn_t destroy; */
|
||||||
|
vp8e_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_get_mmap_fn_t get_mmap; */
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_set_mmap_fn_t set_mmap; */
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_peek_si_fn_t peek_si; */
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_get_si_fn_t get_si; */
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_decode_fn_t decode; */
|
||||||
|
NOT_IMPLEMENTED, /* vpx_codec_frame_get_fn_t frame_get; */
|
||||||
|
},
|
||||||
|
{
|
||||||
|
vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */
|
||||||
|
vp8e_encode, /* vpx_codec_encode_fn_t encode; */
|
||||||
|
vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */
|
||||||
|
vp8e_set_config,
|
||||||
|
NOT_IMPLEMENTED,
|
||||||
|
vp8e_get_preview,
|
||||||
|
} /* encoder functions */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BEGIN BACKWARDS COMPATIBILITY SHIM.
|
* BEGIN BACKWARDS COMPATIBILITY SHIM.
|
||||||
*/
|
*/
|
||||||
|
10
vpx/vp8cx.h
10
vpx/vp8cx.h
@ -31,6 +31,16 @@
|
|||||||
extern vpx_codec_iface_t vpx_codec_vp8_cx_algo;
|
extern vpx_codec_iface_t vpx_codec_vp8_cx_algo;
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_EXPERIMENTAL
|
||||||
|
/*!\brief Algorithm interface for VP8 experimental branch
|
||||||
|
*
|
||||||
|
* This interface provides the ability to encode using the "experimental"
|
||||||
|
* VP8 variant, which is bitstream incompatible with the default VP8 encoder.
|
||||||
|
*/
|
||||||
|
extern vpx_codec_iface_t vpx_codec_vp8x_cx_algo;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Algorithm Flags
|
* Algorithm Flags
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user