msm: vidc: Add support for MBI extradata

Macro Block Information extradata (if enabled) allows interested
clients to query for metadata about each macroblock.

Change-Id: Icfee32770018338e28ae149e1ccb654f5a48cbec
Signed-off-by: Deva Ramasubramanian <dramasub@codeaurora.org>
This commit is contained in:
Deva Ramasubramanian
2014-01-31 14:04:59 -08:00
committed by Arun Menon
parent 0df9252879
commit fbd85b747c
8 changed files with 40 additions and 12 deletions
@@ -369,6 +369,9 @@ static int get_hfi_extradata_index(enum hal_extradata_id index)
case HAL_EXTRADATA_LTR_INFO:
ret = HFI_PROPERTY_PARAM_VENC_LTR_INFO;
break;
case HAL_EXTRADATA_METADATA_MBI:
ret = HFI_PROPERTY_PARAM_VENC_MBI_DUMPING;
break;
default:
dprintk(VIDC_WARN, "Extradata index not found: %d\n", index);
break;
+18 -12
View File
@@ -116,6 +116,7 @@ static const char *const mpeg_video_vidc_extradata[] = {
"Extradata input crop",
"Extradata digital zoom",
"Extradata aspect ratio",
"Extradata macroblock metadata",
};
static const char *const perf_level[] = {
@@ -654,7 +655,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
.name = "Extradata Type",
.type = V4L2_CTRL_TYPE_MENU,
.minimum = V4L2_MPEG_VIDC_EXTRADATA_NONE,
.maximum = V4L2_MPEG_VIDC_EXTRADATA_LTR,
.maximum = V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI,
.default_value = V4L2_MPEG_VIDC_EXTRADATA_NONE,
.menu_skip_mask = ~(
(1 << V4L2_MPEG_VIDC_EXTRADATA_NONE) |
@@ -675,7 +676,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
(1 << V4L2_MPEG_VIDC_INDEX_EXTRADATA_INPUT_CROP) |
(1 << V4L2_MPEG_VIDC_INDEX_EXTRADATA_DIGITAL_ZOOM) |
(1 << V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO) |
(1 << V4L2_MPEG_VIDC_EXTRADATA_LTR)
(1 << V4L2_MPEG_VIDC_EXTRADATA_LTR) |
(1 << V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI)
),
.qmenu = mpeg_video_vidc_extradata,
.step = 0,
@@ -884,29 +886,33 @@ static int msm_venc_queue_setup(struct vb2_queue *q,
*num_buffers = buff_req->buffer_count_actual =
max(*num_buffers, buff_req->buffer_count_actual);
}
if (*num_buffers < MIN_NUM_CAPTURE_BUFFERS)
*num_buffers = MIN_NUM_CAPTURE_BUFFERS;
if (*num_buffers > VIDEO_MAX_FRAME) {
dprintk(VIDC_ERR,
"Changing buffers requested, from %d to max"\
" supported (%d) best effort encoding\n",
*num_buffers, VIDEO_MAX_FRAME);
*num_buffers = VIDEO_MAX_FRAME;
if (*num_buffers < MIN_NUM_CAPTURE_BUFFERS ||
*num_buffers > VIDEO_MAX_FRAME) {
int temp = *num_buffers;
*num_buffers = clamp_val(*num_buffers,
MIN_NUM_CAPTURE_BUFFERS,
VIDEO_MAX_FRAME);
dprintk(VIDC_INFO,
"Changing buffer count on CAPTURE_MPLANE from %d to %d for best effort encoding\n",
temp, *num_buffers);
}
ctrl = v4l2_ctrl_find(&inst->ctrl_handler,
V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA);
if (ctrl)
extradata = v4l2_ctrl_g_ctrl(ctrl);
if ((extradata == V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO) ||
(extradata == V4L2_MPEG_VIDC_EXTRADATA_LTR))
if (extradata != V4L2_MPEG_VIDC_EXTRADATA_NONE)
*num_planes = *num_planes + 1;
inst->fmts[CAPTURE_PORT]->num_planes = *num_planes;
for (i = 0; i < *num_planes; i++) {
sizes[i] = inst->fmts[CAPTURE_PORT]->get_frame_size(
i, inst->prop.height[CAPTURE_PORT],
inst->prop.width[CAPTURE_PORT]);
}
property_id = HAL_PARAM_BUFFER_COUNT_ACTUAL;
new_buf_count.buffer_type = HAL_BUFFER_OUTPUT;
new_buf_count.buffer_count_actual = *num_buffers;
@@ -3149,6 +3149,9 @@ enum hal_extradata_id msm_comm_get_hal_extradata_index(
case V4L2_MPEG_VIDC_EXTRADATA_LTR:
ret = HAL_EXTRADATA_LTR_INFO;
break;
case V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI:
ret = HAL_EXTRADATA_METADATA_MBI;
break;
default:
dprintk(VIDC_WARN, "Extradata not found: %d\n", index);
break;
@@ -228,6 +228,8 @@ struct hfi_extradata_header {
(HFI_PROPERTY_PARAM_VENC_OX_START + 0x002)
#define HFI_PROPERTY_PARAM_VENC_LTR_INFO \
(HFI_PROPERTY_PARAM_VENC_OX_START + 0x003)
#define HFI_PROPERTY_PARAM_VENC_MBI_DUMPING \
(HFI_PROPERTY_PARAM_VENC_OX_START + 0x005)
#define HFI_PROPERTY_CONFIG_VENC_OX_START \
(HFI_DOMAIN_BASE_VENC + HFI_ARCH_OX_OFFSET + 0x6000)
@@ -101,6 +101,7 @@ enum hal_extradata_id {
HAL_EXTRADATA_FRAME_QP,
HAL_EXTRADATA_FRAME_BITS_INFO,
HAL_EXTRADATA_LTR_INFO,
HAL_EXTRADATA_METADATA_MBI,
};
enum hal_property {
+1
View File
@@ -59,6 +59,7 @@
#define VEN_EXTRADATA_QCOMFILLER 0x002
#define VEN_EXTRADATA_SLICEINFO 0x100
#define VEN_EXTRADATA_LTRINFO 0x200
#define VEN_EXTRADATA_MBINFO 0x400
/*ENCODER CONFIGURATION CONSTANTS*/
+1
View File
@@ -1845,6 +1845,7 @@ enum v4l2_mpeg_vidc_extradata {
V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP,
V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO,
V4L2_MPEG_VIDC_EXTRADATA_LTR,
V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI,
};
#define V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL (V4L2_CID_MPEG_MSM_VIDC_BASE + 26)
+11
View File
@@ -96,6 +96,16 @@ int msm_vidc_smem_get_domain_partition(void *instance,
int *domain_num, int *partition_num);
void *msm_vidc_smem_get_client(void *instance);
#endif
struct msm_vidc_extradata_header {
unsigned int size;
unsigned int:32; /** Keeping binary compatibility */
unsigned int:32; /* with firmware and OpenMAX IL **/
unsigned int type; /* msm_vidc_extradata_type */
unsigned int data_size;
unsigned char data[1];
};
struct msm_vidc_interlace_payload {
unsigned int format;
};
@@ -189,6 +199,7 @@ enum msm_vidc_extradata_type {
EXTRADATA_ASPECT_RATIO = 0x7F100003,
EXTRADATA_METADATA_FILLER = 0x7FE00002,
MSM_VIDC_EXTRADATA_METADATA_LTR = 0x7F100004,
EXTRADATA_METADATA_MBI = 0x7F100005,
};
enum msm_vidc_interlace_type {
INTERLACE_FRAME_PROGRESSIVE = 0x01,