| @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, 0); |
| } |
| 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, 4, 0}; |
| |
| if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp)) |
| die_codec(&codec, "Failed to turn on postproc"); |
| }; |
| #endif |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE |