]> git.sesse.net Git - nageru/commitdiff
In QuickSyncEncoderImpl, make RefPicList* local variables; no need to hold permanent...
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 26 Feb 2017 21:28:21 +0000 (22:28 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 26 Feb 2017 21:28:21 +0000 (22:28 +0100)
quicksync_encoder.cpp
quicksync_encoder_impl.h

index f0ec210709354f621efa2f228390dca02ec8b703..0c74c73928affaa2cb02201dbd4c52c53fbad95d 100644 (file)
@@ -1046,30 +1046,30 @@ void QuickSyncEncoderImpl::update_ReferenceFrames(int frame_type)
 }
 
 
-int QuickSyncEncoderImpl::update_RefPicList(int frame_type)
+void QuickSyncEncoderImpl::update_RefPicList_P(VAPictureH264 RefPicList0_P[MAX_NUM_REF2])
 {
     const auto descending_by_frame_idx = [](const VAPictureH264 &a, const VAPictureH264 &b) {
         return a.frame_idx > b.frame_idx;
     };
+
+    memcpy(RefPicList0_P, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
+    sort(&RefPicList0_P[0], &RefPicList0_P[numShortTerm], descending_by_frame_idx);
+}
+
+void QuickSyncEncoderImpl::update_RefPicList_B(VAPictureH264 RefPicList0_B[MAX_NUM_REF2], VAPictureH264 RefPicList1_B[MAX_NUM_REF2])
+{
     const auto ascending_by_top_field_order_cnt = [](const VAPictureH264 &a, const VAPictureH264 &b) {
         return a.TopFieldOrderCnt < b.TopFieldOrderCnt;
     };
     const auto descending_by_top_field_order_cnt = [](const VAPictureH264 &a, const VAPictureH264 &b) {
         return a.TopFieldOrderCnt > b.TopFieldOrderCnt;
     };
-    
-    if (frame_type == FRAME_P) {
-        memcpy(RefPicList0_P, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
-        sort(&RefPicList0_P[0], &RefPicList0_P[numShortTerm], descending_by_frame_idx);
-    } else if (frame_type == FRAME_B) {
-        memcpy(RefPicList0_B, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
-        sort_two(&RefPicList0_B[0], &RefPicList0_B[numShortTerm], CurrentCurrPic, ascending_by_top_field_order_cnt);
 
-        memcpy(RefPicList1_B, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
-        sort_two(&RefPicList1_B[0], &RefPicList1_B[numShortTerm], CurrentCurrPic, descending_by_top_field_order_cnt);
-    }
-    
-    return 0;
+    memcpy(RefPicList0_B, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
+    sort_two(&RefPicList0_B[0], &RefPicList0_B[numShortTerm], CurrentCurrPic, ascending_by_top_field_order_cnt);
+
+    memcpy(RefPicList1_B, ReferenceFrames, numShortTerm * sizeof(VAPictureH264));
+    sort_two(&RefPicList1_B[0], &RefPicList1_B[numShortTerm], CurrentCurrPic, descending_by_top_field_order_cnt);
 }
 
 
@@ -1322,8 +1322,6 @@ int QuickSyncEncoderImpl::render_slice(int encoding_frame_num, int display_frame
     VAStatus va_status;
     int i;
 
-    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 */
@@ -1332,6 +1330,9 @@ int QuickSyncEncoderImpl::render_slice(int encoding_frame_num, int display_frame
         if (encoding_frame_num != 0)
             ++slice_param.idr_pic_id;
     } else if (frame_type == FRAME_P) {
+        VAPictureH264 RefPicList0_P[MAX_NUM_REF2];
+        update_RefPicList_P(RefPicList0_P);
+
         int refpiclist0_max = h264_maxref & 0xffff;
         memcpy(slice_param.RefPicList0, RefPicList0_P, refpiclist0_max*sizeof(VAPictureH264));
 
@@ -1340,6 +1341,9 @@ int QuickSyncEncoderImpl::render_slice(int encoding_frame_num, int display_frame
             slice_param.RefPicList0[i].flags = VA_PICTURE_H264_INVALID;
         }
     } else if (frame_type == FRAME_B) {
+        VAPictureH264 RefPicList0_B[MAX_NUM_REF2], RefPicList1_B[MAX_NUM_REF2];
+        update_RefPicList_B(RefPicList0_B, RefPicList1_B);
+
         int refpiclist0_max = h264_maxref & 0xffff;
         int refpiclist1_max = (h264_maxref >> 16) & 0xffff;
 
index 72eb3b68d97bc4b5168082db9e0c0a8d6640f1cc..f2cdd2eb95dc91f9455a2a8a657bbc89ef9f7138 100644 (file)
@@ -92,7 +92,8 @@ private:
        int setup_encode();
        void release_encode();
        void update_ReferenceFrames(int frame_type);
-       int update_RefPicList(int frame_type);
+       void update_RefPicList_P(VAPictureH264 RefPicList0_P[MAX_NUM_REF2]);
+       void update_RefPicList_B(VAPictureH264 RefPicList0_B[MAX_NUM_REF2], VAPictureH264 RefPicList1_B[MAX_NUM_REF2]);
 
        bool is_shutdown = false;
        bool has_released_gl_resources = false;
@@ -161,7 +162,7 @@ private:
        VAEncPictureParameterBufferH264 pic_param;
        VAEncSliceParameterBufferH264 slice_param;
        VAPictureH264 CurrentCurrPic;
-       VAPictureH264 ReferenceFrames[MAX_NUM_REF1], RefPicList0_P[MAX_NUM_REF2], RefPicList0_B[MAX_NUM_REF2], RefPicList1_B[MAX_NUM_REF2];
+       VAPictureH264 ReferenceFrames[MAX_NUM_REF1];
 
        // Static quality settings.
        static constexpr unsigned int frame_bitrate = 15000000 / 60;  // Doesn't really matter; only initial_qp does.