From b3ad853a2c9d40064b6e8c65ade4b671f1b8d8ad Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Tue, 27 May 2014 10:12:02 -0400 Subject: st/omx/enc: implement restricted b frames pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Leo Liu Reviewed-by: Christian König --- src/gallium/state_trackers/omx/vid_enc.c | 11 +++++++++-- src/gallium/state_trackers/omx/vid_enc.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'src/gallium/state_trackers/omx') diff --git a/src/gallium/state_trackers/omx/vid_enc.c b/src/gallium/state_trackers/omx/vid_enc.c index ee31452a3e8..e64928bd6d7 100644 --- a/src/gallium/state_trackers/omx/vid_enc.c +++ b/src/gallium/state_trackers/omx/vid_enc.c @@ -259,6 +259,7 @@ static OMX_ERRORTYPE vid_enc_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam priv->force_pic_type.IntraRefreshVOP = OMX_FALSE; priv->frame_num = 0; priv->pic_order_cnt = 0; + priv->restricted_b_frames = debug_get_bool_option("OMX_USE_RESTRICTED_B_FRAMES", FALSE); priv->scale.xWidth = OMX_VID_ENC_SCALING_WIDTH_DEFAULT; priv->scale.xHeight = OMX_VID_ENC_SCALING_WIDTH_DEFAULT; @@ -994,6 +995,8 @@ static void enc_HandleTask(omx_base_PortType *port, struct encode_task *task, picture.picture_type = picture_type; picture.pic_order_cnt = task->pic_order_cnt; + if (priv->restricted_b_frames && picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) + picture.not_referenced = true; enc_ControlPicture(port, &picture); /* -------------- encode frame --------- */ @@ -1023,7 +1026,9 @@ static void enc_ClearBframes(omx_base_PortType *port, struct input_buf_private * /* handle B frames */ LIST_FOR_EACH_ENTRY(task, &priv->b_frames, list) { enc_HandleTask(port, task, PIPE_H264_ENC_PICTURE_TYPE_B); - priv->ref_idx_l0 = priv->frame_num++; + if (!priv->restricted_b_frames) + priv->ref_idx_l0 = priv->frame_num; + priv->frame_num++; } enc_MoveTasks(&priv->b_frames, &inp->tasks); @@ -1091,7 +1096,9 @@ static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEAD /* handle B frames */ LIST_FOR_EACH_ENTRY(task, &priv->b_frames, list) { enc_HandleTask(port, task, PIPE_H264_ENC_PICTURE_TYPE_B); - priv->ref_idx_l0 = priv->frame_num++; + if (!priv->restricted_b_frames) + priv->ref_idx_l0 = priv->frame_num; + priv->frame_num++; } enc_MoveTasks(&priv->b_frames, &inp->tasks); diff --git a/src/gallium/state_trackers/omx/vid_enc.h b/src/gallium/state_trackers/omx/vid_enc.h index 22f276faa6d..d0350d6b495 100644 --- a/src/gallium/state_trackers/omx/vid_enc.h +++ b/src/gallium/state_trackers/omx/vid_enc.h @@ -77,6 +77,7 @@ DERIVEDCLASS(vid_enc_PrivateType, omx_base_filter_PrivateType) OMX_U32 frame_num; \ OMX_U32 pic_order_cnt; \ OMX_U32 ref_idx_l0, ref_idx_l1; \ + OMX_BOOL restricted_b_frames; \ OMX_VIDEO_PARAM_BITRATETYPE bitrate; \ OMX_VIDEO_PARAM_QUANTIZATIONTYPE quant; \ OMX_CONFIG_INTRAREFRESHVOPTYPE force_pic_type; \ -- cgit v1.2.3