コード例 #1
0
ファイル: image.c プロジェクト: kunge0408/CodeProject
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);
}
コード例 #2
0
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
  }
}
コード例 #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  || 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
}