1 @TEMPLATE decoder_tmpl.c
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
5 This example adds postprocessing to the simple decoder loop.
6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
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);
27 die_codec(&codec, "Failed to initialize decoder");
28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
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
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_VP8_DECODER
55 if(frame_cnt%30 == 1) {
56 vp8_postproc_cfg_t pp = {0, 0, 0};
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, 4, 0};
63 if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
64 die_codec(&codec, "Failed to turn on postproc");
67 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE