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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file header.c
  4.  *
  5.  * brief
  6.  *    H.264 Slice and Sequence headers
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *      - Stephan Wenger                  <stewe@cs.tu-berlin.de>
  11.  *      - Karsten Suehring                <suehring@hhi.de>
  12.  *************************************************************************************
  13.  */
  14. #include <math.h>
  15. #include "global.h"
  16. #include "elements.h"
  17. #include "header.h"
  18. #include "rtp.h"
  19. #include "mbuffer.h"
  20. #include "vlc.h"
  21. #include "parset.h"
  22. // A little trick to avoid those horrible #if TRACE all over the source code
  23. #if TRACE
  24. #define SYMTRACESTRING(s) strncpy(sym.tracestring,s,TRACESTRING_SIZE)
  25. #else
  26. #define SYMTRACESTRING(s) // do nothing
  27. #endif
  28. int * assignSE2partition[2] ;
  29. int assignSE2partition_NoDP[SE_MAX_ELEMENTS] =
  30.   {  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  31. int assignSE2partition_DP[SE_MAX_ELEMENTS] =
  32.   // 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
  33.   {  0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0 } ;
  34. static int ref_pic_list_reordering(Bitstream *bitstream);
  35. static int dec_ref_pic_marking    (Bitstream *bitstream);
  36. static int pred_weight_table      (Bitstream *bitstream);
  37. static int get_picture_type(void);
  38. /*!
  39.  ********************************************************************************************
  40.  * brief
  41.  *    Write a slice header
  42.  *
  43.  * return
  44.  *    number of bits used
  45.  ********************************************************************************************
  46. */
  47. int SliceHeader(void)
  48. {
  49.   int dP_nr = assignSE2partition[params->partition_mode][SE_HEADER];
  50.   Bitstream *bitstream = img->currentSlice->partArr[dP_nr].bitstream;
  51.   Slice* currSlice = img->currentSlice;
  52.   int len = 0;
  53.   unsigned int field_pic_flag = 0; 
  54.   byte bottom_field_flag = FALSE;
  55.   int num_bits_slice_group_change_cycle;
  56.   float numtmp;
  57.   if (img->MbaffFrameFlag)
  58.     len  = ue_v("SH: first_mb_in_slice", img->current_mb_nr >> 1,   bitstream);
  59.   else
  60.     len  = ue_v("SH: first_mb_in_slice", img->current_mb_nr,   bitstream);
  61.   len += ue_v("SH: slice_type", get_picture_type (),   bitstream);
  62.   len += ue_v("SH: pic_parameter_set_id" , active_pps->pic_parameter_set_id ,bitstream);
  63.   if( active_sps->separate_colour_plane_flag == 1 )
  64.     len += u_v( 2, "SH: colour_plane_id", img->colour_plane_id, bitstream );
  65.   len += u_v (log2_max_frame_num_minus4 + 4,"SH: frame_num", img->frame_num, bitstream);
  66.   if (!active_sps->frame_mbs_only_flag)
  67.   {
  68.     // field_pic_flag    u(1)
  69.     field_pic_flag = (img->structure ==TOP_FIELD || img->structure ==BOTTOM_FIELD)?1:0;
  70.     assert( field_pic_flag == img->fld_flag );
  71.     len += u_1("SH: field_pic_flag", field_pic_flag, bitstream);
  72.     if (field_pic_flag)
  73.     {
  74.       //bottom_field_flag     u(1)
  75.       bottom_field_flag = (img->structure == BOTTOM_FIELD);
  76.       len += u_1("SH: bottom_field_flag" , bottom_field_flag ,bitstream);
  77.     }
  78.   }
  79.   if (img->currentPicture->idr_flag)
  80.   {
  81.     // idr_pic_id
  82.     len += ue_v ("SH: idr_pic_id", (img->number % 2), bitstream);
  83.   }
  84.   if (img->pic_order_cnt_type == 0)
  85.   {
  86.     if (active_sps->frame_mbs_only_flag)
  87.     {
  88.       img->pic_order_cnt_lsb = (img->toppoc & ~((((unsigned int)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
  89.     }
  90.     else
  91.     {
  92.       if (!field_pic_flag || img->structure == TOP_FIELD)
  93.         img->pic_order_cnt_lsb = (img->toppoc & ~((((unsigned int)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
  94.       else if ( img->structure == BOTTOM_FIELD )
  95.         img->pic_order_cnt_lsb = (img->bottompoc & ~((((unsigned int)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
  96.     }
  97.     len += u_v (log2_max_pic_order_cnt_lsb_minus4+4, "SH: pic_order_cnt_lsb", img->pic_order_cnt_lsb, bitstream);
  98.     if (img->pic_order_present_flag && !field_pic_flag)
  99.     {
  100.       len += se_v ("SH: delta_pic_order_cnt_bottom", img->delta_pic_order_cnt_bottom, bitstream);
  101.     }
  102.   }
  103.   if (img->pic_order_cnt_type == 1 && !img->delta_pic_order_always_zero_flag)
  104.   {
  105.     len += se_v ("SH: delta_pic_order_cnt[0]", img->delta_pic_order_cnt[0], bitstream);
  106.     if (img->pic_order_present_flag && !field_pic_flag)
  107.     {
  108.       len += se_v ("SH: delta_pic_order_cnt[1]", img->delta_pic_order_cnt[1], bitstream);
  109.     }
  110.   }
  111.   if (active_pps->redundant_pic_cnt_present_flag)
  112.   {
  113.     len += ue_v ("SH: redundant_pic_cnt", img->redundant_pic_cnt, bitstream);
  114.   }
  115.   // Direct Mode Type selection for B pictures
  116.   if (img->type==B_SLICE)
  117.   {
  118.     len +=  u_1 ("SH: direct_spatial_mv_pred_flag", img->direct_spatial_mv_pred_flag, bitstream);
  119.   }
  120.   if ((img->type == P_SLICE) || (img->type == B_SLICE) || (img->type==SP_SLICE))
  121.   {
  122.     int override_flag;
  123.     if ((img->type == P_SLICE) || (img->type==SP_SLICE))
  124.     {
  125.       override_flag = (img->num_ref_idx_l0_active != (active_pps->num_ref_idx_l0_active_minus1 +1)) ? 1 : 0;
  126.     }
  127.     else
  128.     {
  129.       override_flag = ((img->num_ref_idx_l0_active != (active_pps->num_ref_idx_l0_active_minus1 +1))
  130.                       || (img->num_ref_idx_l1_active != (active_pps->num_ref_idx_l1_active_minus1 +1))) ? 1 : 0;
  131.     }
  132.     len +=  u_1 ("SH: num_ref_idx_active_override_flag", override_flag, bitstream);
  133.     if (override_flag)
  134.     {
  135.       len += ue_v ("SH: num_ref_idx_l0_active_minus1", img->num_ref_idx_l0_active-1, bitstream);
  136.       if (img->type==B_SLICE)
  137.       {
  138.         len += ue_v ("SH: num_ref_idx_l1_active_minus1", img->num_ref_idx_l1_active-1, bitstream);
  139.       }
  140.     }
  141.   }
  142.   len += ref_pic_list_reordering(bitstream);
  143.   if (((img->type == P_SLICE || img->type == SP_SLICE) && active_pps->weighted_pred_flag) ||
  144.      ((img->type == B_SLICE) && active_pps->weighted_bipred_idc == 1))
  145.   {
  146.     len += pred_weight_table(bitstream);
  147.   }
  148.   if (img->nal_reference_idc)
  149.     len += dec_ref_pic_marking(bitstream);
  150.   if(currSlice->symbol_mode==CABAC && img->type!=I_SLICE /*&& img->type!=SI_IMG*/)
  151.   {
  152.     len += ue_v("SH: cabac_init_idc", img->model_number, bitstream);
  153.   }
  154.   len += se_v("SH: slice_qp_delta", (currSlice->qp - 26 - active_pps->pic_init_qp_minus26), bitstream);
  155.   if (img->type==SP_SLICE /*|| img->type==SI_SLICE*/)
  156.   {
  157.     if (img->type==SP_SLICE) // Switch Flag only for SP pictures
  158.     {
  159.       len += u_1 ("SH: sp_for_switch_flag", (si_frame_indicator || sp2_frame_indicator), bitstream);   // 1 for switching SP, 0 for normal SP
  160.     }
  161.     len += se_v ("SH: slice_qs_delta", (img->qpsp - 26), bitstream );
  162.   }
  163.   if (active_pps->deblocking_filter_control_present_flag)
  164.   {
  165.     len += ue_v("SH: disable_deblocking_filter_idc",img->DFDisableIdc, bitstream);  // Turn deblocking filter on/off on slice basis
  166.     if (img->DFDisableIdc!=1)
  167.     {
  168.       len += se_v ("SH: slice_alpha_c0_offset_div2", img->DFAlphaC0Offset / 2, bitstream);
  169.       len += se_v ("SH: slice_beta_offset_div2    ", img->DFBetaOffset / 2, bitstream);
  170.     }
  171.   }
  172.   if ( active_pps->num_slice_groups_minus1 > 0 &&
  173.     active_pps->slice_group_map_type >= 3 && active_pps->slice_group_map_type <= 5)
  174.   {
  175.     numtmp=img->PicHeightInMapUnits*img->PicWidthInMbs/(float)(active_pps->slice_group_change_rate_minus1+1)+1;
  176.     num_bits_slice_group_change_cycle = (int)ceil(log(numtmp)/log(2));
  177.     //! img->slice_group_change_cycle can be changed before calling FmoInit()
  178.     len += u_v (num_bits_slice_group_change_cycle, "SH: slice_group_change_cycle", img->slice_group_change_cycle, bitstream);
  179.   }
  180.   // NOTE: The following syntax element is actually part
  181.   //        Slice data bitstream A RBSP syntax
  182.   if(params->partition_mode&&!img->currentPicture->idr_flag)
  183.   {
  184.     len += ue_v("DPA: slice_id", img->current_slice_nr, bitstream);
  185.   }
  186.   return len;
  187. }
  188. /*!
  189.  ********************************************************************************************
  190.  * brief
  191.  *    writes the ref_pic_list_reordering syntax
  192.  *    based on content of according fields in img structure
  193.  *
  194.  * return
  195.  *    number of bits used
  196.  ********************************************************************************************
  197. */
  198. static int ref_pic_list_reordering(Bitstream *bitstream)
  199. {
  200.   Slice *currSlice = img->currentSlice;
  201.   int i, len=0;
  202.   // RPLR for redundant pictures
  203.   if(params->redundant_pic_flag && redundant_coding)
  204.   {
  205.     currSlice->ref_pic_list_reordering_flag_l0 = 1;
  206.     currSlice->reordering_of_pic_nums_idc_l0[0] = 0;
  207.     currSlice->reordering_of_pic_nums_idc_l0[1] = 3;
  208.     currSlice->abs_diff_pic_num_minus1_l0[0] = redundant_ref_idx - 1;
  209.     currSlice->long_term_pic_idx_l0[0] = 0;
  210.     reorder_ref_pic_list( listX[LIST_0], &listXsize[LIST_0],
  211.                           img->num_ref_idx_l0_active-1,
  212.                           currSlice->reordering_of_pic_nums_idc_l0,
  213.                           currSlice->abs_diff_pic_num_minus1_l0,
  214.                           currSlice->long_term_pic_idx_l0);
  215.   }
  216.   if ((img->type!=I_SLICE) /*&&(img->type!=SI_IMG)*/ )
  217.   {
  218.     len += u_1 ("SH: ref_pic_list_reordering_flag_l0", currSlice->ref_pic_list_reordering_flag_l0, bitstream);
  219.     if (currSlice->ref_pic_list_reordering_flag_l0)
  220.     {
  221.       i=-1;
  222.       do
  223.       {
  224.         i++;
  225.         len += ue_v ("SH: reordering_of_pic_nums_idc", currSlice->reordering_of_pic_nums_idc_l0[i], bitstream);
  226.         if (currSlice->reordering_of_pic_nums_idc_l0[i]==0 ||
  227.             currSlice->reordering_of_pic_nums_idc_l0[i]==1)
  228.         {
  229.           len += ue_v ("SH: abs_diff_pic_num_minus1_l0", currSlice->abs_diff_pic_num_minus1_l0[i], bitstream);
  230.         }
  231.         else
  232.         {
  233.           if (currSlice->reordering_of_pic_nums_idc_l0[i]==2)
  234.           {
  235.             len += ue_v ("SH: long_term_pic_idx_l0", currSlice->long_term_pic_idx_l0[i], bitstream);
  236.           }
  237.         }
  238.       } while (currSlice->reordering_of_pic_nums_idc_l0[i] != 3);
  239.     }
  240.   }
  241.   if (img->type==B_SLICE)
  242.   {
  243.     len += u_1 ("SH: ref_pic_list_reordering_flag_l1", currSlice->ref_pic_list_reordering_flag_l1, bitstream);
  244.     if (currSlice->ref_pic_list_reordering_flag_l1)
  245.     {
  246.       i=-1;
  247.       do
  248.       {
  249.         i++;
  250.         len += ue_v ("SH: remapping_of_pic_num_idc", currSlice->reordering_of_pic_nums_idc_l1[i], bitstream);
  251.         if (currSlice->reordering_of_pic_nums_idc_l1[i]==0 ||
  252.             currSlice->reordering_of_pic_nums_idc_l1[i]==1)
  253.         {
  254.           len += ue_v ("SH: abs_diff_pic_num_minus1_l1", currSlice->abs_diff_pic_num_minus1_l1[i], bitstream);
  255.         }
  256.         else
  257.         {
  258.           if (currSlice->reordering_of_pic_nums_idc_l1[i]==2)
  259.           {
  260.             len += ue_v ("SH: long_term_pic_idx_l1", currSlice->long_term_pic_idx_l1[i], bitstream);
  261.           }
  262.         }
  263.       } while (currSlice->reordering_of_pic_nums_idc_l1[i] != 3);
  264.     }
  265.   }
  266.   return len;
  267. }
  268. /*!
  269.  ************************************************************************
  270.  * brief
  271.  *    write the memory management control operations
  272.  *
  273.  * return
  274.  *    number of bits used
  275.  ************************************************************************
  276.  */
  277. static int dec_ref_pic_marking(Bitstream *bitstream)
  278. {
  279.   DecRefPicMarking_t *tmp_drpm;
  280.   int val, len=0;
  281.   if (img->currentPicture->idr_flag)
  282.   {
  283.     len += u_1("SH: no_output_of_prior_pics_flag", img->no_output_of_prior_pics_flag, bitstream);
  284.     len += u_1("SH: long_term_reference_flag", img->long_term_reference_flag, bitstream);
  285.   }
  286.   else
  287.   {
  288.     img->adaptive_ref_pic_buffering_flag = (img->dec_ref_pic_marking_buffer!=NULL);
  289.     len += u_1("SH: adaptive_ref_pic_buffering_flag", img->adaptive_ref_pic_buffering_flag, bitstream);
  290.     if (img->adaptive_ref_pic_buffering_flag)
  291.     {
  292.       tmp_drpm = img->dec_ref_pic_marking_buffer;
  293.       // write Memory Management Control Operation
  294.       do
  295.       {
  296.         if (tmp_drpm==NULL) error ("Error encoding MMCO commands", 500);
  297.         val = tmp_drpm->memory_management_control_operation;
  298.         len += ue_v("SH: memory_management_control_operation", val, bitstream);
  299.         if ((val==1)||(val==3))
  300.         {
  301.           len += 1 + ue_v("SH: difference_of_pic_nums_minus1", tmp_drpm->difference_of_pic_nums_minus1, bitstream);
  302.         }
  303.         if (val==2)
  304.         {
  305.           len+= ue_v("SH: long_term_pic_num", tmp_drpm->long_term_pic_num, bitstream);
  306.         }
  307.         if ((val==3)||(val==6))
  308.         {
  309.           len+= ue_v("SH: long_term_frame_idx", tmp_drpm->long_term_frame_idx, bitstream);
  310.         }
  311.         if (val==4)
  312.         {
  313.           len += ue_v("SH: max_long_term_pic_idx_plus1", tmp_drpm->max_long_term_frame_idx_plus1, bitstream);
  314.         }
  315.         tmp_drpm=tmp_drpm->Next;
  316.       } while (val != 0);
  317.     }
  318.   }
  319.   return len;
  320. }
  321. /*!
  322.  ************************************************************************
  323.  * brief
  324.  *    write prediction weight table
  325.  *
  326.  * return
  327.  *    number of bits used
  328.  ************************************************************************
  329.  */
  330. static int pred_weight_table(Bitstream *bitstream)
  331. {
  332.   int len = 0;
  333.   int i,j;
  334.   len += ue_v("SH: luma_log_weight_denom", luma_log_weight_denom, bitstream);
  335.   if ( 0 != active_sps->chroma_format_idc)
  336.   {
  337.     len += ue_v("SH: chroma_log_weight_denom", chroma_log_weight_denom, bitstream);
  338.   }
  339.   for (i=0; i< img->num_ref_idx_l0_active; i++)
  340.   {
  341.     if ( (wp_weight[0][i][0] != 1<<luma_log_weight_denom) || (wp_offset[0][i][0] != 0) )
  342.     {
  343.       len += u_1  ("SH: luma_weight_flag_l0", 1, bitstream);
  344.       len += se_v ("SH: luma_weight_l0", wp_weight[0][i][0], bitstream);
  345.       len += se_v ("SH: luma_offset_l0", (wp_offset[0][i][0]>>(img->bitdepth_luma-8)), bitstream);
  346.     }
  347.     else
  348.     {
  349.       len += u_1  ("SH: luma_weight_flag_l0", 0, bitstream);
  350.     }
  351.     if (active_sps->chroma_format_idc!=0)
  352.     {
  353.       if ( (wp_weight[0][i][1] != 1<<chroma_log_weight_denom) || (wp_offset[0][i][1] != 0) ||
  354.         (wp_weight[0][i][2] != 1<<chroma_log_weight_denom) || (wp_offset[0][i][2] != 0)  )
  355.       {
  356.         len += u_1 ("chroma_weight_flag_l0", 1, bitstream);
  357.         for (j=1; j<3; j++)
  358.         {
  359.           len += se_v ("chroma_weight_l0", wp_weight[0][i][j] ,bitstream);
  360.           len += se_v ("chroma_offset_l0", (wp_offset[0][i][j]>>(img->bitdepth_chroma-8)) ,bitstream);
  361.         }
  362.       }
  363.       else
  364.       {
  365.         len += u_1 ("chroma_weight_flag_l0", 0, bitstream);
  366.       }
  367.     }
  368.   }
  369.   if (img->type == B_SLICE)
  370.   {
  371.     for (i=0; i< img->num_ref_idx_l1_active; i++)
  372.     {
  373.       if ( (wp_weight[1][i][0] != 1<<luma_log_weight_denom) || (wp_offset[1][i][0] != 0) )
  374.       {
  375.         len += u_1  ("SH: luma_weight_flag_l1", 1, bitstream);
  376.         len += se_v ("SH: luma_weight_l1", wp_weight[1][i][0], bitstream);
  377.         len += se_v ("SH: luma_offset_l1", (wp_offset[1][i][0]>>(img->bitdepth_luma-8)), bitstream);
  378.       }
  379.       else
  380.       {
  381.         len += u_1  ("SH: luma_weight_flag_l1", 0, bitstream);
  382.       }
  383.       if (active_sps->chroma_format_idc!=0)
  384.       {
  385.         if ( (wp_weight[1][i][1] != 1<<chroma_log_weight_denom) || (wp_offset[1][i][1] != 0) ||
  386.           (wp_weight[1][i][2] != 1<<chroma_log_weight_denom) || (wp_offset[1][i][2] != 0) )
  387.         {
  388.           len += u_1 ("chroma_weight_flag_l1", 1, bitstream);
  389.           for (j=1; j<3; j++)
  390.           {
  391.             len += se_v ("chroma_weight_l1", wp_weight[1][i][j] ,bitstream);
  392.             len += se_v ("chroma_offset_l1", (wp_offset[1][i][j]>>(img->bitdepth_chroma-8)) ,bitstream);
  393.           }
  394.         }
  395.         else
  396.         {
  397.           len += u_1 ("chroma_weight_flag_l1", 0, bitstream);
  398.         }
  399.       }
  400.     }
  401.   }
  402.   return len;
  403. }
  404. /*!
  405.  ************************************************************************
  406.  * brief
  407.  *    Selects picture type and codes it to symbol
  408.  *
  409.  * return
  410.  *    symbol value for picture type
  411.  ************************************************************************
  412.  */
  413. static int get_picture_type()
  414. {
  415.   // set this value to zero for transmission without signaling
  416.   // that the whole picture has the same slice type
  417.   int same_slicetype_for_whole_frame = 5;
  418.   switch (img->type)
  419.   {
  420.   case I_SLICE:
  421.     return 2 + same_slicetype_for_whole_frame;
  422.     break;
  423.   case P_SLICE:
  424.     return 0 + same_slicetype_for_whole_frame;
  425.     break;
  426.   case B_SLICE:
  427.     return 1 + same_slicetype_for_whole_frame;
  428.     break;
  429.   case SP_SLICE:
  430.     return 3 + same_slicetype_for_whole_frame;
  431.     break;
  432.   default:
  433.     error("Picture Type not supported!",1);
  434.     break;
  435.   }
  436.   return 0;
  437. }
  438. /*!
  439.  *****************************************************************************
  440.  *
  441.  * brief
  442.  *    int Partition_BC_Header () write the Partition type B, C header
  443.  *
  444.  * return
  445.  *    Number of bits used by the partition header
  446.  *
  447.  * par Parameters
  448.  *    PartNo: Partition Number to which the header should be written
  449.  *
  450.  * par Side effects
  451.  *    Partition header as per VCEG-N72r2 is written into the appropriate
  452.  *    partition bit buffer
  453.  *
  454.  * par Limitations/Shortcomings/Tweaks
  455.  *    The current code does not support the change of picture parameters within
  456.  *    one coded sequence, hence there is only one parameter set necessary.  This
  457.  *    is hard coded to zero.
  458.  *
  459.  * date
  460.  *    October 24, 2001
  461.  *
  462.  * author
  463.  *    Stephan Wenger   stewe@cs.tu-berlin.de
  464.  *****************************************************************************/
  465. int Partition_BC_Header(int PartNo)
  466. {
  467.   DataPartition *partition = &((img->currentSlice)->partArr[PartNo]);
  468.   SyntaxElement sym;
  469.   assert (PartNo > 0 && PartNo < img->currentSlice->max_part_nr);
  470.   sym.type = SE_HEADER;         // This will be true for all symbols generated here
  471.   sym.value2  = 0;
  472.   SYMTRACESTRING("RTP-PH: Slice ID");
  473.   sym.value1 = img->current_slice_nr;
  474.   writeSE_UVLC (&sym, partition);
  475.   return sym.len;
  476. }