示例#1
0
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);
    }
}
示例#2
0
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);
    }
  }   
  
}
示例#3
0
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]; 
}
示例#4
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);
  }
}
示例#5
0
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
}
示例#7
0
文件: header.c 项目: YouZhang/JM
/*!
 ************************************************************************
 * \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);
    }
  }
}