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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file explicit_gop.c
  4.  *
  5.  * brief
  6.  *    Code for explicit gop support and hierarchical coding.
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Alexis Michael Tourapis                     <alexismt@ieee.org>
  11.  *************************************************************************************
  12.  */
  13. #include "contributors.h"
  14. #include <ctype.h>
  15. #include <limits.h>
  16. #include "global.h"
  17. #include "explicit_gop.h"
  18. #include "image.h"
  19. #include "nalucommon.h"
  20. #include "report.h"
  21. /*!
  22. ************************************************************************
  23. * brief
  24. *    Generation of hierarchical GOP
  25. ************************************************************************
  26. */
  27. void create_hierarchy()
  28. {
  29.   int i, j;
  30.   int centerB=params->successive_Bframe/2;
  31.   GOP_DATA tmp;
  32.   if (params->HierarchicalCoding == 1)
  33.   {
  34.     for (i=0;i<params->successive_Bframe;i++)
  35.     {
  36.       if (i < centerB)
  37.       {
  38.         gop_structure[i].slice_type = B_SLICE;
  39.         gop_structure[i].display_no = i * 2 + 1;
  40.         gop_structure[i].hierarchy_layer = 1;
  41.         gop_structure[i].reference_idc = NALU_PRIORITY_LOW;
  42.         gop_structure[i].slice_qp = imax(0, (params->qpB + (params->HierarchyLevelQPEnable ? -1: params->qpBRSOffset)));
  43.       }
  44.       else
  45.       {
  46.         gop_structure[i].slice_type = B_SLICE;
  47.         gop_structure[i].display_no = (i - centerB) * 2;
  48.         gop_structure[i].hierarchy_layer = 0;
  49.         gop_structure[i].reference_idc = NALU_PRIORITY_DISPOSABLE;
  50.         gop_structure[i].slice_qp = params->qpB;
  51.       }
  52.     }
  53.     img->GopLevels = 2;
  54.   }
  55.   else
  56.   {
  57.     int GOPlevels = 1;
  58.     int Bframes = params->successive_Bframe;
  59.     int *curGOPLevelfrm,*curGOPLeveldist ;
  60.     int curlevel = GOPlevels ;
  61.     int i;
  62.     while (((Bframes + 1 ) >> GOPlevels) > 1)
  63.     {
  64.       GOPlevels ++;
  65.     }
  66.     curlevel = GOPlevels;
  67.     img->GopLevels = GOPlevels;
  68.     if (NULL == (curGOPLevelfrm = (int*)malloc(GOPlevels * sizeof(int)))) no_mem_exit("create_hierarchy:curGOPLevelfrm");
  69.     if (NULL == (curGOPLeveldist= (int*)malloc(GOPlevels * sizeof(int)))) no_mem_exit("create_hierarchy:curGOPLeveldist");
  70.     for (i=0; i <params->successive_Bframe; i++)
  71.     {
  72.       gop_structure[i].display_no = i;
  73.       gop_structure[i].slice_type = B_SLICE;
  74.       gop_structure[i].hierarchy_layer = 0;
  75.       gop_structure[i].reference_idc = NALU_PRIORITY_DISPOSABLE;
  76.       gop_structure[i].slice_qp = params->qpB;
  77.     }
  78.     for (j = 1; j < GOPlevels; j++)
  79.     {
  80.       for (i = (1 << j) - 1; i < Bframes + 1 - (1 << j); i += (1 << j)) 
  81.       {
  82.         gop_structure[i].hierarchy_layer  = j;
  83.         gop_structure[i].reference_idc  = NALU_PRIORITY_LOW;
  84.         gop_structure[i].slice_qp = imax(0, params->qpB + (params->HierarchyLevelQPEnable ? -j: params->qpBRSOffset));
  85.         //KHHan, for inter lossless code(referenced B picture)
  86.         //if(!params->lossless_qpprime_y_zero_flag)
  87.         //  gop_structure[i].slice_qp = imax(0, params->qpB + (params->HierarchyLevelQPEnable ? -j: params->qpBRSOffset));
  88.         //else
  89.         //  gop_structure[i].slice_qp = params->qpB;
  90.       }
  91.     }
  92.     for (i = 1; i < Bframes; i++)
  93.     {
  94.       j = i;
  95.       while (j > 0 && gop_structure[j].hierarchy_layer > gop_structure[j-1].hierarchy_layer)
  96.       {
  97.         tmp = gop_structure[j-1];
  98.         gop_structure[j-1] = gop_structure[j];
  99.         gop_structure[j] = tmp;
  100.         j--;
  101.       }
  102.     }
  103.   }
  104. }
  105. /*!
  106. ************************************************************************
  107. * brief
  108. *    Initialization of GOP structure.
  109. *
  110. ************************************************************************
  111. */
  112. void init_gop_structure()
  113. {
  114.   int max_gopsize = params->HierarchicalCoding != 3 ? params->successive_Bframe  : params->jumpd;
  115.   gop_structure = calloc(imax(10,max_gopsize), sizeof (GOP_DATA)); // +1 for reordering
  116.   if (NULL==gop_structure)
  117.     no_mem_exit("init_gop_structure: gop_structure");
  118. }
  119. /*!
  120. ************************************************************************
  121. * brief
  122. *    Clear GOP structure
  123. ************************************************************************
  124. */
  125. void clear_gop_structure()
  126. {
  127.   if (gop_structure)
  128.     free(gop_structure);
  129. }
  130. /*!
  131. ************************************************************************
  132. * brief
  133. *    Interpret GOP struct from input parameters
  134. ************************************************************************
  135. */
  136. void interpret_gop_structure()
  137. {
  138.   int nLength = strlen(params->ExplicitHierarchyFormat);
  139.   int i =0, k, dqp, display_no;
  140.   int slice_read =0, order_read = 0, stored_read = 0, qp_read =0;
  141.   int coded_frame = 0;
  142.   if (nLength > 0)
  143.   {
  144.     for (i = 0; i < nLength ; i++)
  145.     {
  146.       //! First lets read slice type
  147.       if (slice_read == 0)
  148.       {
  149.         switch (params->ExplicitHierarchyFormat[i])
  150.         {
  151.         case 'P':
  152.         case 'p':
  153.           gop_structure[coded_frame].slice_type=P_SLICE;
  154.           break;
  155.         case 'B':
  156.         case 'b':
  157.           gop_structure[coded_frame].slice_type=B_SLICE;
  158.           break;
  159.         case 'I':
  160.         case 'i':
  161.           gop_structure[coded_frame].slice_type=I_SLICE;
  162.           break;
  163.         default:
  164.           snprintf(errortext, ET_SIZE, "Slice Type invalid in ExplicitHierarchyFormat param. Please check configuration file.");
  165.           error (errortext, 400);
  166.           break;
  167.         }
  168.         slice_read = 1;
  169.       }
  170.       else
  171.       {
  172.         //! Next is Display Order
  173.         if (order_read == 0)
  174.         {
  175.           if (isdigit((int)(*(params->ExplicitHierarchyFormat+i))))
  176.           {
  177.             sscanf(params->ExplicitHierarchyFormat+i,"%d",&display_no);
  178.             gop_structure[coded_frame].display_no = display_no;
  179.             order_read = 1;
  180.             if (display_no<0 || display_no>=params->jumpd)
  181.             {
  182.               snprintf(errortext, ET_SIZE, "Invalid Frame Order value. Frame position needs to be in [0,%d] range.",params->jumpd-1);
  183.               error (errortext, 400);
  184.             }
  185.             for (k=0;k<coded_frame;k++)
  186.             {
  187.               if (gop_structure[k].display_no == display_no)
  188.               {
  189.                 snprintf(errortext, ET_SIZE, "Frame Order value %d in frame %d already used for enhancement frame %d.",display_no,coded_frame,k);
  190.                 error (errortext, 400);
  191.               }
  192.             }
  193.           }
  194.           else
  195.           {
  196.             snprintf(errortext, ET_SIZE, "Slice Type needs to be followed by Display Order. Please check configuration file.");
  197.             error (errortext, 400);
  198.           }
  199.         }
  200.         else if (order_read == 1)
  201.         {
  202.           if (stored_read == 0 && !(isdigit((int)(*(params->ExplicitHierarchyFormat+i)))))
  203.           {
  204.             switch (params->ExplicitHierarchyFormat[i])
  205.             {
  206.             case 'E':
  207.             case 'e':
  208.               gop_structure[coded_frame].reference_idc = NALU_PRIORITY_DISPOSABLE;
  209.               gop_structure[coded_frame].hierarchy_layer = 0;
  210.               break;
  211.             case 'R':
  212.             case 'r':
  213.               gop_structure[coded_frame].reference_idc= NALU_PRIORITY_LOW;
  214.               gop_structure[coded_frame].hierarchy_layer = 1;
  215.               img->GopLevels = 2;
  216.               break;
  217.             default:
  218.               snprintf(errortext, ET_SIZE, "Reference_IDC invalid in ExplicitHierarchyFormat param. Please check configuration file.");
  219.               error (errortext, 400);
  220.               break;
  221.             }
  222.             stored_read = 1;
  223.           }
  224.           else if (stored_read == 1 && qp_read == 0)
  225.           {
  226.             if (isdigit((int)(*(params->ExplicitHierarchyFormat+i))))
  227.             {
  228.               sscanf(params->ExplicitHierarchyFormat+i,"%d",&dqp);
  229.               if (gop_structure[coded_frame].slice_type == I_SLICE)
  230.                 gop_structure[coded_frame].slice_qp = params->qp0;
  231.               else if (gop_structure[coded_frame].slice_type == P_SLICE)
  232.                 gop_structure[coded_frame].slice_qp = params->qpN;
  233.               else
  234.                 gop_structure[coded_frame].slice_qp = params->qpB;
  235.               gop_structure[coded_frame].slice_qp = iClip3(-img->bitdepth_luma_qp_scale, 51,gop_structure[coded_frame].slice_qp + dqp);
  236.                 qp_read = 1;
  237.             }
  238.             else
  239.             {
  240.               snprintf(errortext, ET_SIZE, "Reference_IDC needs to be followed by QP. Please check configuration file.");
  241.               error (errortext, 400);
  242.             }
  243.           }
  244.           else if (stored_read == 1 && qp_read == 1 && !(isdigit((int)(*(params->ExplicitHierarchyFormat+i)))) && (i < nLength - 2))
  245.           {
  246.             stored_read =0;
  247.             qp_read=0;
  248.             order_read=0;
  249.             slice_read=0;
  250.             i--;
  251.             coded_frame ++;
  252.             if (coded_frame >= params->jumpd )
  253.             {
  254.               snprintf(errortext, ET_SIZE, "Total number of frames in Enhancement GOP need to be fewer or equal to FrameSkip parameter.");
  255.               error (errortext, 400);
  256.             }
  257.           }
  258.         }
  259.       }
  260.     }
  261.   }
  262.   else
  263.   {
  264.     snprintf(errortext, ET_SIZE, "ExplicitHierarchyFormat is empty. Please check configuration file.");
  265.     error (errortext, 400);
  266.   }
  267.   params->successive_Bframe = coded_frame + 1;
  268. }
  269. /*!
  270. ************************************************************************
  271. * brief
  272. *    Encode Enhancement Layer.
  273. ************************************************************************
  274. */
  275. void encode_enhancement_layer()
  276. {
  277.   //int previous_ref_idc = 1;
  278.   if ((params->successive_Bframe != 0) && (IMG_NUMBER > 0) && (params->EnableIDRGOP == 0 || img->idr_gop_number)) // B-frame(s) to encode
  279.   {
  280.     set_slice_type( ( params->PReplaceBSlice ) ? P_SLICE : B_SLICE); // set slice type
  281.     img->layer = (params->NumFramesInELSubSeq == 0) ? 0 : 1;
  282.     img->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
  283.     if (params->HierarchicalCoding)
  284.     {
  285.       for(img->b_frame_to_code = 1; img->b_frame_to_code <= params->successive_Bframe; img->b_frame_to_code++)
  286.       {
  287.         img->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
  288.         set_slice_type( gop_structure[img->b_frame_to_code - 1].slice_type);
  289.         if (img->last_ref_idc == 1)
  290.         {
  291.           img->frame_num++;                 //increment frame_num for each stored B slice
  292.           img->frame_num %= max_frame_num;
  293.         }
  294.         
  295.         img->nal_reference_idc = gop_structure[img->b_frame_to_code - 1].reference_idc;
  296.         img->b_interval = ((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
  297.         if (params->HierarchicalCoding == 3)
  298.           img->b_interval = 1.0;
  299.         if (IMG_NUMBER && (IMG_NUMBER <= params->intra_delay))
  300.         {
  301.           if(params->idr_period && ((!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
  302.             || (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0)) )
  303.             img->toppoc = (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no));
  304.           else
  305.             img->toppoc = 2*((-img->frm_number + img->lastIDRnumber)*(params->jumpd + 1) 
  306.             + (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code -1].display_no)));
  307.           if (img->b_frame_to_code == 1)
  308.             img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP  + (params->intra_delay - IMG_NUMBER)*((params->jumpd + 1)));
  309.           else
  310.             img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP  + (params->intra_delay - IMG_NUMBER)*((params->jumpd + 1)) 
  311.             + (int) (2.0 *img->b_interval * (double) (1 + gop_structure[img->b_frame_to_code - 2].display_no)));
  312.         }
  313.         else
  314.         {
  315.           if(params->idr_period && !params->adaptive_idr_period)
  316.             img->toppoc = 2*((( ( img->frm_number - img->lastIDRnumber - params->intra_delay) % params->idr_period ) - 1)*(params->jumpd + 1) 
  317.             + (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
  318.           else if(params->idr_period && params->adaptive_idr_period == 1)
  319.             img->toppoc = 2*((( img->frm_number - img->lastIDRnumber - params->intra_delay ) - 1)*(params->jumpd + 1) 
  320.             + (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
  321.           else
  322.             img->toppoc = 2*((img->frm_number - img->lastIDRnumber - 1 - params->intra_delay)*(params->jumpd + 1) 
  323.             + (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
  324.           if (img->b_frame_to_code == 1)
  325.             img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP  + (img->frm_number - img->lastIDRnumber)*((params->jumpd + 1)));
  326.           else
  327.             img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP  + (img->frm_number - img->lastIDRnumber - 1)*((params->jumpd + 1)) 
  328.             + (int) (2.0 *img->b_interval * (double) (1+ gop_structure[img->b_frame_to_code - 2].display_no)));
  329.         }
  330.         img->bottompoc = ((params->PicInterlace==FRAME_CODING)&&(params->MbInterlace==FRAME_CODING)) ? img->toppoc : img->toppoc + 1;
  331.         img->framepoc = imin (img->toppoc, img->bottompoc);
  332.         img->delta_pic_order_cnt[1]= 0;   
  333.         FrameNumberInFile = CalculateFrameNumber();
  334.         encode_one_frame();  // encode one frame
  335.         
  336.         img->last_ref_idc = img->nal_reference_idc ? 1 : 0;
  337.         if (params->ReportFrameStats)
  338.           report_frame_statistic();
  339.       }
  340.       img->b_frame_to_code = 0;
  341.     }
  342.     else
  343.     {
  344.       for(img->b_frame_to_code = 1; img->b_frame_to_code <= params->successive_Bframe; img->b_frame_to_code++)
  345.       {
  346.         img->nal_reference_idc = (params->BRefPictures == 1 ) ? NALU_PRIORITY_LOW : NALU_PRIORITY_DISPOSABLE;
  347.         
  348.         if (img->last_ref_idc)
  349.         {
  350.           img->frame_num++;                 //increment frame_num once for B-frames
  351.           img->frame_num %= max_frame_num;
  352.         }
  353.         img->b_interval =
  354.           ((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
  355.         if (params->HierarchicalCoding == 3)
  356.           img->b_interval = 1.0;
  357.         if (IMG_NUMBER && (IMG_NUMBER <= params->intra_delay))
  358.         { 
  359.           if(params->idr_period && ((!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
  360.             || (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0)) )
  361.             img->toppoc = (int) (img->b_interval * (double)img->b_frame_to_code);
  362.           else
  363.             img->toppoc = 2*((-img->frm_number + img->lastIDRnumber)*(params->jumpd + 1) 
  364.             + (int) (img->b_interval * (double)img->b_frame_to_code));
  365.         }
  366.         else
  367.         {
  368.           if(params->idr_period && !params->adaptive_idr_period)
  369.             img->toppoc = 2*((( ( img->frm_number - img->lastIDRnumber - params->intra_delay) % params->idr_period )-1)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
  370.           else if(params->idr_period && params->adaptive_idr_period == 1)
  371.             img->toppoc = 2*((( img->frm_number - img->lastIDRnumber - params->intra_delay )-1)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
  372.           else
  373.             img->toppoc = 2*((img->frm_number - img->lastIDRnumber - 1 - params->intra_delay)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
  374.         }
  375.         if ((params->PicInterlace==FRAME_CODING)&&(params->MbInterlace==FRAME_CODING))
  376.           img->bottompoc = img->toppoc;     //progressive
  377.         else
  378.           img->bottompoc = img->toppoc+1;
  379.         img->framepoc = imin (img->toppoc, img->bottompoc);
  380.         //the following is sent in the slice header
  381.         if (params->BRefPictures != 1)
  382.         {
  383.           img->delta_pic_order_cnt[0]= 2 * (img->b_frame_to_code - 1);
  384.         }
  385.         else
  386.         {
  387.           img->delta_pic_order_cnt[0]= -2;
  388.         }
  389.         img->delta_pic_order_cnt[1]= 0;   // POC200301
  390.         FrameNumberInFile = CalculateFrameNumber();
  391.         encode_one_frame();  // encode one B-frame
  392.         
  393.         img->last_ref_idc = img->nal_reference_idc ? 1 : 0;
  394.         if (params->ReportFrameStats)
  395.           report_frame_statistic();
  396.       }
  397.     }
  398.   }
  399.   img->b_frame_to_code = 0;
  400. }
  401. /*!
  402. ************************************************************************
  403. * brief
  404. *    POC-based reference management (FRAME)
  405. ************************************************************************
  406. */
  407. void poc_based_ref_management_frame_pic(int current_pic_num)
  408. {
  409.   unsigned i, pic_num = 0;
  410.   int min_poc=INT_MAX;
  411.   DecRefPicMarking_t *tmp_drpm,*tmp_drpm2;
  412.   if (img->dec_ref_pic_marking_buffer!=NULL)
  413.     return;
  414.   if ((dpb.ref_frames_in_buffer + dpb.ltref_frames_in_buffer)==0)
  415.     return;
  416.   for (i=0; i<dpb.used_size;i++)
  417.   {
  418.     if (dpb.fs[i]->is_reference  && (!(dpb.fs[i]->is_long_term)) && dpb.fs[i]->poc < min_poc)
  419.     {
  420.       min_poc = dpb.fs[i]->frame->poc ;
  421.       pic_num =  dpb.fs[i]->frame->pic_num;
  422.     }
  423.   }
  424.   if (NULL==(tmp_drpm=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management: tmp_drpm");
  425.   tmp_drpm->Next=NULL;
  426.   tmp_drpm->memory_management_control_operation = 0;
  427.   if (NULL==(tmp_drpm2=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management: tmp_drpm2");
  428.   tmp_drpm2->Next=tmp_drpm;
  429.   tmp_drpm2->memory_management_control_operation = 1;
  430.   tmp_drpm2->difference_of_pic_nums_minus1 = current_pic_num - pic_num - 1;
  431.   img->dec_ref_pic_marking_buffer = tmp_drpm2;
  432. }
  433. /*!
  434. ************************************************************************
  435. * brief
  436. *    POC-based reference management (FIELD)
  437. ************************************************************************
  438. */
  439. void poc_based_ref_management_field_pic(int current_pic_num)
  440. {
  441.   unsigned int i, pic_num1 = 0, pic_num2 = 0;
  442.   int min_poc=INT_MAX;
  443.   DecRefPicMarking_t *tmp_drpm,*tmp_drpm2, *tmp_drpm3;
  444.   if (img->dec_ref_pic_marking_buffer!=NULL)
  445.     return;
  446.   if ((dpb.ref_frames_in_buffer+dpb.ltref_frames_in_buffer)==0)
  447.     return;
  448.   if ( img->structure == TOP_FIELD )
  449.   {
  450.     for (i=0; i<dpb.used_size;i++)
  451.     {
  452.       if (dpb.fs[i]->is_reference && (!(dpb.fs[i]->is_long_term)) && dpb.fs[i]->poc < min_poc)
  453.       {      
  454.         min_poc  = dpb.fs[i]->poc;
  455.         pic_num1 = dpb.fs[i]->top_field->pic_num;
  456.         pic_num2 = dpb.fs[i]->bottom_field->pic_num;
  457.       }
  458.     }
  459.   }
  460.   if (NULL==(tmp_drpm=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm");
  461.   tmp_drpm->Next=NULL;
  462.   tmp_drpm->memory_management_control_operation = 0;
  463.   if ( img->structure == BOTTOM_FIELD )
  464.   {
  465.     img->dec_ref_pic_marking_buffer = tmp_drpm;
  466.     return;
  467.   }
  468.   if (NULL==(tmp_drpm2=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm2");
  469.   tmp_drpm2->Next=tmp_drpm;
  470.   tmp_drpm2->memory_management_control_operation = 1;
  471.   tmp_drpm2->difference_of_pic_nums_minus1 = current_pic_num - pic_num1 - 1;
  472.   if (NULL==(tmp_drpm3=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm3");
  473.   tmp_drpm3->Next=tmp_drpm2;
  474.   tmp_drpm3->memory_management_control_operation = 1;
  475.   tmp_drpm3->difference_of_pic_nums_minus1 = current_pic_num - pic_num2 - 1;
  476.   img->dec_ref_pic_marking_buffer = tmp_drpm3;
  477. }