97 строки
3.0 KiB
Plaintext
97 строки
3.0 KiB
Plaintext
@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.
|