VA_RC_VCM,
VA_RC_NONE,
};
-static unsigned long long current_IDR_display = 0;
static unsigned int current_frame_num = 0;
static int misc_priv_type = 0;
return TopFieldOrderCnt;
}
-static int render_picture(int frame_type, int display_frame_num)
+static int render_picture(int frame_type, int display_frame_num, int gop_start_display_frame_num)
{
VABufferID pic_param_buf;
VAStatus va_status;
pic_param.CurrPic.picture_id = gl_surfaces[display_frame_num % SURFACE_NUM].ref_surface;
pic_param.CurrPic.frame_idx = current_frame_num;
pic_param.CurrPic.flags = 0;
- pic_param.CurrPic.TopFieldOrderCnt = calc_poc((display_frame_num - current_IDR_display) % MaxPicOrderCntLsb, frame_type);
+ pic_param.CurrPic.TopFieldOrderCnt = calc_poc((display_frame_num - gop_start_display_frame_num) % MaxPicOrderCntLsb, frame_type);
pic_param.CurrPic.BottomFieldOrderCnt = pic_param.CurrPic.TopFieldOrderCnt;
CurrentCurrPic = pic_param.CurrPic;
free(packedslice_buffer);
}
-static int render_slice(int encoding_frame_num, int display_frame_num, int frame_type)
+static int render_slice(int encoding_frame_num, int display_frame_num, int gop_start_display_frame_num, int frame_type)
{
VABufferID slice_param_buf;
VAStatus va_status;
slice_param.slice_alpha_c0_offset_div2 = 0;
slice_param.slice_beta_offset_div2 = 0;
slice_param.direct_spatial_mv_pred_flag = 1;
- slice_param.pic_order_cnt_lsb = (display_frame_num - current_IDR_display) % MaxPicOrderCntLsb;
+ slice_param.pic_order_cnt_lsb = (display_frame_num - gop_start_display_frame_num) % MaxPicOrderCntLsb;
if (h264_packedheader &&
void H264Encoder::copy_thread_func()
{
int64_t last_dts = -1;
+ int gop_start_display_frame_num = 0;
for (int encoding_frame_num = 0; ; ++encoding_frame_num) {
PendingFrame frame;
int pts_lag;
if (frame_type == FRAME_IDR) {
numShortTerm = 0;
current_frame_num = 0;
- current_IDR_display = display_frame_num;
+ gop_start_display_frame_num = display_frame_num;
}
{
}
last_dts = dts;
- encode_frame(frame, encoding_frame_num, display_frame_num, frame_type, frame.pts, dts);
+ encode_frame(frame, encoding_frame_num, display_frame_num, gop_start_display_frame_num, frame_type, frame.pts, dts);
}
}
-void H264Encoder::encode_frame(H264Encoder::PendingFrame frame, int encoding_frame_num, int display_frame_num,
+void H264Encoder::encode_frame(H264Encoder::PendingFrame frame, int encoding_frame_num, int display_frame_num, int gop_start_display_frame_num,
int frame_type, int64_t pts, int64_t dts)
{
// Wait for the GPU to be done with the frame.
if (frame_type == FRAME_IDR) {
render_sequence();
- render_picture(frame_type, display_frame_num);
+ render_picture(frame_type, display_frame_num, gop_start_display_frame_num);
if (h264_packedheader) {
render_packedsequence();
render_packedpicture();
}
} else {
//render_sequence();
- render_picture(frame_type, display_frame_num);
+ render_picture(frame_type, display_frame_num, gop_start_display_frame_num);
}
- render_slice(encoding_frame_num, display_frame_num, frame_type);
+ render_slice(encoding_frame_num, display_frame_num, gop_start_display_frame_num, frame_type);
va_status = vaEndPicture(va_dpy, context_id);
CHECK_VASTATUS(va_status, "vaEndPicture");