void wpxReorderLists( ImageParameters *img, Slice *currSlice ) { int i, num_ref; wpxModifyRefPicList( img ); alloc_ref_pic_list_reordering_buffer(currSlice); for (i = 0; i < img->num_ref_idx_l0_active + 1; i++) { currSlice->reordering_of_pic_nums_idc_l0[i] = 3; currSlice->abs_diff_pic_num_minus1_l0[i] = 0; currSlice->long_term_pic_idx_l0[i] = 0; } if (img->type == B_SLICE) // type should be part of currSlice not img { for (i = 0; i < img->num_ref_idx_l1_active + 1; i++) { currSlice->reordering_of_pic_nums_idc_l1[i] = 3; currSlice->abs_diff_pic_num_minus1_l1[i] = 0; currSlice->long_term_pic_idx_l1[i] = 0; } } // LIST_0 num_ref = img->num_ref_idx_l0_active; poc_ref_pic_reorder_frame(listX[LIST_0], num_ref, currSlice->reordering_of_pic_nums_idc_l0, currSlice->abs_diff_pic_num_minus1_l0, currSlice->long_term_pic_idx_l0, LIST_0); // reference picture reordering reorder_ref_pic_list(listX[LIST_0], &listXsize[LIST_0], img->num_ref_idx_l0_active - 1, currSlice->reordering_of_pic_nums_idc_l0, currSlice->abs_diff_pic_num_minus1_l0, currSlice->long_term_pic_idx_l0); if ( img->type == B_SLICE ) { // LIST_1 num_ref = img->num_ref_idx_l1_active; poc_ref_pic_reorder_frame(listX[LIST_1], num_ref, currSlice->reordering_of_pic_nums_idc_l1, currSlice->abs_diff_pic_num_minus1_l1, currSlice->long_term_pic_idx_l1, LIST_1); // reference picture reordering reorder_ref_pic_list(listX[LIST_1], &listXsize[LIST_1], img->num_ref_idx_l1_active - 1, currSlice->reordering_of_pic_nums_idc_l1, currSlice->abs_diff_pic_num_minus1_l1, currSlice->long_term_pic_idx_l1); } }
static void ref_pic_list_reordering( h264_decoder* dec_params ) { Slice *currSlice = dec_params->img->currentSlice; //int dP_nr = assignSE2partition[PAR_DP_1][SE_HEADER]; //int dP_nr = 0; DataPartition *partition = &(currSlice->partArr[0]); Bitstream *currStream = partition->bitstream; int i, val; alloc_ref_pic_list_reordering_buffer( currSlice, dec_params ); if (dec_params->img->type!=I_SLICE) { val = currSlice->ref_pic_list_reordering_flag_l0 = u_1 ("SH: ref_pic_list_reordering_flag_l0", currStream,dec_params); if (val) { i=0; do { val = currSlice->remapping_of_pic_nums_idc_l0[i] = ue_v("SH: remapping_of_pic_nums_idc_l0", currStream,dec_params); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1_l0[i] = ue_v("SH: abs_diff_pic_num_minus1_l0", currStream,dec_params); } else { if (val==2) { currSlice->long_term_pic_idx_l0[i] = ue_v("SH: long_term_pic_idx_l0", currStream,dec_params); } } i++; // assert (i>dec_params->img->num_ref_idx_l0_active); } while (val != 3); } } if (dec_params->img->type==B_SLICE) { val = currSlice->ref_pic_list_reordering_flag_l1 = u_1 ("SH: ref_pic_list_reordering_flag_l1", currStream,dec_params); if (val) { i=0; do { val = currSlice->remapping_of_pic_nums_idc_l1[i] = ue_v("SH: remapping_of_pic_nums_idc_l1", currStream,dec_params); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1_l1[i] = ue_v("SH: abs_diff_pic_num_minus1_l1", currStream,dec_params); } else { if (val==2) { currSlice->long_term_pic_idx_l1[i] = ue_v("SH: long_term_pic_idx_l1", currStream,dec_params); } } i++; // assert (i>dec_params->img->num_ref_idx_l1_active); } while (val != 3); } } }
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 ) { int i, num_ref; alloc_ref_pic_list_reordering_buffer(currSlice); for (i = 0; i < currSlice->num_ref_idx_active[LIST_0] + 1; i++) { currSlice->reordering_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, currSlice->listX[LIST_0], num_ref, currSlice->reordering_of_pic_nums_idc[LIST_0], currSlice->abs_diff_pic_num_minus1[LIST_0], currSlice->long_term_pic_idx[LIST_0], LIST_0); } else { if ( currSlice->structure == FRAME ) currSlice->poc_ref_pic_reorder_frame(currSlice, currSlice->listX[LIST_0], num_ref, currSlice->reordering_of_pic_nums_idc[LIST_0], currSlice->abs_diff_pic_num_minus1[LIST_0], currSlice->long_term_pic_idx[LIST_0], LIST_0); else { poc_ref_pic_reorder_field(currSlice, currSlice->listX[LIST_0], num_ref, currSlice->reordering_of_pic_nums_idc[LIST_0], currSlice->abs_diff_pic_num_minus1[LIST_0], currSlice->long_term_pic_idx[LIST_0], LIST_0); } } currSlice->num_ref_idx_active[LIST_0] = currSlice->listXsize[0]; //reference picture reordering reorder_ref_pic_list ( currSlice, LIST_0); } currSlice->num_ref_idx_active[LIST_0] = currSlice->listXsize[0]; }
void wp_mcprec_reorder_lists( Slice *currSlice ) { int i, num_ref; wpxModifyRefPicList( currSlice ); alloc_ref_pic_list_reordering_buffer(currSlice); for (i = 0; i < currSlice->num_ref_idx_active[LIST_0] + 1; i++) { currSlice->reordering_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; } if (currSlice->slice_type == B_SLICE) // type should be part of currSlice not p_Vid { for (i = 0; i < currSlice->num_ref_idx_active[LIST_1] + 1; i++) { currSlice->reordering_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; } } // LIST_0 num_ref = currSlice->num_ref_idx_active[LIST_0]; currSlice->poc_ref_pic_reorder_frame(currSlice, currSlice->listX[LIST_0], num_ref, currSlice->reordering_of_pic_nums_idc[LIST_0], currSlice->abs_diff_pic_num_minus1[LIST_0], currSlice->long_term_pic_idx[LIST_0], LIST_0); // reference picture reordering reorder_ref_pic_list ( currSlice, LIST_0); if ( currSlice->slice_type == B_SLICE ) { // LIST_1 num_ref = currSlice->num_ref_idx_active[LIST_1]; currSlice->poc_ref_pic_reorder_frame(currSlice, currSlice->listX[LIST_1], num_ref, currSlice->reordering_of_pic_nums_idc[LIST_1], currSlice->abs_diff_pic_num_minus1[LIST_1], currSlice->long_term_pic_idx[LIST_1], LIST_1); // reference picture reordering reorder_ref_pic_list ( currSlice, LIST_1); } }
static void ref_pic_list_mvc_modification(Slice *currSlice) { VideoParameters *p_Vid = currSlice->p_Vid; byte dP_nr = assignSE2partition[currSlice->dp_mode][SE_HEADER]; DataPartition *partition = &(currSlice->partArr[dP_nr]); Bitstream *currStream = partition->bitstream; int i, val; alloc_ref_pic_list_reordering_buffer(currSlice); if ((p_Vid->type % 5) != I_SLICE && (p_Vid->type % 5) != SI_SLICE) { val = currSlice->ref_pic_list_reordering_flag[LIST_0] = u_1 ("SH: ref_pic_list_modification_flag_l0", currStream); if (val) { i=0; do { val = currSlice->reordering_of_pic_nums_idc[LIST_0][i] = ue_v("SH: modification_of_pic_nums_idc_l0", currStream); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1[LIST_0][i] = ue_v("SH: abs_diff_pic_num_minus1_l0", currStream); } else { if (val==2) { currSlice->long_term_pic_idx[LIST_0][i] = ue_v("SH: long_term_pic_idx_l0", currStream); } else if (val==4 || val==5) { currSlice->abs_diff_view_idx_minus1[LIST_0][i] = ue_v("SH: abs_diff_view_idx_minus1_l0", currStream); } } i++; // assert (i>img->num_ref_idx_l0_active); } while (val != 3); } } if ((p_Vid->type % 5) == B_SLICE) { val = currSlice->ref_pic_list_reordering_flag[LIST_1] = u_1 ("SH: ref_pic_list_reordering_flag_l1", currStream); if (val) { i=0; do { val = currSlice->reordering_of_pic_nums_idc[LIST_1][i] = ue_v("SH: modification_of_pic_nums_idc_l1", currStream); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1[LIST_1][i] = ue_v("SH: abs_diff_pic_num_minus1_l1", currStream); } else { if (val==2) { currSlice->long_term_pic_idx[LIST_1][i] = ue_v("SH: long_term_pic_idx_l1", currStream); } else if (val==4 || val==5) { currSlice->abs_diff_view_idx_minus1[LIST_1][i] = ue_v("SH: abs_diff_view_idx_minus1_l1", currStream); } } i++; // assert (i>img->num_ref_idx_l1_active); } while (val != 3); } } // set reference index of redundant slices. if(currSlice->redundant_pic_cnt && (p_Vid->type != I_SLICE) ) { currSlice->redundant_slice_ref_idx = currSlice->abs_diff_pic_num_minus1[LIST_0][0] + 1; } }
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 }
/*! ************************************************************************ * \brief * read the reference picture reordering information ************************************************************************ */ static void ref_pic_list_reordering() { Slice *currSlice = img->currentSlice; int dP_nr = assignSE2partition[currSlice->dp_mode][SE_HEADER]; DataPartition *partition = &(currSlice->partArr[dP_nr]); Bitstream *currStream = partition->bitstream; int i, val; alloc_ref_pic_list_reordering_buffer(currSlice); if (img->type!=I_SLICE && img->type!=SI_SLICE) { val = currSlice->ref_pic_list_reordering_flag_l0 = u_1 ("SH: ref_pic_list_reordering_flag_l0", currStream); if (val) { i=0; do { val = currSlice->reordering_of_pic_nums_idc_l0[i] = ue_v("SH: reordering_of_pic_nums_idc_l0", currStream); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1_l0[i] = ue_v("SH: abs_diff_pic_num_minus1_l0", currStream); } else { if (val==2) { currSlice->long_term_pic_idx_l0[i] = ue_v("SH: long_term_pic_idx_l0", currStream); } } i++; // assert (i>img->num_ref_idx_l0_active); } while (val != 3); } } if (img->type==B_SLICE) { val = currSlice->ref_pic_list_reordering_flag_l1 = u_1 ("SH: ref_pic_list_reordering_flag_l1", currStream); if (val) { i=0; do { val = currSlice->reordering_of_pic_nums_idc_l1[i] = ue_v("SH: reordering_of_pic_nums_idc_l1", currStream); if (val==0 || val==1) { currSlice->abs_diff_pic_num_minus1_l1[i] = ue_v("SH: abs_diff_pic_num_minus1_l1", currStream); } else { if (val==2) { currSlice->long_term_pic_idx_l1[i] = ue_v("SH: long_term_pic_idx_l1", currStream); } } i++; // assert (i>img->num_ref_idx_l1_active); } while (val != 3); } } }