87aa846b47
Adds a multiframe postprocessing module to enhance the quality of certain frames that are coded at lower quality than preceding frames. The module can be invoked from the commandline by use of the --mfqe option, and will be most beneficial for enhancing the quality of frames decoded using scalable patterns. Uses the vp8_variance_var16x16 and vp8_variance_sad16x16 function pointers to compute SAD and Variance of blocks. Change-Id: Id73d2a6e3572d07f9f8e36bbce00a4fc5ffd8961
68 lines
2.9 KiB
Plaintext
68 lines
2.9 KiB
Plaintext
@TEMPLATE decoder_tmpl.c
|
|
Postprocessing Decoder
|
|
======================
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
|
This example adds postprocessing to the simple decoder loop.
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
|
|
|
|
|
Initializing Postprocessing
|
|
---------------------------
|
|
You must inform the codec that you might request postprocessing at
|
|
initialization time. This is done by passing the VPX_CODEC_USE_POSTPROC
|
|
flag to `vpx_codec_dec_init`. If the codec does not support
|
|
postprocessing, this call will return VPX_CODEC_INCAPABLE. For
|
|
demonstration purposes, we also fall back to default initialization if
|
|
the codec does not provide support.
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
|
/* Initialize codec */
|
|
res = vpx_codec_dec_init(&codec, interface, NULL,
|
|
VPX_CODEC_USE_POSTPROC);
|
|
if(res == VPX_CODEC_INCAPABLE) {
|
|
printf("NOTICE: Postproc not supported by %s\n",
|
|
vpx_codec_iface_name(interface));
|
|
res = vpx_codec_dec_init(&codec, interface, NULL, flags);
|
|
}
|
|
if(res)
|
|
die_codec(&codec, "Failed to initialize decoder");
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
|
|
|
|
|
Using Adaptive Postprocessing
|
|
-----------------------------
|
|
VP6 provides "adaptive postprocessing." It will automatically select the
|
|
best postprocessing filter on a frame by frame basis based on the amount
|
|
of time remaining before the user's specified deadline expires. The
|
|
special value 0 indicates that the codec should take as long as
|
|
necessary to provide the best quality frame. This example gives the
|
|
codec 15ms (15000us) to return a frame. Remember that this is a soft
|
|
deadline, and the codec may exceed it doing its regular processing. In
|
|
these cases, no additional postprocessing will be done.
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
|
|
/* Decode the frame with 15ms deadline */
|
|
if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 15000))
|
|
die_codec(&codec, "Failed to decode frame");
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
|
|
|
|
|
|
Codec Specific Postprocessing Controls
|
|
--------------------------------------
|
|
Some codecs provide fine grained controls over their built-in
|
|
postprocessors. VP8 is one example. The following sample code toggles
|
|
postprocessing on and off every 15 frames.
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
|
#if CONFIG_VP8_DECODER
|
|
if(frame_cnt%30 == 1) {
|
|
vp8_postproc_cfg_t pp = {0, 0, 0};
|
|
|
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
|
die_codec(&codec, "Failed to turn off postproc");
|
|
} else if(frame_cnt%30 == 16) {
|
|
vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0};
|
|
|
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
|
die_codec(&codec, "Failed to turn on postproc");
|
|
};
|
|
#endif
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|