conformance.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:12k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  **************************************************************************************
  3.  * file
  4.  *    conformance.c
  5.  * brief
  6.  *    Level & Profile related conformance functions
  7.  * author
  8.  *  Main contributors (see contributors.h for copyright, address and affiliation details)
  9.  *    - Karsten Suehring  
  10.  *    - Alexis Michael Tourapis
  11.  * note
  12.  *
  13.  **************************************************************************************
  14.  */
  15. #include "global.h"
  16. // Level Limit             -  -  -  -  -  -  -  -  -  1b  10  11   12   13   -  -  -  -  -  -  20   21   22    -  -  -  -  -  -  -
  17. unsigned int  MaxFs [] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 99, 396, 396, 396, 0, 0, 0, 0, 0, 0, 396, 792, 1620, 0, 0, 0, 0, 0, 0, 0,  
  18. //                        30    31    32    -  -  -  -  -  -  -  40    41    42    -  -  -  -  -  -  -  50     51
  19.                           1620, 3600, 5120, 0, 0, 0, 0, 0, 0, 0, 8192, 8192, 8704, 0, 0, 0, 0, 0, 0, 0, 22080, 36864 };
  20. // Vertical MV Limits (integer/halfpel/quarterpel)
  21. // Currently only Integer Pel restrictions are used,
  22. // since the way values are specified
  23. // (i.e. mvlowbound = (levelmvlowbound + 1) and the way
  24. // Subpel ME is performed, subpel will always be within range.
  25. const int LEVELMVLIMIT[17][6] =
  26. {
  27.   {  -63,  63,  -128,  127,  -256,  255},
  28.   {  -63,  63,  -128,  127,  -256,  255},
  29.   { -127, 127,  -256,  255,  -512,  511},
  30.   { -127, 127,  -256,  255,  -512,  511},
  31.   { -127, 127,  -256,  255,  -512,  511},
  32.   { -127, 127,  -256,  255,  -512,  511},
  33.   { -255, 255,  -512,  511, -1024, 1023},
  34.   { -255, 255,  -512,  511, -1024, 1023},
  35.   { -255, 255,  -512,  511, -1024, 1023},
  36.   { -511, 511, -1024, 1023, -2048, 2047},
  37.   { -511, 511, -1024, 1023, -2048, 2047},
  38.   { -511, 511, -1024, 1023, -2048, 2047},
  39.   { -511, 511, -1024, 1023, -2048, 2047},
  40.   { -511, 511, -1024, 1023, -2048, 2047},
  41.   { -511, 511, -1024, 1023, -2048, 2047},
  42.   { -511, 511, -1024, 1023, -2048, 2047},
  43.   { -511, 511, -1024, 1023, -2048, 2047}
  44.   /*
  45.   {  -64,  63,  -128,  127,  -256,  255},
  46.   {  -64,  63,  -128,  127,  -256,  255},
  47.   { -128, 127,  -256,  255,  -512,  511},
  48.   { -128, 127,  -256,  255,  -512,  511},
  49.   { -128, 127,  -256,  255,  -512,  511},
  50.   { -128, 127,  -256,  255,  -512,  511},
  51.   { -256, 255,  -512,  511, -1024, 1023},
  52.   { -256, 255,  -512,  511, -1024, 1023},
  53.   { -256, 255,  -512,  511, -1024, 1023},
  54.   { -512, 511, -1024, 1023, -2048, 2047},
  55.   { -512, 511, -1024, 1023, -2048, 2047},
  56.   { -512, 511, -1024, 1023, -2048, 2047},
  57.   { -512, 511, -1024, 1023, -2048, 2047},
  58.   { -512, 511, -1024, 1023, -2048, 2047},
  59.   { -512, 511, -1024, 1023, -2048, 2047},
  60.   { -512, 511, -1024, 1023, -2048, 2047},
  61.   { -512, 511, -1024, 1023, -2048, 2047}
  62.   */
  63. };
  64. /*!
  65.  ***********************************************************************
  66.  * brief
  67.  *    Get maximum frame size (in MBs) supported given a level
  68.  ***********************************************************************
  69.  */
  70. unsigned getMaxFs (unsigned int levelIdc)
  71. {
  72.   unsigned int ret;
  73.   if ( (levelIdc < 9) || (levelIdc > 51))
  74.     error ("getMaxFs: Unknown LevelIdc", 500);
  75.   // in Baseline, Main and Extended: Level 1b is specified with LevelIdc==11 and constrained_set3_flag == 1
  76.   ret = MaxFs[levelIdc];
  77.   if ( 0 == ret )
  78.     error ("getMaxFs: Unknown LevelIdc", 500);
  79.   return ret;
  80. }
  81. /*!
  82.  ***********************************************************************
  83.  * brief
  84.  *    Check Profile conformance
  85.  ***********************************************************************
  86.  */
  87. void ProfileCheck(void)
  88. {
  89.   if((params->ProfileIDC != 66 ) &&
  90.      (params->ProfileIDC != 77 ) &&
  91.      (params->ProfileIDC != 88 ) &&
  92.      (params->ProfileIDC != FREXT_HP    ) &&
  93.      (params->ProfileIDC != FREXT_Hi10P ) &&
  94.      (params->ProfileIDC != FREXT_Hi422 ) &&
  95.      (params->ProfileIDC != FREXT_Hi444 ) &&
  96.      (params->ProfileIDC != FREXT_CAVLC444 ))
  97.   {
  98.     snprintf(errortext, ET_SIZE, "Profile must be innn  66 (Baseline),n  77 (Main),n  88 (Extended),n 100 (High),n 110 (High 10 or High 10 Intra)n"
  99.       " 122 (High 4:2:2 or High 4:2:2 Intra),n 244 (High 4:4:4 predictive or High 4:4:4 Intra),n  44 (CAVLC 4:4:4 Intra)n");
  100.     error (errortext, 500);
  101.   }
  102.   if ((params->partition_mode) && (params->symbol_mode==CABAC))
  103.   {
  104.     snprintf(errortext, ET_SIZE, "Data partitioning and CABAC is not supported in any profile.");
  105.     error (errortext, 500);
  106.   }
  107.   if (params->redundant_pic_flag)
  108.   {
  109.     if (params->ProfileIDC != 66)
  110.     {
  111.       snprintf(errortext, ET_SIZE, "Redundant pictures are only allowed in Baseline profile (ProfileIDC = 66).");
  112.       error (errortext, 500);
  113.     }
  114.   }
  115.   if ((params->partition_mode) && (params->ProfileIDC!=88))
  116.   {
  117.     snprintf(errortext, ET_SIZE, "Data partitioning is only allowed in Extended profile (ProfileIDC = 88).");
  118.     error (errortext, 500);
  119.   }
  120.   if (params->ChromaIntraDisable && params->FastCrIntraDecision)
  121.   {
  122.     fprintf( stderr, "n Warning: ChromaIntraDisable and FastCrIntraDecision cannot be combined together.n Using only Chroma Intra DC mode.n");
  123.     params->FastCrIntraDecision=0;
  124.   }
  125.   
  126.   if ((params->sp_periodicity) && (params->ProfileIDC != 88 ))
  127.   {
  128.     snprintf(errortext, ET_SIZE, "SP pictures are only allowed in Extended profile (ProfileIDC = 88).");
  129.     error (errortext, 500);
  130.   }
  131.   // baseline
  132.   if (params->ProfileIDC == 66 )
  133.   {
  134.     if ((params->successive_Bframe || params->BRefPictures==2) && params->PReplaceBSlice == 0)
  135.     {
  136.       snprintf(errortext, ET_SIZE, "B slices are not allowed in Baseline profile (ProfileIDC = 66).");
  137.       error (errortext, 500);
  138.     }
  139.     if (params->WeightedPrediction)
  140.     {
  141.       snprintf(errortext, ET_SIZE, "Weighted prediction is not allowed in Baseline profile (ProfileIDC = 66).");
  142.       error (errortext, 500);
  143.     }
  144.     if (params->WeightedBiprediction)
  145.     {
  146.       snprintf(errortext, ET_SIZE, "Weighted prediction is not allowed in Baseline profile (ProfileIDC = 66).");
  147.       error (errortext, 500);
  148.     }
  149.     if (params->symbol_mode == CABAC)
  150.     {
  151.       snprintf(errortext, ET_SIZE, "CABAC is not allowed in Baseline profile (ProfileIDC = 66).");
  152.       error (errortext, 500);
  153.     }
  154.     if ((params->PicInterlace) ||(params->MbInterlace))
  155.     {
  156.       snprintf(errortext, ET_SIZE, "Interlace tools are not allowed in Baseline profile (ProfileIDC = 66).");
  157.       error (errortext, 500);
  158.     }
  159.   }
  160.   // main
  161.   if (params->ProfileIDC == 77 )
  162.   {
  163.     if (params->num_slice_groups_minus1)
  164.     {
  165.       snprintf(errortext, ET_SIZE, "num_slice_groups_minus1>0 (FMO) is not allowed in Main profile (ProfileIDC = 77).");
  166.       error (errortext, 500);
  167.     }
  168.   }
  169.   // extended
  170.   if (params->ProfileIDC == 88 )
  171.   {
  172.     if (!params->directInferenceFlag)
  173.     {
  174.       snprintf(errortext, ET_SIZE, "direct_8x8_inference flag must be equal to 1 in Extended profile (ProfileIDC = 88).");
  175.       error (errortext, 500);
  176.     }
  177.     if (params->symbol_mode == CABAC)
  178.     {
  179.       snprintf(errortext, ET_SIZE, "CABAC is not allowed in Extended profile (ProfileIDC = 88).");
  180.       error (errortext, 500);
  181.     }
  182.   }
  183.   //FRExt
  184.   if ( params->separate_colour_plane_flag )
  185.   {
  186.     if( params->yuv_format!=3 )
  187.     {
  188.       fprintf( stderr, "nWarning: SeparateColourPlane has only effect in 4:4:4 chroma mode (YUVFormat=3),n         disabling SeparateColourPlane.");
  189.       params->separate_colour_plane_flag = 0;
  190.     }
  191.     if ( params->ChromaMEEnable )
  192.     {
  193.       snprintf(errortext, ET_SIZE, "nChromaMEEnable is not allowed when SeparateColourPlane is enabled.");
  194.       error (errortext, 500);
  195.     }
  196.   }
  197.   // CAVLC 4:4:4 Intra
  198.   if ( params->ProfileIDC == FREXT_CAVLC444 )
  199.   {
  200.     if ( params->symbol_mode != CAVLC )
  201.     {
  202.       snprintf(errortext, ET_SIZE, "nCABAC is not allowed in CAVLC 4:4:4 Intra profile (ProfileIDC = 44).");
  203.       error (errortext, 500);
  204.     }
  205.     if ( !params->IntraProfile )
  206.     {
  207.       fprintf (stderr, "nWarning: ProfileIDC equal to 44 implies an Intra only profile, setting IntraProfile = 1.");
  208.       params->IntraProfile = 1;
  209.     }
  210.   }
  211.   // Intra only profiles
  212.   if (params->IntraProfile && ( params->ProfileIDC<FREXT_HP && params->ProfileIDC!=FREXT_CAVLC444 ))
  213.   {
  214.     snprintf(errortext, ET_SIZE, "nIntraProfile is allowed only with ProfileIDC %d to %d.", FREXT_HP, FREXT_Hi444);
  215.     error (errortext, 500);
  216.   }
  217.   if (params->IntraProfile && !params->idr_period) 
  218.   {
  219.     snprintf(errortext, ET_SIZE, "nIntraProfile requires IDRPeriod >= 1.");
  220.     error (errortext, 500);
  221.   }
  222.   if (params->IntraProfile && params->intra_period != 1) 
  223.   {
  224.     snprintf(errortext, ET_SIZE, "nIntraProfile requires IntraPeriod equal 1.");
  225.     error (errortext, 500);
  226.   }
  227.   if (params->IntraProfile && params->num_ref_frames) 
  228.   {
  229.     fprintf( stderr, "nWarning: Setting NumberReferenceFrames to 0 in IntraProfile.");
  230.     params->num_ref_frames = 0;
  231.   }
  232.   if (params->IntraProfile == 0 && params->num_ref_frames == 0) 
  233.   {
  234.     snprintf(errortext, ET_SIZE, "nProfiles other than IntraProfile require NumberReferenceFrames > 0.");
  235.     error (errortext, 500);
  236.   }
  237. }
  238. /*!
  239.  ***********************************************************************
  240.  * brief
  241.  *    Check if Level constraints are satisfied
  242.  ***********************************************************************
  243.  */
  244. void LevelCheck(void)
  245. {
  246.   unsigned int PicSizeInMbs = ( (params->output.width + img->auto_crop_right) * (params->output.height + img->auto_crop_bottom) ) >> 8;
  247.   if ( (params->LevelIDC>=30) && (params->directInferenceFlag==0))
  248.   {
  249.     fprintf( stderr, "nWarning: LevelIDC 3.0 and above require direct_8x8_inference to be set to 1. Please check your settings.n");
  250.     params->directInferenceFlag=1;
  251.   }
  252.   if ( ((params->LevelIDC<21) || (params->LevelIDC>41)) && (params->PicInterlace > 0 || params->MbInterlace > 0) )
  253.   {
  254.     snprintf(errortext, ET_SIZE, "nInterlace modes only supported for LevelIDC in the range of 21 and 41. Please check your settings.n");
  255.     error (errortext, 500);
  256.   }
  257.   if ( PicSizeInMbs > getMaxFs(params->LevelIDC) )
  258.   {
  259.     snprintf(errortext, ET_SIZE, "nPicSizeInMbs exceeds maximum allowed size at specified LevelIdc %dn", params->LevelIDC);
  260.     error (errortext, 500);
  261.   }
  262.   
  263.   if (params->IntraProfile && (PicSizeInMbs > 1620) && params->slice_mode != 1) 
  264.   {
  265.     error ("nIntraProfile with PicSizeInMbs > 1620 requires SliceMode equal 1.", 500);
  266.   }
  267.   if (params->IntraProfile && (PicSizeInMbs > 1620) && ((unsigned int)params->slice_argument > (  getMaxFs(params->LevelIDC) >> 2 ) ) )
  268.   {
  269.     //when PicSizeInMbs is greater than 1620, the number of macroblocks in any coded slice shall not exceed MaxFS / 4
  270.     snprintf(errortext, ET_SIZE, "nIntraProfile requires SliceArgument smaller or equal to 1/4 MaxFs at specified LevelIdc %d.", params->LevelIDC);
  271.     error (errortext, 500);
  272.   }
  273. }
  274. /*!
  275.  ***********************************************************************
  276.  * brief
  277.  *    Update Motion Vector Limits
  278.  ***********************************************************************
  279.  */
  280. void update_mv_limits(ImageParameters *img, byte is_field)
  281. {
  282.   memcpy(img->MaxVmvR, LEVELMVLIMIT[img->LevelIndex], 6 * sizeof(int));
  283.   if (is_field)
  284.   {
  285.     int i;
  286.     for (i = 0; i < 6; i++)
  287.       img->MaxVmvR[i] >>= 1;
  288.   }
  289. }
  290. /*!
  291.  ***********************************************************************
  292.  * brief
  293.  *    Clip motion vector range given encoding level
  294.  ***********************************************************************
  295.  */
  296. void clip_mv_range(ImageParameters *img, int search_range, short mv[2], int res)
  297. {
  298.   int max_hor = 2047 << res;
  299.   search_range <<= res;
  300.   mv[0] = iClip3( -max_hor + search_range, max_hor - search_range, mv[0]);
  301.   mv[1] = iClip3( img->MaxVmvR[0 + res] + search_range, img->MaxVmvR[1 + res] - search_range, mv[1]);
  302. }
  303. /*!
  304.  ***********************************************************************
  305.  * brief
  306.  *    Clip motion vector range given encoding level
  307.  ***********************************************************************
  308.  */
  309. int out_of_bounds_mvs(ImageParameters *img, short mv[2], int res)
  310. {
  311.   return (mv[0] < -8192 || mv[0] > 8191|| mv[1] < img->MaxVmvR[4] || mv[1] > img->MaxVmvR[5]);
  312. }