@TEMPLATE encoder_tmpl.c
VP8 Set Active and ROI Maps
===========================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example demonstrating how to control the VP8 encoder's
ROI and Active maps.

ROI (Reigon of Interest) maps are a way for the application to assign
each macroblock in the image to a region, and then set quantizer and
filtering parameters on that image.

Active maps are a way for the application to specify on a
macroblock-by-macroblock basis whether there is any activity in that
macroblock.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION


Configuration
-------------
An ROI map is set on frame 22. If the width of the image in macroblocks
is evenly divisble by 4, then the output will appear to have distinct
columns, where the quantizer, loopfilter, and static threshold differ
from column to column.

An active map is set on frame 33. If the width of the image in macroblocks
is evenly divisble by 4, then the output will appear to have distinct
columns, where one column will have motion and the next will not.

The active map is cleared on frame 44.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  PER_FRAME_CFG
if(frame_cnt + 1 == 22) {
    vpx_roi_map_t  roi;
    int            i;

    roi.rows = cfg.g_h/16;
    roi.cols = cfg.g_w/16;

    roi.delta_q[0] = 0;
    roi.delta_q[1] = -2;
    roi.delta_q[2] = -4;
    roi.delta_q[3] = -6;

    roi.delta_lf[0] = 0;
    roi.delta_lf[1] = 1;
    roi.delta_lf[2] = 2;
    roi.delta_lf[3] = 3;

    roi.static_threshold[0] = 1500;
    roi.static_threshold[1] = 1000;
    roi.static_threshold[2] =  500;
    roi.static_threshold[3] =    0;

    /* generate an ROI map for example */
    roi.roi_map = malloc(roi.rows * roi.cols);
    for(i=0;i<roi.rows*roi.cols;i++)
        roi.roi_map[i] = i & 3;

    if(vpx_codec_control(&codec, VP8E_SET_ROI_MAP, &roi))
        die_codec(&codec, "Failed to set ROI map");

    free(roi.roi_map);
} else if(frame_cnt + 1 == 33) {
    vpx_active_map_t  active;
    int               i;

    active.rows = cfg.g_h/16;
    active.cols = cfg.g_w/16;

    /* generate active map for example */
    active.active_map = malloc(active.rows * active.cols);
    for(i=0;i<active.rows*active.cols;i++)
        active.active_map[i] = i & 1;

    if(vpx_codec_control(&codec, VP8E_SET_ACTIVEMAP, &active))
        die_codec(&codec, "Failed to set active map");

    free(active.active_map);
} else if(frame_cnt + 1 == 44) {
    vpx_active_map_t  active;

    active.rows = cfg.g_h/16;
    active.cols = cfg.g_w/16;

    /* pass in null map to disable active_map*/
    active.active_map = NULL;

    if(vpx_codec_control(&codec, VP8E_SET_ACTIVEMAP, &active))
        die_codec(&codec, "Failed to set active map");
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  PER_FRAME_CFG


Observing The Effects
---------------------
Use the `simple_decoder` example to decode this sample, and observe
the change in the image at frames 22, 33, and 44.
