postproc.txt 2.88 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
@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));
Johann's avatar
Johann committed
24
    res = vpx_codec_dec_init(&codec, interface, NULL, flags);
John Koleszar's avatar
John Koleszar committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
}
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
54
#if CONFIG_VP9_DECODER
John Koleszar's avatar
John Koleszar committed
55 56 57 58 59 60 61 62 63 64 65 66 67
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, 4, 0};

    if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
        die_codec(&codec, "Failed to turn on postproc");
};
#endif
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE