X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=h264encode.cpp;h=35f34130ec014e7ec493d891336f81123a082e0e;hb=021c4779665c734dcde1f15a6d9b38a37820bb38;hp=4d7882a090f9f5d5c27953655b64c4d4d80023e9;hpb=408b03dbd380f3b2ea89fc20915c38bd4e4b9750;p=nageru diff --git a/h264encode.cpp b/h264encode.cpp index 4d7882a..35f3413 100644 --- a/h264encode.cpp +++ b/h264encode.cpp @@ -131,11 +131,9 @@ static int rc_default_modes[] = { VA_RC_VCM, VA_RC_NONE, }; -static unsigned long long current_frame_encoding = 0; static unsigned long long current_frame_display = 0; static unsigned long long current_IDR_display = 0; static unsigned int current_frame_num = 0; -static int current_frame_type; static int misc_priv_type = 0; static int misc_priv_value = 0; @@ -1210,11 +1208,11 @@ static void sort_two(VAPictureH264 ref[], int left, int right, unsigned int key, sort_one(ref, j+1, right, list1_ascending, frame_idx); } -static int update_ReferenceFrames(void) +static int update_ReferenceFrames(int frame_type) { int i; - if (current_frame_type == FRAME_B) + if (frame_type == FRAME_B) return 0; CurrentCurrPic.flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; @@ -1225,8 +1223,7 @@ static int update_ReferenceFrames(void) ReferenceFrames[i] = ReferenceFrames[i-1]; ReferenceFrames[0] = CurrentCurrPic; - if (current_frame_type != FRAME_B) - current_frame_num++; + current_frame_num++; if (current_frame_num > MaxFrameNum) current_frame_num = 0; @@ -1234,16 +1231,16 @@ static int update_ReferenceFrames(void) } -static int update_RefPicList(void) +static int update_RefPicList(int frame_type) { unsigned int current_poc = CurrentCurrPic.TopFieldOrderCnt; - if (current_frame_type == FRAME_P) { + if (frame_type == FRAME_P) { memcpy(RefPicList0_P, ReferenceFrames, numShortTerm * sizeof(VAPictureH264)); sort_one(RefPicList0_P, 0, numShortTerm-1, 0, 1); } - if (current_frame_type == FRAME_B) { + if (frame_type == FRAME_B) { memcpy(RefPicList0_B, ReferenceFrames, numShortTerm * sizeof(VAPictureH264)); sort_two(RefPicList0_B, 0, numShortTerm-1, current_poc, 0, 1, 0, 1); @@ -1337,13 +1334,13 @@ static int render_sequence(void) return 0; } -static int calc_poc(int pic_order_cnt_lsb) +static int calc_poc(int pic_order_cnt_lsb, int frame_type) { static int PicOrderCntMsb_ref = 0, pic_order_cnt_lsb_ref = 0; int prevPicOrderCntMsb, prevPicOrderCntLsb; int PicOrderCntMsb, TopFieldOrderCnt; - if (current_frame_type == FRAME_IDR) + if (frame_type == FRAME_IDR) prevPicOrderCntMsb = prevPicOrderCntLsb = 0; else { prevPicOrderCntMsb = PicOrderCntMsb_ref; @@ -1361,7 +1358,7 @@ static int calc_poc(int pic_order_cnt_lsb) TopFieldOrderCnt = PicOrderCntMsb + pic_order_cnt_lsb; - if (current_frame_type != FRAME_B) { + if (frame_type != FRAME_B) { PicOrderCntMsb_ref = PicOrderCntMsb; pic_order_cnt_lsb_ref = pic_order_cnt_lsb; } @@ -1369,7 +1366,7 @@ static int calc_poc(int pic_order_cnt_lsb) return TopFieldOrderCnt; } -static int render_picture(void) +static int render_picture(int frame_type) { VABufferID pic_param_buf; VAStatus va_status; @@ -1378,29 +1375,18 @@ static int render_picture(void) pic_param.CurrPic.picture_id = gl_surfaces[current_frame_display % SURFACE_NUM].ref_surface; pic_param.CurrPic.frame_idx = current_frame_num; pic_param.CurrPic.flags = 0; - pic_param.CurrPic.TopFieldOrderCnt = calc_poc((current_frame_display - current_IDR_display) % MaxPicOrderCntLsb); + pic_param.CurrPic.TopFieldOrderCnt = calc_poc((current_frame_display - current_IDR_display) % MaxPicOrderCntLsb, frame_type); pic_param.CurrPic.BottomFieldOrderCnt = pic_param.CurrPic.TopFieldOrderCnt; CurrentCurrPic = pic_param.CurrPic; - if (getenv("TO_DEL")) { /* set RefPicList into ReferenceFrames */ - update_RefPicList(); /* calc RefPicList */ - memset(pic_param.ReferenceFrames, 0xff, 16 * sizeof(VAPictureH264)); /* invalid all */ - if (current_frame_type == FRAME_P) { - pic_param.ReferenceFrames[0] = RefPicList0_P[0]; - } else if (current_frame_type == FRAME_B) { - pic_param.ReferenceFrames[0] = RefPicList0_B[0]; - pic_param.ReferenceFrames[1] = RefPicList1_B[0]; - } - } else { - memcpy(pic_param.ReferenceFrames, ReferenceFrames, numShortTerm*sizeof(VAPictureH264)); - for (i = numShortTerm; i < SURFACE_NUM; i++) { - pic_param.ReferenceFrames[i].picture_id = VA_INVALID_SURFACE; - pic_param.ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID; - } + memcpy(pic_param.ReferenceFrames, ReferenceFrames, numShortTerm*sizeof(VAPictureH264)); + for (i = numShortTerm; i < SURFACE_NUM; i++) { + pic_param.ReferenceFrames[i].picture_id = VA_INVALID_SURFACE; + pic_param.ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID; } - pic_param.pic_fields.bits.idr_pic_flag = (current_frame_type == FRAME_IDR); - pic_param.pic_fields.bits.reference_pic_flag = (current_frame_type != FRAME_B); + pic_param.pic_fields.bits.idr_pic_flag = (frame_type == FRAME_IDR); + pic_param.pic_fields.bits.reference_pic_flag = (frame_type != FRAME_B); pic_param.pic_fields.bits.entropy_coding_mode_flag = h264_entropy_mode; pic_param.pic_fields.bits.deblocking_filter_control_present_flag = 1; pic_param.frame_num = current_frame_num; @@ -1525,22 +1511,22 @@ static void render_packedslice() free(packedslice_buffer); } -static int render_slice(void) +static int render_slice(int encoding_frame_num, int frame_type) { VABufferID slice_param_buf; VAStatus va_status; int i; - update_RefPicList(); + update_RefPicList(frame_type); /* one frame, one slice */ slice_param.macroblock_address = 0; slice_param.num_macroblocks = frame_width_mbaligned * frame_height_mbaligned/(16*16); /* Measured by MB */ - slice_param.slice_type = (current_frame_type == FRAME_IDR)?2:current_frame_type; - if (current_frame_type == FRAME_IDR) { - if (current_frame_encoding != 0) + slice_param.slice_type = (frame_type == FRAME_IDR)?2:frame_type; + if (frame_type == FRAME_IDR) { + if (encoding_frame_num != 0) ++slice_param.idr_pic_id; - } else if (current_frame_type == FRAME_P) { + } else if (frame_type == FRAME_P) { int refpiclist0_max = h264_maxref & 0xffff; memcpy(slice_param.RefPicList0, RefPicList0_P, refpiclist0_max*sizeof(VAPictureH264)); @@ -1548,7 +1534,7 @@ static int render_slice(void) slice_param.RefPicList0[i].picture_id = VA_INVALID_SURFACE; slice_param.RefPicList0[i].flags = VA_PICTURE_H264_INVALID; } - } else if (current_frame_type == FRAME_B) { + } else if (frame_type == FRAME_B) { int refpiclist0_max = h264_maxref & 0xffff; int refpiclist1_max = (h264_maxref >> 16) & 0xffff; @@ -1780,7 +1766,6 @@ H264Encoder::H264Encoder(QSurface *surface, int width, int height, HTTPD *httpd) frame_width_mbaligned = (frame_width + 15) & (~15); frame_height_mbaligned = (frame_height + 15) & (~15); frame_bitrate = 15000000; // / 60; - current_frame_encoding = 0; //print_input(); @@ -1914,12 +1899,13 @@ void H264Encoder::end_frame(RefCountedGLsync fence, int64_t pts, const vector