From d7d41ce133fa7369f7a5ea12bfc971c5ecafb3ba Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20K=C3=B6nig?= Date: Fri, 4 Apr 2014 14:22:16 +0200 Subject: [PATCH] vl: add interface for H264 B-frame encoding MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian König --- src/gallium/drivers/radeon/radeon_vce_40_2_2.c | 11 ++++++----- src/gallium/include/pipe/p_video_state.h | 3 +++ src/gallium/state_trackers/omx/vid_enc.c | 8 +++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c index c41b2d03ab8..33a58f3e8e9 100644 --- a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c +++ b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c @@ -156,8 +156,8 @@ static void pic_control(struct rvce_encoder *enc) RVCE_CS(0x00000040); // encConstraintSetFlags RVCE_CS(0x00000000); // encBPicPattern RVCE_CS(0x00000000); // weightPredModeBPicture - RVCE_CS(0x00000001); // encNumberOfReferenceFrames - RVCE_CS(0x00000001); // encMaxNumRefFrames + RVCE_CS(MIN2(enc->base.max_references, 2)); // encNumberOfReferenceFrames + RVCE_CS(enc->base.max_references + 1); // encMaxNumRefFrames RVCE_CS(0x00000000); // encNumDefaultActiveRefL0 RVCE_CS(0x00000000); // encNumDefaultActiveRefL1 RVCE_CS(0x00000000); // encSliceMode @@ -297,8 +297,9 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(0xffffffff); // chromaOffset } else if(enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_P) { - frame_offset(enc, enc->pic.frame_num - 1, &luma_offset, &chroma_offset); + frame_offset(enc, enc->pic.ref_idx_l0, &luma_offset, &chroma_offset); RVCE_CS(0x00000000); // encPicType + // TODO: Stores these in the CPB backtrack RVCE_CS(enc->pic.frame_num - 1); // frameNumber RVCE_CS(enc->pic.frame_num - 1); // pictureOrderCount RVCE_CS(luma_offset); // lumaOffset @@ -322,8 +323,8 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(0x00000000); // encReferenceRefBasePictureLumaOffset RVCE_CS(0x00000000); // encReferenceRefBasePictureChromaOffset RVCE_CS(0x00000000); // pictureCount - RVCE_CS(0x00000000); // frameNumber - RVCE_CS(0x00000000); // pictureOrderCount + RVCE_CS(enc->pic.frame_num); // frameNumber + RVCE_CS(enc->pic.pic_order_cnt); // pictureOrderCount RVCE_CS(0x00000000); // numIPicRemainInRCGOP RVCE_CS(0x00000000); // numPPicRemainInRCGOP RVCE_CS(0x00000000); // numBPicRemainInRCGOP diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index f9721dca05b..0256a8fa194 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -368,6 +368,9 @@ struct pipe_h264_enc_picture_desc enum pipe_h264_enc_picture_type picture_type; unsigned frame_num; + unsigned pic_order_cnt; + unsigned ref_idx_l0; + unsigned ref_idx_l1; }; #ifdef __cplusplus diff --git a/src/gallium/state_trackers/omx/vid_enc.c b/src/gallium/state_trackers/omx/vid_enc.c index 8ec04390628..080730bd294 100644 --- a/src/gallium/state_trackers/omx/vid_enc.c +++ b/src/gallium/state_trackers/omx/vid_enc.c @@ -769,11 +769,17 @@ static void enc_ControlPicture(omx_base_PortType *port, if (!(priv->frame_num % OMX_VID_ENC_IDR_PERIOD_DEFAULT) || priv->force_pic_type.IntraRefreshVOP) { picture->picture_type = PIPE_H264_ENC_PICTURE_TYPE_IDR; + picture->ref_idx_l0 = 0; + picture->ref_idx_l1 = 0; priv->frame_num = 0; - } else + } else { picture->picture_type = PIPE_H264_ENC_PICTURE_TYPE_P; + picture->ref_idx_l0 = priv->frame_num - 1; + picture->ref_idx_l1 = 0; + } picture->frame_num = priv->frame_num++; + picture->pic_order_cnt = picture->frame_num; priv->force_pic_type.IntraRefreshVOP = OMX_FALSE; } -- 2.30.2