static void reorder_lists(int currSliceType, Slice * currSlice) { if ((currSliceType != I_SLICE)&&(currSliceType != SI_SLICE)) { if (currSlice->ref_pic_list_reordering_flag_l0) { reorder_ref_pic_list(listX[0], &listXsize[0], img->num_ref_idx_l0_active - 1, currSlice->remapping_of_pic_nums_idc_l0, currSlice->abs_diff_pic_num_minus1_l0, currSlice->long_term_pic_idx_l0); } } if (currSliceType == B_SLICE) { if (currSlice->ref_pic_list_reordering_flag_l1) { reorder_ref_pic_list(listX[1], &listXsize[1], img->num_ref_idx_l1_active - 1, currSlice->remapping_of_pic_nums_idc_l1, currSlice->abs_diff_pic_num_minus1_l1, currSlice->long_term_pic_idx_l1); } } free_ref_pic_list_reordering_buffer(currSlice); }
void reorder_lists_mvc(Slice * currSlice, int currPOC) { VideoParameters *p_Vid = currSlice->p_Vid; if ((currSlice->slice_type != I_SLICE)&&(currSlice->slice_type != SI_SLICE)) { if (currSlice->ref_pic_list_reordering_flag[LIST_0]) { reorder_ref_pic_list_mvc(currSlice, LIST_0, p_Vid->active_subset_sps->anchor_ref_l0, p_Vid->active_subset_sps->non_anchor_ref_l0, currSlice->view_id, currSlice->anchor_pic_flag, currPOC, 0); } if (p_Vid->no_reference_picture == currSlice->listX[0][currSlice->num_ref_idx_active[LIST_0]-1]) { if (p_Vid->non_conforming_stream) printf("RefPicList0[ num_ref_idx_l0_active_minus1 ] is equal to 'no reference picture'\n"); else error("RefPicList0[ num_ref_idx_l0_active_minus1 ] is equal to 'no reference picture', invalid bitstream",500); } // that's a definition currSlice->listXsize[0] = (char)currSlice->num_ref_idx_active[LIST_0]; } if (currSlice->slice_type == B_SLICE) { if (currSlice->ref_pic_list_reordering_flag[LIST_1]) { reorder_ref_pic_list_mvc(currSlice, LIST_1, p_Vid->active_subset_sps->anchor_ref_l1, p_Vid->active_subset_sps->non_anchor_ref_l1, currSlice->view_id, currSlice->anchor_pic_flag, currPOC, 1); } if (p_Vid->no_reference_picture == currSlice->listX[1][currSlice->num_ref_idx_active[LIST_1]-1]) { if (p_Vid->non_conforming_stream) printf("RefPicList1[ num_ref_idx_l1_active_minus1 ] is equal to 'no reference picture'\n"); else error("RefPicList1[ num_ref_idx_l1_active_minus1 ] is equal to 'no reference picture', invalid bitstream",500); } // that's a definition currSlice->listXsize[1] = (char)currSlice->num_ref_idx_active[LIST_1]; } free_ref_pic_list_reordering_buffer(currSlice); if ( currSlice->slice_type == P_SLICE ) { #if PRINTREFLIST unsigned int i; // print out for debug purpose if((p_Vid->profile_idc == MVC_HIGH || p_Vid->profile_idc == STEREO_HIGH) && currSlice->current_slice_nr==0) { if(currSlice->listXsize[0]>0) { printf("\n"); printf(" ** (CurViewID:%d) %s Ref Pic List 0 ****\n", currSlice->view_id, currSlice->structure==FRAME ? "FRM":(currSlice->structure==TOP_FIELD ? "TOP":"BOT")); for(i=0; i<(unsigned int)(currSlice->listXsize[0]); i++) //ref list 0 { printf(" %2d -> POC: %4d PicNum: %4d ViewID: %d\n", i, currSlice->listX[0][i]->poc, currSlice->listX[0][i]->pic_num, currSlice->listX[0][i]->view_id); } } } #endif } else if ( currSlice->slice_type == B_SLICE ) { #if PRINTREFLIST unsigned int i; // print out for debug purpose if((p_Vid->profile_idc == MVC_HIGH || p_Vid->profile_idc == STEREO_HIGH) && currSlice->current_slice_nr==0) { if((currSlice->listXsize[0]>0) || (currSlice->listXsize[1]>0)) printf("\n"); if(currSlice->listXsize[0]>0) { printf(" ** (CurViewID:%d) %s Ref Pic List 0 ****\n", currSlice->view_id, currSlice->structure==FRAME ? "FRM":(currSlice->structure==TOP_FIELD ? "TOP":"BOT")); for(i=0; i<(unsigned int)(currSlice->listXsize[0]); i++) //ref list 0 { printf(" %2d -> POC: %4d PicNum: %4d ViewID: %d\n", i, currSlice->listX[0][i]->poc, currSlice->listX[0][i]->pic_num, currSlice->listX[0][i]->view_id); } } if(currSlice->listXsize[1]>0) { printf(" ** (CurViewID:%d) %s Ref Pic List 1 ****\n", currSlice->view_id, currSlice->structure==FRAME ? "FRM":(currSlice->structure==TOP_FIELD ? "TOP":"BOT")); for(i=0; i<(unsigned int)(currSlice->listXsize[1]); i++) //ref list 1 { printf(" %2d -> POC: %4d PicNum: %4d ViewID: %d\n", i, currSlice->listX[1][i]->poc, currSlice->listX[1][i]->pic_num, currSlice->listX[1][i]->view_id); } } } #endif } }
void reorder_lists( Slice *currSlice ) { InputParameters *p_Inp = currSlice->p_Inp; // Perform reordering based on poc distances for HierarchicalCoding if ( p_Inp->ReferenceReorder && (currSlice->slice_type == P_SLICE || currSlice->slice_type == SP_SLICE)) { int i, num_ref; for (i = 0; i < currSlice->num_ref_idx_active[LIST_0] + 1; i++) { currSlice->modification_of_pic_nums_idc[LIST_0][i] = 3; currSlice->abs_diff_pic_num_minus1[LIST_0][i] = 0; currSlice->long_term_pic_idx[LIST_0][i] = 0; } num_ref = currSlice->num_ref_idx_active[LIST_0]; if ( p_Inp->ReferenceReorder == 2 ) // temporal layer based { if ( currSlice->structure == FRAME ) currSlice->poc_ref_pic_reorder_frame(currSlice, num_ref, LIST_0); } else { if ( currSlice->structure == FRAME ) currSlice->poc_ref_pic_reorder_frame(currSlice, num_ref, LIST_0); else { poc_ref_pic_reorder_field_enh(currSlice, num_ref, LIST_0); } } currSlice->num_ref_idx_active[LIST_0] = currSlice->listXsize[0]; if (p_Inp->ReferenceReorder > 1) { free_ref_pic_list_reordering_buffer(currSlice); alloc_ref_pic_list_reordering_buffer(currSlice); reorder_ref_pic_list ( currSlice, LIST_0); } } currSlice->num_ref_idx_active[LIST_0] = currSlice->listXsize[0]; #if KEEP_B_SAME_LIST if ( currSlice->slice_type == B_SLICE && currSlice->p_Dpb->ref_frames_in_buffer >= 2 ) { int iSendAddtionalRPLR = 0; iSendAddtionalRPLR = ( p_Inp->BIdenticalList == 1 && ( (currSlice->ThisPOC/2) % (p_Inp->NumberBFrames+1) ) == 0 ) || ( p_Inp->BIdenticalList == 2 ); if ( iSendAddtionalRPLR ) { int i, num_ref, diff_num, last_frame_num; alloc_ref_pic_list_reordering_buffer(currSlice); for (i = 0; i < currSlice->num_ref_idx_active[LIST_1] + 1; i++) { currSlice->modification_of_pic_nums_idc[LIST_1][i] = 3; currSlice->abs_diff_pic_num_minus1[LIST_1][i] = 0; currSlice->long_term_pic_idx[LIST_1][i] = 0; } num_ref = currSlice->num_ref_idx_active[LIST_1]; last_frame_num = currSlice->frame_num; for ( i=0; i<currSlice->num_ref_idx_active[LIST_1]; i++ ) { diff_num = currSlice->listX[LIST_0][i]->frame_num - last_frame_num; last_frame_num = currSlice->listX[LIST_0][i]->frame_num; if ( diff_num <= 0 ) { currSlice->modification_of_pic_nums_idc[LIST_1][i] = 0; currSlice->abs_diff_pic_num_minus1[LIST_1][i] = iabs(diff_num) - 1; if ( currSlice->abs_diff_pic_num_minus1[LIST_1][i] < 0 ) { currSlice->abs_diff_pic_num_minus1[LIST_1][i] = currSlice->max_frame_num - 1; } } else { currSlice->modification_of_pic_nums_idc[LIST_1][i] = 1; currSlice->abs_diff_pic_num_minus1[LIST_1][i] = iabs(diff_num) - 1; } } currSlice->ref_pic_list_reordering_flag[LIST_1] = 1; currSlice->num_ref_idx_active[LIST_1] = currSlice->listXsize[1]; reorder_ref_pic_list ( currSlice, LIST_1); currSlice->num_ref_idx_active[LIST_1] = currSlice->listXsize[1]; return; } } #endif #if CRA if ( p_Inp->useCRA ) { if ( currSlice->slice_type == B_SLICE && currSlice->p_Dpb->ref_frames_in_buffer >= 2 ) { if ( ( (currSlice->ThisPOC/2) - (p_Inp->NumberBFrames+1) ) % p_Inp->intra_period == 0 ) { int i, diff_num; alloc_ref_pic_list_reordering_buffer(currSlice); for (i = 0; i < currSlice->num_ref_idx_active[LIST_1] + 1; i++) { currSlice->modification_of_pic_nums_idc[LIST_1][i] = 3; currSlice->abs_diff_pic_num_minus1[LIST_1][i] = 0; currSlice->long_term_pic_idx[LIST_1][i] = 0; } diff_num = currSlice->listX[LIST_0][0]->frame_num - currSlice->frame_num; if ( diff_num <= 0 ) { currSlice->modification_of_pic_nums_idc[LIST_1][0] = 0; currSlice->abs_diff_pic_num_minus1[LIST_1][0] = iabs(diff_num) - 1; if ( currSlice->abs_diff_pic_num_minus1[LIST_1][0] < 0 ) { currSlice->abs_diff_pic_num_minus1[LIST_1][0] = currSlice->max_frame_num - 1; } } else { currSlice->modification_of_pic_nums_idc[LIST_1][0] = 1; currSlice->abs_diff_pic_num_minus1[LIST_1][0] = iabs(diff_num) - 1; } currSlice->ref_pic_list_reordering_flag[LIST_1] = 1; currSlice->num_ref_idx_active[LIST_1] = currSlice->listXsize[1]; reorder_ref_pic_list ( currSlice, LIST_1); currSlice->num_ref_idx_active[LIST_1] = currSlice->listXsize[1]; } } } #endif }