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

Audio

开发平台:

Visual C++

  1. /*!
  2.  **************************************************************************************
  3.  * file
  4.  *    parsetcommon.c
  5.  * brief
  6.  *    Picture and Sequence Parameter set generation and handling
  7.  *  date 25 November 2002
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *      - Stephan Wenger        <stewe@cs.tu-berlin.de>
  11.  *
  12.  **************************************************************************************
  13.  */
  14. #include "global.h"
  15. #include "parsetcommon.h"
  16. #include "memalloc.h"
  17. /*!
  18.  *************************************************************************************
  19.  * brief
  20.  *    Allocates memory for a picture paramater set
  21.  *
  22.  * return
  23.  *    pointer to a pps
  24.  *************************************************************************************
  25.  */
  26. pic_parameter_set_rbsp_t *AllocPPS ()
  27.  {
  28.    pic_parameter_set_rbsp_t *p;
  29.    if ((p=calloc (sizeof (pic_parameter_set_rbsp_t), 1)) == NULL)
  30.      no_mem_exit ("AllocPPS: PPS");
  31.    p->slice_group_id = NULL;
  32.    return p;
  33.  }
  34. /*!
  35.  *************************************************************************************
  36.  * brief
  37.  *    Allocates memory for am sequence paramater set
  38.  *
  39.  * return
  40.  *    pointer to a sps
  41.  *************************************************************************************
  42.  */
  43. seq_parameter_set_rbsp_t *AllocSPS ()
  44.  {
  45.    seq_parameter_set_rbsp_t *p;
  46.    if ((p=calloc (sizeof (seq_parameter_set_rbsp_t), 1)) == NULL)
  47.      no_mem_exit ("AllocSPS: SPS");
  48.    return p;
  49.  }
  50. /*!
  51.  *************************************************************************************
  52.  * brief
  53.  *    Frees a picture parameter set
  54.  *
  55.  * param pps to be freed
  56.  *   Picture parameter set to be freed
  57.  *************************************************************************************
  58.  */
  59.  void FreePPS (pic_parameter_set_rbsp_t *pps)
  60.  {
  61.    assert (pps != NULL);
  62.    if (pps->slice_group_id != NULL) 
  63.      free (pps->slice_group_id);
  64.    free (pps);
  65.  }
  66.  /*!
  67.  *************************************************************************************
  68.  * brief
  69.  *    Frees a sps
  70.  *
  71.  * param sps
  72.  *   Sequence parameter set to be freed
  73.  *************************************************************************************
  74.  */
  75.  void FreeSPS (seq_parameter_set_rbsp_t *sps)
  76.  {
  77.    assert (sps != NULL);
  78.    free (sps);
  79.  }
  80. int sps_is_equal(seq_parameter_set_rbsp_t *sps1, seq_parameter_set_rbsp_t *sps2)
  81. {
  82.   unsigned i;
  83.   int equal = 1;
  84.   if ((!sps1->Valid) || (!sps2->Valid))
  85.     return 0;
  86.   equal &= (sps1->profile_idc == sps2->profile_idc);
  87.   equal &= (sps1->constrained_set0_flag == sps2->constrained_set0_flag);
  88.   equal &= (sps1->constrained_set1_flag == sps2->constrained_set1_flag);
  89.   equal &= (sps1->constrained_set2_flag == sps2->constrained_set2_flag);
  90.   equal &= (sps1->level_idc == sps2->level_idc);
  91.   equal &= (sps1->seq_parameter_set_id == sps2->seq_parameter_set_id);
  92.   equal &= (sps1->log2_max_frame_num_minus4 == sps2->log2_max_frame_num_minus4);
  93.   equal &= (sps1->pic_order_cnt_type == sps2->pic_order_cnt_type);
  94.   if (!equal) return equal;
  95.   if( sps1->pic_order_cnt_type == 0 )
  96.   {
  97.     equal &= (sps1->log2_max_pic_order_cnt_lsb_minus4 == sps2->log2_max_pic_order_cnt_lsb_minus4);
  98.   }
  99.   else if( sps1->pic_order_cnt_type == 1 )
  100.   {
  101.     equal &= (sps1->delta_pic_order_always_zero_flag == sps2->delta_pic_order_always_zero_flag);
  102.     equal &= (sps1->offset_for_non_ref_pic == sps2->offset_for_non_ref_pic);
  103.     equal &= (sps1->offset_for_top_to_bottom_field == sps2->offset_for_top_to_bottom_field);
  104.     equal &= (sps1->num_ref_frames_in_pic_order_cnt_cycle == sps2->num_ref_frames_in_pic_order_cnt_cycle);
  105.     if (!equal) return equal;
  106.     for ( i = 0 ; i< sps1->num_ref_frames_in_pic_order_cnt_cycle ;i ++)
  107.       equal &= (sps1->offset_for_ref_frame[i] == sps2->offset_for_ref_frame[i]);
  108.   }
  109.   equal &= (sps1->num_ref_frames == sps2->num_ref_frames);
  110.   equal &= (sps1->gaps_in_frame_num_value_allowed_flag == sps2->gaps_in_frame_num_value_allowed_flag);
  111.   equal &= (sps1->pic_width_in_mbs_minus1 == sps2->pic_width_in_mbs_minus1);
  112.   equal &= (sps1->pic_height_in_map_units_minus1 == sps2->pic_height_in_map_units_minus1);
  113.   equal &= (sps1->frame_mbs_only_flag == sps2->frame_mbs_only_flag);
  114.   if (!equal) return equal;
  115.   if( !sps1->frame_mbs_only_flag )
  116.     equal &= (sps1->mb_adaptive_frame_field_flag == sps2->mb_adaptive_frame_field_flag);
  117.   equal &= (sps1->direct_8x8_inference_flag == sps2->direct_8x8_inference_flag);
  118.   equal &= (sps1->frame_cropping_flag == sps2->frame_cropping_flag);
  119.   if (!equal) return equal;
  120.   if (sps1->frame_cropping_flag)
  121.   {
  122.     equal &= (sps1->frame_cropping_rect_left_offset == sps2->frame_cropping_rect_left_offset);
  123.     equal &= (sps1->frame_cropping_rect_right_offset == sps2->frame_cropping_rect_right_offset);
  124.     equal &= (sps1->frame_cropping_rect_top_offset == sps2->frame_cropping_rect_top_offset);
  125.     equal &= (sps1->frame_cropping_rect_bottom_offset == sps2->frame_cropping_rect_bottom_offset);
  126.   }
  127.   equal &= (sps1->vui_parameters_present_flag == sps2->vui_parameters_present_flag);
  128.   return equal;
  129. }
  130. int pps_is_equal(pic_parameter_set_rbsp_t *pps1, pic_parameter_set_rbsp_t *pps2)
  131. {
  132.   unsigned i, j;
  133.   int equal = 1;
  134.   if ((!pps1->Valid) || (!pps2->Valid))
  135.     return 0;
  136.   equal &= (pps1->pic_parameter_set_id == pps2->pic_parameter_set_id);
  137.   equal &= (pps1->seq_parameter_set_id == pps2->seq_parameter_set_id);
  138.   equal &= (pps1->entropy_coding_mode_flag == pps2->entropy_coding_mode_flag);
  139.   equal &= (pps1->pic_order_present_flag == pps2->pic_order_present_flag);
  140.   equal &= (pps1->num_slice_groups_minus1 == pps2->num_slice_groups_minus1);
  141.   if (!equal) return equal;
  142.   if (pps1->num_slice_groups_minus1>0)
  143.   {
  144.       equal &= (pps1->slice_group_map_type == pps2->slice_group_map_type);
  145.       if (!equal) return equal;
  146.       if (pps1->slice_group_map_type == 0)
  147.       {
  148.         for (i=0; i<=pps1->num_slice_groups_minus1; i++)
  149.           equal &= (pps1->run_length_minus1[i] == pps2->run_length_minus1[i]);
  150.       }
  151.       else if( pps1->slice_group_map_type == 2 )
  152.       {
  153.         for (i=0; i<pps1->num_slice_groups_minus1; i++)
  154.         {
  155.           equal &= (pps1->top_left[i] == pps2->top_left[i]);
  156.           equal &= (pps1->bottom_right[i] == pps2->bottom_right[i]);
  157.         }
  158.       }
  159.       else if( pps1->slice_group_map_type == 3 || pps1->slice_group_map_type==4 || pps1->slice_group_map_type==5 )
  160.       {
  161.         equal &= (pps1->slice_group_change_direction_flag == pps2->slice_group_change_direction_flag);
  162.         equal &= (pps1->slice_group_change_rate_minus1 == pps2->slice_group_change_rate_minus1);
  163.       }
  164.       else if( pps1->slice_group_map_type == 6 )
  165.       {
  166.         equal &= (pps1->num_slice_group_map_units_minus1 == pps2->num_slice_group_map_units_minus1);
  167.         if (!equal) return equal;
  168.         for (i=0; i<=pps1->num_slice_group_map_units_minus1; i++)
  169.           equal &= (pps1->slice_group_id[i] == pps2->slice_group_id[i]);
  170.       }
  171.   }
  172.   equal &= (pps1->num_ref_idx_l0_active_minus1 == pps2->num_ref_idx_l0_active_minus1);
  173.   equal &= (pps1->num_ref_idx_l1_active_minus1 == pps2->num_ref_idx_l1_active_minus1);
  174.   equal &= (pps1->weighted_pred_flag == pps2->weighted_pred_flag);
  175.   equal &= (pps1->weighted_bipred_idc == pps2->weighted_bipred_idc);
  176.   equal &= (pps1->pic_init_qp_minus26 == pps2->pic_init_qp_minus26);
  177.   equal &= (pps1->pic_init_qs_minus26 == pps2->pic_init_qs_minus26);
  178.   equal &= (pps1->chroma_qp_index_offset == pps2->chroma_qp_index_offset);
  179.   equal &= (pps1->deblocking_filter_control_present_flag == pps2->deblocking_filter_control_present_flag);
  180.   equal &= (pps1->constrained_intra_pred_flag == pps2->constrained_intra_pred_flag);
  181.   equal &= (pps1->redundant_pic_cnt_present_flag == pps2->redundant_pic_cnt_present_flag);
  182.   if (!equal) return equal;
  183.   //Fidelity Range Extensions Stuff
  184.   //It is initialized to zero, so should be ok to check all the time.
  185.   equal &= (pps1->transform_8x8_mode_flag == pps2->transform_8x8_mode_flag);
  186.   equal &= (pps1->pic_scaling_matrix_present_flag == pps2->transform_8x8_mode_flag);
  187.   if(pps1->pic_scaling_matrix_present_flag)
  188.   {
  189.     for(i = 0; i < (6 + ((unsigned)pps1->transform_8x8_mode_flag << 1)); i++)
  190.     {
  191.       equal &= (pps1->pic_scaling_list_present_flag[i] == pps2->pic_scaling_list_present_flag[i]); 
  192.       if(pps1->pic_scaling_list_present_flag[i])
  193.       {
  194.         if(i < 6)
  195.         {
  196.           for (j = 0; j < 16; j++)         
  197.             equal &= (pps1->ScalingList4x4[i][j] == pps2->ScalingList4x4[i][j]);
  198.         }
  199.         else
  200.         {
  201.           for (j = 0; j < 64; j++)                 
  202.             equal &= (pps1->ScalingList8x8[i-6][j] == pps2->ScalingList8x8[i-6][j]);
  203.         }
  204.       }
  205.     }
  206.   }
  207.   equal &= (pps1->second_chroma_qp_index_offset == pps2->second_chroma_qp_index_offset);
  208.   return equal;
  209. }