Rebase VP8 encode middleware due to new libva interface.
BZ: 125303
Add init_qp for VP8 encode in libmix layer;re-construct SPS/PPS data according to
new libva interface;add rendering HRD/RC Param/FrameRate function.
Change-Id: I7eaea105c1be582a665b052e226da47eba4a9dc6
Signed-off-by: Liu Bolun <bolun.liu@intel.com>
Signed-off-by: pingshix <pingx.shi@intel.com>
Signed-off-by: pingshix <pingx.shi@intel.com>
Reviewed-on: http://android.intel.com:8080/122111
Reviewed-by: buildbot <buildbot@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
diff --git a/videoencoder/VideoEncoderDef.h b/videoencoder/VideoEncoderDef.h
index 08f9e7a..426db02 100644
--- a/videoencoder/VideoEncoderDef.h
+++ b/videoencoder/VideoEncoderDef.h
@@ -594,6 +594,7 @@
uint32_t kf_max_dist;
uint32_t min_qp;
uint32_t max_qp;
+ uint32_t init_qp;
uint32_t rc_undershoot;
uint32_t rc_overshoot;
uint32_t hrd_buf_size;
diff --git a/videoencoder/VideoEncoderVP8.cpp b/videoencoder/VideoEncoderVP8.cpp
index 84a0746..e8a05e1 100644
--- a/videoencoder/VideoEncoderVP8.cpp
+++ b/videoencoder/VideoEncoderVP8.cpp
@@ -24,6 +24,7 @@
mVideoParamsVP8.kf_max_dist = 30;
mVideoParamsVP8.min_qp = 4;
mVideoParamsVP8.max_qp = 63;
+ mVideoParamsVP8.init_qp = 26;
mVideoParamsVP8.rc_undershoot = 100;
mVideoParamsVP8.rc_overshoot = 100;
mVideoParamsVP8.hrd_buf_size = 6000;
@@ -51,26 +52,16 @@
Encode_Status ret = ENCODE_SUCCESS;
VAStatus vaStatus = VA_STATUS_SUCCESS;
VAEncSequenceParameterBufferVP8 vp8SeqParam;
- uint32_t frameRateNum = mComParams.frameRate.frameRateNum;
- uint32_t frameRateDenom = mComParams.frameRate.frameRateDenom;
+
LOG_V( "Begin\n");
vp8SeqParam.frame_width = mComParams.resolution.width;
vp8SeqParam.frame_height = mComParams.resolution.height;
- vp8SeqParam.frame_rate = (unsigned int) (frameRateNum + frameRateDenom /2) / frameRateDenom;
vp8SeqParam.error_resilient = mVideoParamsVP8.error_resilient;
vp8SeqParam.kf_auto = mVideoParamsVP8.kf_auto;
vp8SeqParam.kf_min_dist = mVideoParamsVP8.kf_min_dist;
vp8SeqParam.kf_max_dist = mVideoParamsVP8.kf_max_dist;
vp8SeqParam.bits_per_second = mComParams.rcParams.bitRate;
- vp8SeqParam.min_qp = mVideoParamsVP8.min_qp;
- vp8SeqParam.max_qp = mVideoParamsVP8.max_qp;
- vp8SeqParam.rc_undershoot = mVideoParamsVP8.rc_undershoot;
- vp8SeqParam.rc_overshoot = mVideoParamsVP8.rc_overshoot;
- vp8SeqParam.hrd_buf_size = mVideoParamsVP8.hrd_buf_size;
- vp8SeqParam.hrd_buf_initial_fullness = mVideoParamsVP8.hrd_buf_initial_fullness;
- vp8SeqParam.hrd_buf_optimal_fullness = mVideoParamsVP8.hrd_buf_optimal_fullness;
-// memcpy(vp8SeqParam.reference_frames, mVP8InternalFrames, sizeof(mVP8InternalFrames));
memcpy(vp8SeqParam.reference_frames, mAutoRefSurfaces, sizeof(mAutoRefSurfaces) * mAutoReferenceSurfaceNum);
vaStatus = vaCreateBuffer(
@@ -95,17 +86,19 @@
LOG_V( "Begin\n");
vp8PicParam.coded_buf = task->coded_buffer;
- vp8PicParam.pic_flags.bits.force_kf = mVideoConfigVP8.force_kf;
- vp8PicParam.pic_flags.bits.no_ref_last = mVideoConfigVP8.no_ref_last;
- vp8PicParam.pic_flags.bits.no_ref_gf = mVideoConfigVP8.no_ref_gf;
- vp8PicParam.pic_flags.bits.no_ref_arf = mVideoConfigVP8.no_ref_arf;
+ vp8PicParam.pic_flags.value = 0;
+ vp8PicParam.ref_flags.bits.force_kf = mVideoConfigVP8.force_kf; //0;
+ if(!vp8PicParam.ref_flags.bits.force_kf) {
+ vp8PicParam.ref_flags.bits.no_ref_last = mVideoConfigVP8.no_ref_last;
+ vp8PicParam.ref_flags.bits.no_ref_arf = mVideoConfigVP8.no_ref_arf;
+ vp8PicParam.ref_flags.bits.no_ref_gf = mVideoConfigVP8.no_ref_gf;
+ }
+ vp8PicParam.pic_flags.bits.refresh_entropy_probs = 0;
+ vp8PicParam.sharpness_level = 2;
+ vp8PicParam.pic_flags.bits.num_token_partitions = 2;
vp8PicParam.pic_flags.bits.refresh_last = mVideoConfigVP8.refresh_last;
vp8PicParam.pic_flags.bits.refresh_golden_frame = mVideoConfigVP8.refresh_golden_frame;
vp8PicParam.pic_flags.bits.refresh_alternate_frame = mVideoConfigVP8.refresh_alternate_frame;
- vp8PicParam.pic_flags.bits.refresh_entropy_probs = mVideoConfigVP8.refresh_entropy_probs;
- vp8PicParam.pic_flags.bits.num_token_partitions = 2;
-// vp8PicParam.pic_flags.value = mVideoConfigVP8.value;
- vp8PicParam.sharpness_level = mVideoConfigVP8.sharpness_level;
vaStatus = vaCreateBuffer(
mVADisplay, mVAContext,
@@ -122,44 +115,92 @@
return ret;
}
-Encode_Status VideoEncoderVP8::renderSliceParams(EncodeTask *task) {
+Encode_Status VideoEncoderVP8::renderRCParams(void)
+{
+ VABufferID rc_param_buf;
+ VAStatus vaStatus = VA_STATUS_SUCCESS;
+ VAEncMiscParameterBuffer *misc_param, *misc_param_tmp;
+ VAEncMiscParameterRateControl *misc_rate_ctrl;
- VAStatus vaStatus = VA_STATUS_SUCCESS;
- uint32_t sliceHeight;
- uint32_t sliceHeightInMB;
-
- VAEncSliceParameterBuffer sliceParams;
-
- LOG_V( "Begin\n\n");
-
- sliceHeight = mComParams.resolution.height;
- sliceHeight += 15;
- sliceHeight &= (~15);
- sliceHeightInMB = sliceHeight / 16;
-
- sliceParams.start_row_number = 0;
- sliceParams.slice_height = sliceHeightInMB;
- sliceParams.slice_flags.bits.is_intra = (task->type == FTYPE_I)?1:0;
- sliceParams.slice_flags.bits.disable_deblocking_filter_idc = 0;
-
- LOG_V("======VP8 slice params======\n");
- LOG_I( "start_row_number = %d\n", (int) sliceParams.start_row_number);
- LOG_I( "sliceHeightInMB = %d\n", (int) sliceParams.slice_height);
- LOG_I( "is_intra = %d\n", (int) sliceParams.slice_flags.bits.is_intra);
-
- vaStatus = vaCreateBuffer(
- mVADisplay, mVAContext,
- VAEncSliceParameterBufferType,
- sizeof(VAEncSliceParameterBuffer),
- 1, &sliceParams,
- &mSliceParamBuf);
+ vaStatus = vaCreateBuffer(mVADisplay, mVAContext,
+ VAEncMiscParameterBufferType,
+ sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),
+ 1,NULL,&rc_param_buf);
CHECK_VA_STATUS_RETURN("vaCreateBuffer");
- vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSliceParamBuf, 1);
- CHECK_VA_STATUS_RETURN("vaRenderPicture");
+ vaMapBuffer(mVADisplay, rc_param_buf,(void **)&misc_param);
- LOG_V( "end\n");
- return ENCODE_SUCCESS;
+ misc_param->type = VAEncMiscParameterTypeRateControl;
+ misc_rate_ctrl = (VAEncMiscParameterRateControl *)misc_param->data;
+ memset(misc_rate_ctrl, 0, sizeof(*misc_rate_ctrl));
+ misc_rate_ctrl->bits_per_second = mComParams.rcParams.bitRate;
+ misc_rate_ctrl->target_percentage = 100;
+ misc_rate_ctrl->window_size = 1000;
+ misc_rate_ctrl->initial_qp = mVideoParamsVP8.init_qp;
+ misc_rate_ctrl->min_qp = mVideoParamsVP8.min_qp;
+ misc_rate_ctrl->basic_unit_size = 0;
+ misc_rate_ctrl->max_qp = mVideoParamsVP8.max_qp;
+
+ vaUnmapBuffer(mVADisplay, rc_param_buf);
+
+ vaStatus = vaRenderPicture(mVADisplay,mVAContext, &rc_param_buf, 1);
+ CHECK_VA_STATUS_RETURN("vaRenderPicture");;
+ return 0;
+}
+
+Encode_Status VideoEncoderVP8::renderFrameRateParams(void)
+{
+ VABufferID framerate_param_buf;
+ VAStatus vaStatus = VA_STATUS_SUCCESS;
+ VAEncMiscParameterBuffer *misc_param, *misc_param_tmp;
+ VAEncMiscParameterFrameRate * misc_framerate;
+ uint32_t frameRateNum = mComParams.frameRate.frameRateNum;
+ uint32_t frameRateDenom = mComParams.frameRate.frameRateDenom;
+
+ vaStatus = vaCreateBuffer(mVADisplay, mVAContext,
+ VAEncMiscParameterBufferType,
+ sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterFrameRate),
+ 1,NULL,&framerate_param_buf);
+ CHECK_VA_STATUS_RETURN("vaCreateBuffer");
+
+ vaMapBuffer(mVADisplay, framerate_param_buf,(void **)&misc_param);
+ misc_param->type = VAEncMiscParameterTypeFrameRate;
+ misc_framerate = (VAEncMiscParameterFrameRate *)misc_param->data;
+ memset(misc_framerate, 0, sizeof(*misc_framerate));
+ misc_framerate->framerate = (unsigned int) (frameRateNum + frameRateDenom /2) / frameRateDenom;
+ vaUnmapBuffer(mVADisplay, framerate_param_buf);
+
+ vaStatus = vaRenderPicture(mVADisplay,mVAContext, &framerate_param_buf, 1);
+ CHECK_VA_STATUS_RETURN("vaRenderPicture");;
+
+ return 0;
+}
+
+Encode_Status VideoEncoderVP8::renderHRDParams(void)
+{
+ VABufferID hrd_param_buf;
+ VAStatus vaStatus = VA_STATUS_SUCCESS;
+ VAEncMiscParameterBuffer *misc_param, *misc_param_tmp;
+ VAEncMiscParameterHRD * misc_hrd; //*misc_rate_ctrl;
+ vaStatus = vaCreateBuffer(mVADisplay, mVAContext,
+ VAEncMiscParameterBufferType,
+ sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterHRD),
+ 1,NULL,&hrd_param_buf);
+ CHECK_VA_STATUS_RETURN("vaCreateBuffer");
+
+ vaMapBuffer(mVADisplay, hrd_param_buf,(void **)&misc_param);
+ misc_param->type = VAEncMiscParameterTypeHRD;
+ misc_hrd = (VAEncMiscParameterHRD *)misc_param->data;
+ memset(misc_hrd, 0, sizeof(*misc_hrd));
+ misc_hrd->buffer_size = 6000;
+ misc_hrd->initial_buffer_fullness = 4000;
+ misc_hrd->optimal_buffer_fullness = 5000;
+ vaUnmapBuffer(mVADisplay, hrd_param_buf);
+
+ vaStatus = vaRenderPicture(mVADisplay,mVAContext, &hrd_param_buf, 1);
+ CHECK_VA_STATUS_RETURN("vaRenderPicture");;
+
+ return 0;
}
@@ -169,6 +210,9 @@
LOG_V( "Begin\n");
if (mFrameNum == 0) {
+ ret = renderFrameRateParams();
+ ret = renderRCParams();
+ ret = renderHRDParams();
ret = renderSequenceParams();
CHECK_ENCODE_STATUS_RETURN("renderSequenceParams");
}
@@ -176,9 +220,6 @@
ret = renderPictureParams(task);
CHECK_ENCODE_STATUS_RETURN("renderPictureParams");
- ret = renderSliceParams(task);
- CHECK_ENCODE_STATUS_RETURN("renderSliceParams");
-
LOG_V( "End\n");
return ret;
}
diff --git a/videoencoder/VideoEncoderVP8.h b/videoencoder/VideoEncoderVP8.h
index ebf2df9..efc3199 100644
--- a/videoencoder/VideoEncoderVP8.h
+++ b/videoencoder/VideoEncoderVP8.h
@@ -35,7 +35,10 @@
private:
Encode_Status renderSequenceParams();
Encode_Status renderPictureParams(EncodeTask *task);
- Encode_Status renderSliceParams(EncodeTask *task);
+ Encode_Status renderRCParams(void);
+ Encode_Status renderHRDParams(void);
+ Encode_Status renderFrameRateParams(void);
+
VideoConfigVP8 mVideoConfigVP8;
VideoParamsVP8 mVideoParamsVP8;