Rough merge of master into experimental
[platform/upstream/libvpx.git] / examples / postproc.txt
1 @TEMPLATE decoder_tmpl.c
2 Postprocessing Decoder
3 ======================
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
5 This example adds postprocessing to the simple decoder loop.
6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
7
8
9 Initializing Postprocessing
10 ---------------------------
11 You must inform the codec that you might request postprocessing at
12 initialization time. This is done by passing the VPX_CODEC_USE_POSTPROC
13 flag to `vpx_codec_dec_init`. If the codec does not support
14 postprocessing, this call will return VPX_CODEC_INCAPABLE. For
15 demonstration purposes, we also fall back to default initialization if
16 the codec does not provide support.
17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
18 /* Initialize codec */
19 res = vpx_codec_dec_init(&codec, interface, NULL,
20                          VPX_CODEC_USE_POSTPROC);
21 if(res == VPX_CODEC_INCAPABLE) {
22     printf("NOTICE: Postproc not supported by %s\n",
23            vpx_codec_iface_name(interface));
24     res = vpx_codec_dec_init(&codec, interface, NULL, flags);
25 }
26 if(res)
27     die_codec(&codec, "Failed to initialize decoder");
28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
29
30
31 Using Adaptive Postprocessing
32 -----------------------------
33 VP6 provides "adaptive postprocessing." It will automatically select the
34 best postprocessing filter on a frame by frame basis based on the amount
35 of time remaining before the user's specified deadline expires. The
36 special value 0 indicates that the codec should take as long as
37 necessary to provide the best quality frame. This example gives the
38 codec 15ms (15000us) to return a frame. Remember that this is a soft
39 deadline, and the codec may exceed it doing its regular processing. In
40 these cases, no additional postprocessing will be done.
41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
42 /* Decode the frame with 15ms deadline */
43 if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 15000))
44     die_codec(&codec, "Failed to decode frame");
45 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
46
47
48 Codec Specific Postprocessing Controls
49 --------------------------------------
50 Some codecs provide fine grained controls over their built-in
51 postprocessors. VP8 is one example. The following sample code toggles
52 postprocessing on and off every 15 frames.
53 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
54 #if CONFIG_VP9_DECODER
55 if(frame_cnt%30 == 1) {
56     vp8_postproc_cfg_t  pp = {0, 0, 0};
57
58     if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
59         die_codec(&codec, "Failed to turn off postproc");
60 } else if(frame_cnt%30 == 16) {
61     vp8_postproc_cfg_t  pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0};
62
63     if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
64         die_codec(&codec, "Failed to turn on postproc");
65 };
66 #endif
67 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE