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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  *  file
  4.  *      mbuffer.c
  5.  *
  6.  *  brief
  7.  *      Frame buffer functions
  8.  *
  9.  *  author
  10.  *      Main contributors (see contributors.h for copyright, address and affiliation details)
  11.  *      - Karsten S黨ring                 <suehring@hhi.de>
  12.  *      - Alexis Tourapis                 <alexismt@ieee.org>
  13.  ***********************************************************************
  14.  */
  15. #include <limits.h>
  16. #include "global.h"
  17. #include "mbuffer.h"
  18. #include "memalloc.h"
  19. #include "output.h"
  20. #include "image.h"
  21. #include "nalucommon.h"
  22. extern void init_stats (StatParameters *stats);
  23. static void insert_picture_in_dpb(FrameStore* fs, StorablePicture* p);
  24. static void output_one_frame_from_dpb(void);
  25. static int  is_used_for_reference(FrameStore* fs);
  26. static void get_smallest_poc(int *poc,int * pos);
  27. static int  remove_unused_frame_from_dpb(void);
  28. static int  is_short_term_reference(FrameStore* fs);
  29. static int  is_long_term_reference(FrameStore* fs);
  30. void gen_field_ref_ids(StorablePicture *p);
  31. DecodedPictureBuffer dpb;
  32. StorablePicture **listX[6];
  33. ColocatedParams *Co_located = NULL;
  34. ColocatedParams *Co_located_JV[MAX_PLANE] = { NULL, NULL, NULL };  //!< Co_located to be used during 4:4:4 independent mode encoding
  35. int listXsize[6];
  36. #define MAX_LIST_SIZE 33
  37. /*!
  38.  ************************************************************************
  39.  * brief
  40.  *    Print out list of pictures in DPB. Used for debug purposes.
  41.  ************************************************************************
  42.  */
  43. void dump_dpb(void)
  44. {
  45. #if DUMP_DPB
  46.   unsigned i;
  47.   for (i=0; i<dpb.used_size;i++)
  48.   {
  49.     printf("(");
  50.     printf("fn=%d  ", dpb.fs[i]->frame_num);
  51.     if (dpb.fs[i]->is_used & 1)
  52.     {
  53.       if (dpb.fs[i]->top_field)
  54.         printf("T: poc=%d  ", dpb.fs[i]->top_field->poc);
  55.       else
  56.         printf("T: poc=%d  ", dpb.fs[i]->frame->top_poc);
  57.     }
  58.     if (dpb.fs[i]->is_used & 2)
  59.     {
  60.       if (dpb.fs[i]->bottom_field)
  61.         printf("B: poc=%d  ", dpb.fs[i]->bottom_field->poc);
  62.       else
  63.         printf("B: poc=%d  ", dpb.fs[i]->frame->bottom_poc);
  64.     }
  65.     if (dpb.fs[i]->is_used == 3)
  66.       printf("F: poc=%d  ", dpb.fs[i]->frame->poc);
  67.     printf("G: poc=%d)  ", dpb.fs[i]->poc);
  68.     if (dpb.fs[i]->is_reference) printf ("ref (%d) ", dpb.fs[i]->is_reference);
  69.     if (dpb.fs[i]->is_long_term) printf ("lt_ref (%d) ", dpb.fs[i]->is_reference);
  70.     if (dpb.fs[i]->is_output) printf ("out  ");
  71.     if (dpb.fs[i]->is_used == 3)
  72.     {
  73.       if (dpb.fs[i]->frame->non_existing) printf ("ne  ");
  74.     }
  75.     printf ("n");
  76.   }
  77. #endif
  78. }
  79. /*!
  80.  ************************************************************************
  81.  * brief
  82.  *    Returns the size of the dpb depending on level and picture size
  83.  *
  84.  *
  85.  ************************************************************************
  86.  */
  87. int getDpbSize(void)
  88. {
  89.   int pic_size = (active_sps->pic_width_in_mbs_minus1 + 1) * (active_sps->pic_height_in_map_units_minus1 + 1) * (active_sps->frame_mbs_only_flag?1:2) * 384;
  90.   int size = 0;
  91.   switch (active_sps->level_idc)
  92.   {
  93.   case 9:
  94.     size = 152064;
  95.     break;
  96.   case 10:
  97.     size = 152064;
  98.     break;
  99.   case 11:
  100.     if (!IS_FREXT_PROFILE(active_sps->profile_idc)&&(active_sps->constrained_set3_flag == 1))
  101.       size = 152064;
  102.     else
  103.       size = 345600;
  104.     break;
  105.   case 12:
  106.     size = 912384;
  107.     break;
  108.   case 13:
  109.     size = 912384;
  110.     break;
  111.   case 20:
  112.     size = 912384;
  113.     break;
  114.   case 21:
  115.     size = 1824768;
  116.     break;
  117.   case 22:
  118.     size = 3110400;
  119.     break;
  120.   case 30:
  121.     size = 3110400;
  122.     break;
  123.   case 31:
  124.     size = 6912000;
  125.     break;
  126.   case 32:
  127.     size = 7864320;
  128.     break;
  129.   case 40:
  130.     size = 12582912;
  131.     break;
  132.   case 41:
  133.     size = 12582912;
  134.     break;
  135.   case 42:
  136.     size = 13369344;
  137.     break;
  138.   case 50:
  139.     size = 42393600;
  140.     break;
  141.   case 51:
  142.     size = 70778880;
  143.     break;
  144.   default:
  145.     error ("undefined level", 500);
  146.     break;
  147.   }
  148.   size /= pic_size;
  149.   return imin( size, 16);
  150. }
  151. /*!
  152.  ************************************************************************
  153.  * brief
  154.  *    Check then number of frames marked "used for reference" and break
  155.  *    if maximum is exceeded
  156.  *
  157.  ************************************************************************
  158.  */
  159. void check_num_ref(void)
  160. {
  161.   if ((int)(dpb.ltref_frames_in_buffer +  dpb.ref_frames_in_buffer ) > (imax(1,img->num_ref_frames)))
  162.   {
  163.     error ("Max. number of reference frames exceeded. Invalid stream.", 500);
  164.   }
  165. }
  166. /*!
  167.  ************************************************************************
  168.  * brief
  169.  *    Allocate memory for decoded picture buffer and initialize with sane values.
  170.  *
  171.  ************************************************************************
  172.  */
  173. void init_dpb(void)
  174. {
  175.   unsigned i,j;
  176.   if (dpb.init_done)
  177.   {
  178.     free_dpb();
  179.   }
  180.   dpb.size      = getDpbSize();
  181.   if (dpb.size < (unsigned int)params->num_ref_frames)
  182.   {
  183.     error ("DPB size at specified level is smaller than the specified number of reference frames. This is not allowed.n", 1000);
  184.   }
  185.   dpb.used_size = 0;
  186.   dpb.last_picture = NULL;
  187.   dpb.ref_frames_in_buffer = 0;
  188.   dpb.ltref_frames_in_buffer = 0;
  189.   dpb.fs = calloc(dpb.size, sizeof (FrameStore*));
  190.   if (NULL==dpb.fs)
  191.     no_mem_exit("init_dpb: dpb->fs");
  192.   dpb.fs_ref = calloc(dpb.size, sizeof (FrameStore*));
  193.   if (NULL==dpb.fs_ref)
  194.     no_mem_exit("init_dpb: dpb->fs_ref");
  195.   dpb.fs_ltref = calloc(dpb.size, sizeof (FrameStore*));
  196.   if (NULL==dpb.fs_ltref)
  197.     no_mem_exit("init_dpb: dpb->fs_ltref");
  198.   for (i = 0; i < dpb.size; i++)
  199.   {
  200.     dpb.fs[i]       = alloc_frame_store();
  201.     dpb.fs_ref[i]   = NULL;
  202.     dpb.fs_ltref[i] = NULL;
  203.   }
  204.   for (i = 0; i < 6; i++)
  205.   {
  206.     listX[i] = calloc(MAX_LIST_SIZE, sizeof (StorablePicture*)); // +1 for reordering
  207.     if (NULL==listX[i])
  208.       no_mem_exit("init_dpb: listX[i]");
  209.   }
  210.   for (j = 0; j < 6; j++)
  211.   {
  212.     for (i = 0; i < MAX_LIST_SIZE; i++)
  213.     {
  214.       listX[j][i] = NULL;
  215.     }
  216.     listXsize[j]=0;
  217.   }
  218.   dpb.last_output_poc = INT_MIN;
  219.   img->last_has_mmco_5 = 0;
  220.   dpb.init_done = 1;
  221. }
  222. /*!
  223.  ************************************************************************
  224.  * brief
  225.  *    Free memory for decoded picture buffer.
  226.  ************************************************************************
  227.  */
  228. void free_dpb(void)
  229. {
  230.   unsigned i;
  231.   if (dpb.fs)
  232.   {
  233.     for (i=0; i<dpb.size; i++)
  234.     {
  235.       free_frame_store(dpb.fs[i]);
  236.     }
  237.     free (dpb.fs);
  238.     dpb.fs=NULL;
  239.   }
  240.   if (dpb.fs_ref)
  241.   {
  242.     free (dpb.fs_ref);
  243.   }
  244.   if (dpb.fs_ltref)
  245.   {
  246.     free (dpb.fs_ltref);
  247.   }
  248.   dpb.last_output_poc = INT_MIN;
  249.   for (i=0; i<6; i++)
  250.     if (listX[i])
  251.     {
  252.       free (listX[i]);
  253.       listX[i] = NULL;
  254.     }
  255.   dpb.init_done = 0;
  256. }
  257. /*!
  258.  ************************************************************************
  259.  * brief
  260.  *    Allocate memory for decoded picture buffer frame stores an initialize with sane values.
  261.  *
  262.  * return
  263.  *    the allocated FrameStore structure
  264.  ************************************************************************
  265.  */
  266. FrameStore* alloc_frame_store(void)
  267. {
  268.   FrameStore *f;
  269.   f = calloc (1, sizeof(FrameStore));
  270.   if (NULL==f)
  271.     no_mem_exit("alloc_frame_store: f");
  272.   f->is_used      = 0;
  273.   f->is_reference = 0;
  274.   f->is_long_term = 0;
  275.   f->is_orig_reference = 0;
  276.   f->is_output = 0;
  277.   f->frame        = NULL;;
  278.   f->top_field    = NULL;
  279.   f->bottom_field = NULL;
  280.   return f;
  281. }
  282. void alloc_pic_motion(PicMotionParams *motion, int size_y, int size_x)
  283. {
  284.   get_mem3Dint64 (&(motion->ref_pic_id), 6, size_y, size_x);
  285.   get_mem3Dint64 (&(motion->ref_id),     6, size_y, size_x);
  286.   get_mem4Dshort (&(motion->mv),         2, size_y, size_x, 2);
  287.   get_mem3D      ((byte****)(&(motion->ref_idx)),    2, size_y , size_x);
  288.   motion->mb_field = calloc (size_y * size_x, sizeof(byte));
  289.   if (motion->mb_field == NULL)
  290.     no_mem_exit("alloc_storable_picture: motion->mb_field");
  291.   get_mem2D (&(motion->field_frame), size_y, size_x);
  292. }
  293. /*!
  294.  ************************************************************************
  295.  * brief
  296.  *    Allocate memory for a stored picture.
  297.  *
  298.  * param structure
  299.  *    picture structure
  300.  * param size_x
  301.  *    horizontal luma size
  302.  * param size_y
  303.  *    vertical luma size
  304.  * param size_x_cr
  305.  *    horizontal chroma size
  306.  * param size_y_cr
  307.  *    vertical chroma size
  308.  *
  309.  * return
  310.  *    the allocated StorablePicture structure
  311.  ************************************************************************
  312.  */
  313. StorablePicture* alloc_storable_picture(PictureStructure structure, int size_x, int size_y, int size_x_cr, int size_y_cr)
  314. {
  315.   StorablePicture *s;
  316.   int   nplane;
  317.   int   dec;
  318.   int   ndec = params->NoOfDecoders;
  319.   //printf ("Allocating (%s) picture (x=%d, y=%d, x_cr=%d, y_cr=%d)n", (type == FRAME)?"FRAME":(type == TOP_FIELD)?"TOP_FIELD":"BOTTOM_FIELD", size_x, size_y, size_x_cr, size_y_cr);
  320.   s = calloc (1, sizeof(StorablePicture));
  321.   if (NULL==s)
  322.     no_mem_exit("alloc_storable_picture: s");
  323.   s->imgUV      = NULL;
  324.   s->imgY_sub   = NULL;
  325.   s->imgUV_sub  = NULL;
  326.   
  327.   s->p_img_sub[0] = NULL;
  328.   s->p_img_sub[1] = NULL;
  329.   s->p_img_sub[2] = NULL;
  330.   s->dec_imgY     = NULL;
  331.   s->dec_imgUV    = NULL;
  332.   s->mb_error_map = NULL;
  333.   s->p_dec_img[0] = NULL;
  334.   s->p_dec_img[1] = NULL;
  335.   s->p_dec_img[2] = NULL;
  336.   if ((params->rdopt == 3) && (ndec > 0))  //PPAHA_TODO: Need to verify whether both checks are necessary.
  337.   {
  338.     get_mem3D(&(s->mb_error_map), ndec, size_y/MB_BLOCK_SIZE, size_x/MB_BLOCK_SIZE);
  339.     get_mem3Dpel(&(s->dec_imgY), ndec, size_y, size_x);
  340.     // This seems somewhat inefficient. Why not allocate array as [ndec][x] where x goes from 0 to 2?
  341.     if ((s->p_dec_img[0] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
  342.     {
  343.       no_mem_exit("mbuffer.c: p_dec_img[0]");
  344.     }
  345.     if (img->yuv_format != YUV400)
  346.     {
  347.       get_mem4Dpel(&(s->dec_imgUV), ndec, 2, size_y_cr, size_x_cr);
  348.       if ((s->p_dec_img[1] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
  349.       {
  350.         no_mem_exit("mbuffer.c: p_dec_img[1]");
  351.       }
  352.       if ((s->p_dec_img[2] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
  353.       {
  354.         no_mem_exit("mbuffer.c: p_dec_img[2]");
  355.       }
  356.     }
  357.   
  358.     for (dec = 0; dec < ndec; dec++)
  359.     {
  360.       s->p_dec_img[0][dec] = s->dec_imgY[dec];
  361.     }
  362.     if (img->yuv_format != YUV400)
  363.     {
  364.       for (dec = 0; dec < ndec; dec++)
  365.       {
  366.         s->p_dec_img[1][dec] = s->dec_imgUV[dec][0];
  367.         s->p_dec_img[2][dec] = s->dec_imgUV[dec][1];
  368.       }
  369.     }
  370.   }
  371.   get_mem2Dpel (&(s->imgY), size_y, size_x);
  372.   s->p_img[0] = s->imgY;
  373.   s->p_curr_img = s->p_img[0];
  374.   if (img->yuv_format != YUV400)
  375.   {
  376.     get_mem3Dpel (&(s->imgUV), 2, size_y_cr, size_x_cr);
  377.     s->p_img[1] = s->imgUV[0];
  378.     s->p_img[2] = s->imgUV[1];
  379.   }
  380.     
  381.   s->p_curr_img_sub = s->p_img_sub[0];
  382.   if (params->MbInterlace)
  383.     get_mem3Dmp    (&s->mv_info, size_y, size_x, 6);
  384.   else
  385.     get_mem3Dmp    (&s->mv_info, size_y, size_x, 2);
  386.   alloc_pic_motion(&s->motion, size_y / BLOCK_SIZE, size_x / BLOCK_SIZE);
  387.   if( IS_INDEPENDENT(params) )
  388.   {
  389.     for( nplane=0; nplane<MAX_PLANE; nplane++ )
  390.     {
  391.       alloc_pic_motion(&s->JVmotion[nplane], size_y / BLOCK_SIZE, size_x / BLOCK_SIZE);
  392.     }
  393.   }
  394.   s->pic_num=0;
  395.   s->frame_num=0;
  396.   s->long_term_frame_idx=0;
  397.   s->long_term_pic_num=0;
  398.   s->used_for_reference=0;
  399.   s->is_long_term=0;
  400.   s->non_existing=0;
  401.   s->is_output = 0;
  402.   s->structure=structure;
  403.   s->size_x = size_x;
  404.   s->size_y = size_y;
  405.   s->size_x_padded = size_x + 2 * IMG_PAD_SIZE;
  406.   s->size_y_padded = size_y + 2 * IMG_PAD_SIZE;
  407.   s->size_x_pad = size_x + 2 * IMG_PAD_SIZE - 1 - MB_BLOCK_SIZE;
  408.   s->size_y_pad = size_y + 2 * IMG_PAD_SIZE - 1 - MB_BLOCK_SIZE;
  409.   s->size_x_cr = size_x_cr;
  410.   s->size_y_cr = size_y_cr;
  411.   s->size_x_cr_pad = (int) (size_x_cr - 1) + (img_pad_size_uv_x << 1) - (img->mb_cr_size_x);
  412.   s->size_y_cr_pad = (int) (size_y_cr - 1) + (img_pad_size_uv_y << 1) - (img->mb_cr_size_y);
  413.   s->top_field    = NULL;
  414.   s->bottom_field = NULL;
  415.   s->frame        = NULL;
  416.   s->coded_frame    = 0;
  417.   s->MbaffFrameFlag = 0;
  418.   init_stats(&s->stats);
  419.   return s;
  420. }
  421. /*!
  422.  ************************************************************************
  423.  * brief
  424.  *    Free frame store memory.
  425.  *
  426.  * param f
  427.  *    FrameStore to be freed
  428.  *
  429.  ************************************************************************
  430.  */
  431. void free_frame_store(FrameStore* f)
  432. {
  433.   if (f)
  434.   {
  435.     if (f->frame)
  436.     {
  437.       free_storable_picture(f->frame);
  438.       f->frame=NULL;
  439.     }
  440.     if (f->top_field)
  441.     {
  442.       free_storable_picture(f->top_field);
  443.       f->top_field=NULL;
  444.     }
  445.     if (f->bottom_field)
  446.     {
  447.       free_storable_picture(f->bottom_field);
  448.       f->bottom_field=NULL;
  449.     }
  450.     free(f);
  451.   }
  452. }
  453. void free_pic_motion(PicMotionParams *motion)
  454. {
  455.   if (motion->ref_pic_id)
  456.   {
  457.     free_mem3Dint64 (motion->ref_pic_id);
  458.     motion->ref_pic_id = NULL;
  459.   }
  460.   if (motion->ref_id)
  461.   {
  462.     free_mem3Dint64 (motion->ref_id);
  463.     motion->ref_id = NULL;
  464.   }
  465.   if (motion->mv)
  466.   {
  467.     free_mem4Dshort (motion->mv);
  468.     motion->mv = NULL;
  469.   }
  470.   if (motion->ref_idx)
  471.   {
  472.     free_mem3D ((byte***)motion->ref_idx);
  473.     motion->ref_idx = NULL;
  474.   }
  475.   if (motion->mb_field)
  476.   {
  477.     free(motion->mb_field);
  478.     motion->mb_field=NULL;
  479.   }
  480.   if (motion->field_frame)
  481.   {
  482.     free_mem2D (motion->field_frame);
  483.     motion->field_frame=NULL;
  484.   }
  485. }
  486. /*!
  487.  ************************************************************************
  488.  * brief
  489.  *    Free picture memory.
  490.  *
  491.  * param p
  492.  *    Picture to be freed
  493.  *
  494.  ************************************************************************
  495.  */
  496. void free_storable_picture(StorablePicture* p)
  497. {
  498.   int nplane;
  499.   if (p)
  500.   {
  501.     free_mem3Dmp (p->mv_info);
  502.     free_pic_motion(&p->motion);
  503.     if( IS_INDEPENDENT(params) )
  504.     {
  505.       for( nplane=0; nplane<MAX_PLANE; nplane++ )
  506.       {
  507.         free_pic_motion(&p->JVmotion[nplane]);
  508.       }
  509.     }
  510.     if (p->imgY)
  511.     {      
  512.       free_mem2Dpel (p->imgY);
  513.       p->imgY=NULL;      
  514.     }    
  515.     if( IS_INDEPENDENT(params) )
  516.     {
  517.       if (p->imgY_sub)
  518.       {
  519.         free_mem4Dpel (p->imgY_sub);
  520.         p->imgY_sub=NULL;
  521.       }
  522.       if (p->imgUV_sub)
  523.       {
  524.         free_mem5Dpel (p->imgUV_sub);
  525.         p->imgUV_sub = NULL;
  526.       }
  527.       p->p_curr_img     = NULL;
  528.       p->p_curr_img_sub = NULL;
  529.       p->p_img[0]       = NULL;
  530.       p->p_img[1]       = NULL;
  531.       p->p_img[2]       = NULL;
  532.       p->p_img_sub[0]   = NULL;
  533.       p->p_img_sub[1]   = NULL;
  534.       p->p_img_sub[2]   = NULL;
  535.     }
  536.     else
  537.     {
  538.       if (p->imgY_sub)
  539.       {
  540.         free_mem4Dpel (p->imgY_sub);
  541.         p->imgY_sub=NULL;
  542.       }
  543.       if ( p->imgUV_sub && img->yuv_format != YUV400 && params->ChromaMCBuffer )
  544.       {
  545.         free_mem5Dpel (p->imgUV_sub);
  546.         p->imgUV_sub = NULL;
  547.       }
  548.     }
  549.     if (p->imgUV)
  550.     {
  551.       free_mem3Dpel (p->imgUV);
  552.       p->imgUV=NULL;
  553.     }
  554.     if (p->dec_imgY)
  555.     {
  556.       free_mem3Dpel(p->dec_imgY);
  557.     }
  558.     if (p->dec_imgUV)
  559.     {
  560.       free_mem4Dpel(p->dec_imgUV);
  561.     }
  562.     for (nplane = 0; nplane < 3; nplane++)
  563.     {
  564.       if (p->p_dec_img[nplane])
  565.       {  
  566.         free(p->p_dec_img[nplane]);
  567.         p->p_dec_img[nplane] = NULL;
  568.       }
  569.     }
  570.     if (p->mb_error_map)
  571.     {
  572.       free_mem3D(p->mb_error_map);
  573.     }
  574.     p->mb_error_map = NULL;
  575.     p->dec_imgY   = NULL;
  576.     p->dec_imgUV  = NULL;
  577.     free(p);
  578.     p = NULL;
  579.   }
  580. }
  581. /*!
  582.  ************************************************************************
  583.  * brief
  584.  *    mark FrameStore unused for reference
  585.  *
  586.  ************************************************************************
  587.  */
  588. static void unmark_for_reference(FrameStore* fs)
  589. {
  590.   if (fs->is_used & 1)
  591.   {
  592.     if (fs->top_field)
  593.     {
  594.       fs->top_field->used_for_reference = 0;
  595.     }
  596.   }
  597.   if (fs->is_used & 2)
  598.   {
  599.     if (fs->bottom_field)
  600.     {
  601.       fs->bottom_field->used_for_reference = 0;
  602.     }
  603.   }
  604.   if (fs->is_used == 3)
  605.   {
  606.     if (fs->top_field && fs->bottom_field)
  607.     {
  608.       fs->top_field->used_for_reference = 0;
  609.       fs->bottom_field->used_for_reference = 0;
  610.     }
  611.     fs->frame->used_for_reference = 0;
  612.   }
  613.   fs->is_reference = 0;
  614.   if(fs->frame)
  615.   {
  616.     if (fs->frame->imgY_sub)
  617.     {
  618.       free_mem4Dpel (fs->frame->imgY_sub);
  619.       fs->frame->imgY_sub=NULL;
  620.     }
  621.     if (fs->frame->imgUV_sub)
  622.     {
  623.       free_mem5Dpel (fs->frame->imgUV_sub);
  624.       fs->frame->imgUV_sub = NULL;
  625.     }
  626.     free_pic_motion(&fs->frame->motion);
  627.   }
  628.   if (fs->top_field)
  629.   {
  630.     if (fs->top_field->imgY_sub)
  631.     {
  632.       free_mem4Dpel (fs->top_field->imgY_sub);
  633.       fs->top_field->imgY_sub=NULL;
  634.     }
  635.     if (fs->top_field->imgUV_sub)
  636.     {
  637.       free_mem5Dpel (fs->top_field->imgUV_sub);
  638.       fs->top_field->imgUV_sub = NULL;
  639.     }
  640.     free_pic_motion(&fs->top_field->motion);
  641.   }
  642.   if (fs->bottom_field)
  643.   {
  644.     if (fs->bottom_field->imgY_sub)
  645.     {
  646.       free_mem4Dpel (fs->bottom_field->imgY_sub);
  647.       fs->bottom_field->imgY_sub=NULL;
  648.     }
  649.     if (fs->bottom_field->imgUV_sub)
  650.     {
  651.       free_mem5Dpel (fs->bottom_field->imgUV_sub);
  652.       fs->bottom_field->imgUV_sub = NULL;
  653.     }
  654.     free_pic_motion(&fs->bottom_field->motion);
  655.   }
  656. }
  657. /*!
  658.  ************************************************************************
  659.  * brief
  660.  *    mark FrameStore unused for reference and reset long term flags
  661.  *
  662.  ************************************************************************
  663.  */
  664. static void unmark_for_long_term_reference(FrameStore* fs)
  665. {
  666.   if (fs->is_used & 1)
  667.   {
  668.     if (fs->top_field)
  669.     {
  670.       fs->top_field->used_for_reference = 0;
  671.       fs->top_field->is_long_term = 0;
  672.     }
  673.   }
  674.   if (fs->is_used & 2)
  675.   {
  676.     if (fs->bottom_field)
  677.     {
  678.       fs->bottom_field->used_for_reference = 0;
  679.       fs->bottom_field->is_long_term = 0;
  680.     }
  681.   }
  682.   if (fs->is_used == 3)
  683.   {
  684.     if (fs->top_field && fs->bottom_field)
  685.     {
  686.       fs->top_field->used_for_reference = 0;
  687.       fs->top_field->is_long_term = 0;
  688.       fs->bottom_field->used_for_reference = 0;
  689.       fs->bottom_field->is_long_term = 0;
  690.     }
  691.     fs->frame->used_for_reference = 0;
  692.     fs->frame->is_long_term = 0;
  693.   }
  694.   fs->is_reference = 0;
  695.   fs->is_long_term = 0;
  696. }
  697. /*!
  698.  ************************************************************************
  699.  * brief
  700.  *    compares two stored pictures by picture number for qsort in descending order
  701.  *
  702.  ************************************************************************
  703.  */
  704. static int compare_pic_by_pic_num_desc( const void *arg1, const void *arg2 )
  705. {
  706.   if ( (*(StorablePicture**)arg1)->pic_num < (*(StorablePicture**)arg2)->pic_num)
  707.     return 1;
  708.   if ( (*(StorablePicture**)arg1)->pic_num > (*(StorablePicture**)arg2)->pic_num)
  709.     return -1;
  710.   else
  711.     return 0;
  712. }
  713. /*!
  714.  ************************************************************************
  715.  * brief
  716.  *    compares two stored pictures by picture number for qsort in descending order
  717.  *
  718.  ************************************************************************
  719.  */
  720. static int compare_pic_by_lt_pic_num_asc( const void *arg1, const void *arg2 )
  721. {
  722.   if ( (*(StorablePicture**)arg1)->long_term_pic_num < (*(StorablePicture**)arg2)->long_term_pic_num)
  723.     return -1;
  724.   if ( (*(StorablePicture**)arg1)->long_term_pic_num > (*(StorablePicture**)arg2)->long_term_pic_num)
  725.     return 1;
  726.   else
  727.     return 0;
  728. }
  729. /*!
  730.  ************************************************************************
  731.  * brief
  732.  *    compares two frame stores by pic_num for qsort in descending order
  733.  *
  734.  ************************************************************************
  735.  */
  736. static int compare_fs_by_frame_num_desc( const void *arg1, const void *arg2 )
  737. {
  738.   if ( (*(FrameStore**)arg1)->frame_num_wrap < (*(FrameStore**)arg2)->frame_num_wrap)
  739.     return 1;
  740.   if ( (*(FrameStore**)arg1)->frame_num_wrap > (*(FrameStore**)arg2)->frame_num_wrap)
  741.     return -1;
  742.   else
  743.     return 0;
  744. }
  745. /*!
  746.  ************************************************************************
  747.  * brief
  748.  *    compares two frame stores by lt_pic_num for qsort in descending order
  749.  *
  750.  ************************************************************************
  751.  */
  752. static int compare_fs_by_lt_pic_idx_asc( const void *arg1, const void *arg2 )
  753. {
  754.   if ( (*(FrameStore**)arg1)->long_term_frame_idx < (*(FrameStore**)arg2)->long_term_frame_idx)
  755.     return -1;
  756.   if ( (*(FrameStore**)arg1)->long_term_frame_idx > (*(FrameStore**)arg2)->long_term_frame_idx)
  757.     return 1;
  758.   else
  759.     return 0;
  760. }
  761. /*!
  762.  ************************************************************************
  763.  * brief
  764.  *    compares two stored pictures by poc for qsort in ascending order
  765.  *
  766.  ************************************************************************
  767.  */
  768. static int compare_pic_by_poc_asc( const void *arg1, const void *arg2 )
  769. {
  770.   if ( (*(StorablePicture**)arg1)->poc < (*(StorablePicture**)arg2)->poc)
  771.     return -1;
  772.   if ( (*(StorablePicture**)arg1)->poc > (*(StorablePicture**)arg2)->poc)
  773.     return 1;
  774.   else
  775.     return 0;
  776. }
  777. /*!
  778.  ************************************************************************
  779.  * brief
  780.  *    compares two stored pictures by poc for qsort in descending order
  781.  *
  782.  ************************************************************************
  783.  */
  784. static int compare_pic_by_poc_desc( const void *arg1, const void *arg2 )
  785. {
  786.   if ( (*(StorablePicture**)arg1)->poc < (*(StorablePicture**)arg2)->poc)
  787.     return 1;
  788.   if ( (*(StorablePicture**)arg1)->poc > (*(StorablePicture**)arg2)->poc)
  789.     return -1;
  790.   else
  791.     return 0;
  792. }
  793. /*!
  794.  ************************************************************************
  795.  * brief
  796.  *    compares two frame stores by poc for qsort in ascending order
  797.  *
  798.  ************************************************************************
  799.  */
  800. static int compare_fs_by_poc_asc( const void *arg1, const void *arg2 )
  801. {
  802.   if ( (*(FrameStore**)arg1)->poc < (*(FrameStore**)arg2)->poc)
  803.     return -1;
  804.   if ( (*(FrameStore**)arg1)->poc > (*(FrameStore**)arg2)->poc)
  805.     return 1;
  806.   else
  807.     return 0;
  808. }
  809. /*!
  810.  ************************************************************************
  811.  * brief
  812.  *    compares two frame stores by poc for qsort in descending order
  813.  *
  814.  ************************************************************************
  815.  */
  816. static int compare_fs_by_poc_desc( const void *arg1, const void *arg2 )
  817. {
  818.   if ( (*(FrameStore**)arg1)->poc < (*(FrameStore**)arg2)->poc)
  819.     return 1;
  820.   if ( (*(FrameStore**)arg1)->poc > (*(FrameStore**)arg2)->poc)
  821.     return -1;
  822.   else
  823.     return 0;
  824. }
  825. /*!
  826.  ************************************************************************
  827.  * brief
  828.  *    returns true, if picture is short term reference picture
  829.  *
  830.  ************************************************************************
  831.  */
  832. int is_short_ref(StorablePicture *s)
  833. {
  834.   return ((s->used_for_reference) && (!(s->is_long_term)));
  835. }
  836. /*!
  837.  ************************************************************************
  838.  * brief
  839.  *    returns true, if picture is long term reference picture
  840.  *
  841.  ************************************************************************
  842.  */
  843. int is_long_ref(StorablePicture *s)
  844. {
  845.   return ((s->used_for_reference) && (s->is_long_term));
  846. }
  847. /*!
  848.  ************************************************************************
  849.  * brief
  850.  *    Generates a alternating field list from a given FrameStore list
  851.  *
  852.  ************************************************************************
  853.  */
  854. static void gen_pic_list_from_frame_list(PictureStructure currStrcture, FrameStore **fs_list, int list_idx, StorablePicture **list, int *list_size, int long_term)
  855. {
  856.   int top_idx = 0;
  857.   int bot_idx = 0;
  858.   int (*is_ref)(StorablePicture *s);
  859.   if (long_term)
  860.     is_ref=is_long_ref;
  861.   else
  862.     is_ref=is_short_ref;
  863.   if (currStrcture == TOP_FIELD)
  864.   {
  865.     while ((top_idx<list_idx)||(bot_idx<list_idx))
  866.     {
  867.       for ( ; top_idx<list_idx; top_idx++)
  868.       {
  869.         if(fs_list[top_idx]->is_used & 1)
  870.         {
  871.           if(is_ref(fs_list[top_idx]->top_field))
  872.           {
  873.             // short term ref pic
  874.             list[*list_size] = fs_list[top_idx]->top_field;
  875.             (*list_size)++;
  876.             top_idx++;
  877.             break;
  878.           }
  879.         }
  880.       }
  881.       for ( ; bot_idx<list_idx; bot_idx++)
  882.       {
  883.         if(fs_list[bot_idx]->is_used & 2)
  884.         {
  885.           if(is_ref(fs_list[bot_idx]->bottom_field))
  886.           {
  887.             // short term ref pic
  888.             list[*list_size] = fs_list[bot_idx]->bottom_field;
  889.             (*list_size)++;
  890.             bot_idx++;
  891.             break;
  892.           }
  893.         }
  894.       }
  895.     }
  896.   }
  897.   if (currStrcture == BOTTOM_FIELD)
  898.   {
  899.     while ((top_idx<list_idx)||(bot_idx<list_idx))
  900.     {
  901.       for ( ; bot_idx<list_idx; bot_idx++)
  902.       {
  903.         if(fs_list[bot_idx]->is_used & 2)
  904.         {
  905.           if(is_ref(fs_list[bot_idx]->bottom_field))
  906.           {
  907.             // short term ref pic
  908.             list[*list_size] = fs_list[bot_idx]->bottom_field;
  909.             (*list_size)++;
  910.             bot_idx++;
  911.             break;
  912.           }
  913.         }
  914.       }
  915.       for ( ; top_idx<list_idx; top_idx++)
  916.       {
  917.         if(fs_list[top_idx]->is_used & 1)
  918.         {
  919.           if(is_ref(fs_list[top_idx]->top_field))
  920.           {
  921.             // short term ref pic
  922.             list[*list_size] = fs_list[top_idx]->top_field;
  923.             (*list_size)++;
  924.             top_idx++;
  925.             break;
  926.           }
  927.         }
  928.       }
  929.     }
  930.   }
  931. }
  932. /*!
  933.  ************************************************************************
  934.  * brief
  935.  *    Initialize listX[0] and list 1 depending on current picture type
  936.  *
  937.  ************************************************************************
  938.  */
  939. void init_lists(int currSliceType, PictureStructure currPicStructure)
  940. {
  941.   int add_top = 0, add_bottom = 0;
  942.   unsigned int i;
  943.   int j, diff;
  944.   int list0idx = 0;
  945.   int list0idx_1 = 0;
  946.   int listltidx = 0;
  947.   FrameStore **fs_list0;
  948.   FrameStore **fs_list1;
  949.   FrameStore **fs_listlt;
  950.   StorablePicture *tmp_s;
  951.   if (currPicStructure == FRAME)
  952.   {
  953.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  954.     {
  955.       if (dpb.fs_ref[i]->is_used==3)
  956.       {
  957.         if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
  958.         {
  959.           if( dpb.fs_ref[i]->frame_num > img->frame_num )
  960.           {
  961.             dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num - max_frame_num;
  962.           }
  963.           else
  964.           {
  965.             dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num;
  966.           }
  967.           dpb.fs_ref[i]->frame->pic_num = dpb.fs_ref[i]->frame_num_wrap;
  968.         }
  969.       }
  970.     }
  971.     // update long_term_pic_num
  972.     for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  973.     {
  974.       if (dpb.fs_ltref[i]->is_used==3)
  975.       {
  976.         if (dpb.fs_ltref[i]->frame->is_long_term)
  977.         {
  978.           dpb.fs_ltref[i]->frame->long_term_pic_num = dpb.fs_ltref[i]->frame->long_term_frame_idx;
  979.         }
  980.       }
  981.     }
  982.   }
  983.   else
  984.   {
  985.     if (currPicStructure == TOP_FIELD)
  986.     {
  987.       add_top    = 1;
  988.       add_bottom = 0;
  989.     }
  990.     else
  991.     {
  992.       add_top    = 0;
  993.       add_bottom = 1;
  994.     }
  995.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  996.     {
  997.       if (dpb.fs_ref[i]->is_reference)
  998.       {
  999.         if( dpb.fs_ref[i]->frame_num > img->frame_num )
  1000.         {
  1001.           dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num - max_frame_num;
  1002.         }
  1003.         else
  1004.         {
  1005.           dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num;
  1006.         }
  1007.         if (dpb.fs_ref[i]->is_reference & 1)
  1008.         {
  1009.           dpb.fs_ref[i]->top_field->pic_num = (2 * dpb.fs_ref[i]->frame_num_wrap) + add_top;
  1010.         }
  1011.         if (dpb.fs_ref[i]->is_reference & 2)
  1012.         {
  1013.           dpb.fs_ref[i]->bottom_field->pic_num = (2 * dpb.fs_ref[i]->frame_num_wrap) + add_bottom;
  1014.         }
  1015.       }
  1016.     }
  1017.     // update long_term_pic_num
  1018.     for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1019.     {
  1020.       if (dpb.fs_ltref[i]->is_long_term & 1)
  1021.       {
  1022.         dpb.fs_ltref[i]->top_field->long_term_pic_num = 2 * dpb.fs_ltref[i]->top_field->long_term_frame_idx + add_top;
  1023.   }
  1024.       if (dpb.fs_ltref[i]->is_long_term & 2)
  1025.       {
  1026.         dpb.fs_ltref[i]->bottom_field->long_term_pic_num = 2 * dpb.fs_ltref[i]->bottom_field->long_term_frame_idx + add_bottom;
  1027.       }
  1028.     }
  1029.   }
  1030.   if ((currSliceType == I_SLICE)||(currSliceType == SI_SLICE))
  1031.   {
  1032.     listXsize[0] = 0;
  1033.     listXsize[1] = 0;
  1034.     return;
  1035.   }
  1036.   if ((currSliceType == P_SLICE)||(currSliceType == SP_SLICE))
  1037.   {
  1038.     // Calculate FrameNumWrap and PicNum
  1039.     if (currPicStructure == FRAME)
  1040.     {
  1041.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1042.       {
  1043.         if (dpb.fs_ref[i]->is_used==3)
  1044.         {
  1045.           if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
  1046.           {
  1047.             listX[0][list0idx++] = dpb.fs_ref[i]->frame;
  1048.           }
  1049.         }
  1050.       }
  1051.       // order list 0 by PicNum
  1052.       qsort((void *)listX[0], list0idx, sizeof(StorablePicture*), compare_pic_by_pic_num_desc);
  1053.       listXsize[0] = list0idx;
  1054.       //printf("listX[0] (PicNum): "); for (i=0; i<list0idx; i++){printf ("%d  ", listX[0][i]->pic_num);} printf("n");
  1055.       // long term handling
  1056.       for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1057.       {
  1058.         if (dpb.fs_ltref[i]->is_used==3)
  1059.         {
  1060.           if (dpb.fs_ltref[i]->frame->is_long_term)
  1061.           {
  1062.             listX[0][list0idx++]=dpb.fs_ltref[i]->frame;
  1063.           }
  1064.         }
  1065.       }
  1066.       qsort((void *)&listX[0][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
  1067.       listXsize[0] = list0idx;
  1068.       //printf("listX[0] currPoc=%d (Poc): ", img->framepoc); for (i=0; i<listXsize[0]; i++){printf ("%d  ", listX[0][i]->poc);} printf("n");
  1069.     }
  1070.     else
  1071.     {
  1072.       fs_list0 = calloc(dpb.size, sizeof (FrameStore*));
  1073.       if (NULL==fs_list0)
  1074.          no_mem_exit("init_lists: fs_list0");
  1075.       fs_listlt = calloc(dpb.size, sizeof (FrameStore*));
  1076.       if (NULL==fs_listlt)
  1077.          no_mem_exit("init_lists: fs_listlt");
  1078.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1079.       {
  1080.         if (dpb.fs_ref[i]->is_reference)
  1081.         {
  1082.           fs_list0[list0idx++] = dpb.fs_ref[i];
  1083.         }
  1084.       }
  1085.       qsort((void *)fs_list0, list0idx, sizeof(FrameStore*), compare_fs_by_frame_num_desc);
  1086.       //printf("fs_list0 (FrameNum): "); for (i=0; i<list0idx; i++){printf ("%d  ", fs_list0[i]->frame_num_wrap);} printf("n");
  1087.       listXsize[0] = 0;
  1088.       gen_pic_list_from_frame_list(currPicStructure, fs_list0, list0idx, listX[0], &listXsize[0], 0);
  1089.       //printf("listX[0] (PicNum): "); for (i=0; i<listXsize[0]; i++){printf ("%d  ", listX[0][i]->pic_num);} printf("n");
  1090.       // long term handling
  1091.       for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1092.       {
  1093.         fs_listlt[listltidx++]=dpb.fs_ltref[i];
  1094.       }
  1095.       qsort((void *)fs_listlt, listltidx, sizeof(FrameStore*), compare_fs_by_lt_pic_idx_asc);
  1096.       gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[0], &listXsize[0], 1);
  1097.       free(fs_list0);
  1098.       free(fs_listlt);
  1099.     }
  1100.     listXsize[1] = 0;
  1101.   }
  1102.   else
  1103.   {
  1104.     // B-Slice
  1105.     if (currPicStructure == FRAME)
  1106.     {
  1107.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1108.       {
  1109.         if (dpb.fs_ref[i]->is_used==3)
  1110.         {
  1111.           if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
  1112.           {
  1113.             if (img->framepoc > dpb.fs_ref[i]->frame->poc)
  1114.             {
  1115.               listX[0][list0idx++] = dpb.fs_ref[i]->frame;
  1116.             }
  1117.           }
  1118.         }
  1119.       }
  1120.       qsort((void *)listX[0], list0idx, sizeof(StorablePicture*), compare_pic_by_poc_desc);
  1121.       list0idx_1 = list0idx;
  1122.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1123.       {
  1124.         if (dpb.fs_ref[i]->is_used==3)
  1125.         {
  1126.           if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
  1127.           {
  1128.             if (img->framepoc < dpb.fs_ref[i]->frame->poc)
  1129.             {
  1130.               listX[0][list0idx++] = dpb.fs_ref[i]->frame;
  1131.             }
  1132.           }
  1133.         }
  1134.       }
  1135.       qsort((void *)&listX[0][list0idx_1], list0idx-list0idx_1, sizeof(StorablePicture*), compare_pic_by_poc_asc);
  1136.       for (j=0; j<list0idx_1; j++)
  1137.       {
  1138.         listX[1][list0idx-list0idx_1+j]=listX[0][j];
  1139.       }
  1140.       for (j=list0idx_1; j<list0idx; j++)
  1141.       {
  1142.         listX[1][j-list0idx_1]=listX[0][j];
  1143.       }
  1144.       listXsize[0] = listXsize[1] = list0idx;
  1145. //      printf("listX[0] currPoc=%d (Poc): ", img->framepoc); for (i=0; i<listXsize[0]; i++){printf ("%d  ", listX[0][i]->poc);} printf("n");
  1146. //      printf("listX[1] currPoc=%d (Poc): ", img->framepoc); for (i=0; i<listXsize[1]; i++){printf ("%d  ", listX[1][i]->poc);} printf("n");
  1147.       // long term handling
  1148.       for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1149.       {
  1150.         if (dpb.fs_ltref[i]->is_used==3)
  1151.         {
  1152.           if (dpb.fs_ltref[i]->frame->is_long_term)
  1153.           {
  1154.             listX[0][list0idx]  =dpb.fs_ltref[i]->frame;
  1155.             listX[1][list0idx++]=dpb.fs_ltref[i]->frame;
  1156.           }
  1157.         }
  1158.       }
  1159.       qsort((void *)&listX[0][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
  1160.       qsort((void *)&listX[1][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
  1161.       listXsize[0] = listXsize[1] = list0idx;
  1162.     }
  1163.     else
  1164.     {
  1165.       fs_list0 = calloc(dpb.size, sizeof (FrameStore*));
  1166.       if (NULL==fs_list0)
  1167.          no_mem_exit("init_lists: fs_list0");
  1168.       fs_list1 = calloc(dpb.size, sizeof (FrameStore*));
  1169.       if (NULL==fs_list1)
  1170.          no_mem_exit("init_lists: fs_list1");
  1171.       fs_listlt = calloc(dpb.size, sizeof (FrameStore*));
  1172.       if (NULL==fs_listlt)
  1173.          no_mem_exit("init_lists: fs_listlt");
  1174.       listXsize[0] = 0;
  1175.       listXsize[1] = 1;
  1176.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1177.       {
  1178.         if (dpb.fs_ref[i]->is_used)
  1179.         {
  1180.           if (img->ThisPOC >= dpb.fs_ref[i]->poc)
  1181.           {
  1182.             fs_list0[list0idx++] = dpb.fs_ref[i];
  1183.           }
  1184.         }
  1185.       }
  1186.       qsort((void *)fs_list0, list0idx, sizeof(FrameStore*), compare_fs_by_poc_desc);
  1187.       list0idx_1 = list0idx;
  1188.       for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1189.       {
  1190.         if (dpb.fs_ref[i]->is_used)
  1191.         {
  1192.           if (img->ThisPOC < dpb.fs_ref[i]->poc)
  1193.           {
  1194.             fs_list0[list0idx++] = dpb.fs_ref[i];
  1195.           }
  1196.         }
  1197.       }
  1198.       qsort((void *)&fs_list0[list0idx_1], list0idx-list0idx_1, sizeof(FrameStore*), compare_fs_by_poc_asc);
  1199.       for (j=0; j<list0idx_1; j++)
  1200.       {
  1201.         fs_list1[list0idx-list0idx_1+j]=fs_list0[j];
  1202.       }
  1203.       for (j=list0idx_1; j<list0idx; j++)
  1204.       {
  1205.         fs_list1[j-list0idx_1]=fs_list0[j];
  1206.       }
  1207. //      printf("fs_list0 currPoc=%d (Poc): ", img->ThisPOC); for (i=0; i<list0idx; i++){printf ("%d  ", fs_list0[i]->poc);} printf("n");
  1208. //      printf("fs_list1 currPoc=%d (Poc): ", img->ThisPOC); for (i=0; i<list0idx; i++){printf ("%d  ", fs_list1[i]->poc);} printf("n");
  1209.       listXsize[0] = 0;
  1210.       listXsize[1] = 0;
  1211.       gen_pic_list_from_frame_list(currPicStructure, fs_list0, list0idx, listX[0], &listXsize[0], 0);
  1212.       gen_pic_list_from_frame_list(currPicStructure, fs_list1, list0idx, listX[1], &listXsize[1], 0);
  1213. //      printf("listX[0] currPoc=%d (Poc): ", img->framepoc); for (i=0; i<listXsize[0]; i++){printf ("%d  ", listX[0][i]->poc);} printf("n");
  1214. //      printf("listX[1] currPoc=%d (Poc): ", img->framepoc); for (i=0; i<listXsize[1]; i++){printf ("%d  ", listX[1][i]->poc);} printf("n");
  1215.       // long term handling
  1216.       for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1217.       {
  1218.         fs_listlt[listltidx++]=dpb.fs_ltref[i];
  1219.       }
  1220.       qsort((void *)fs_listlt, listltidx, sizeof(FrameStore*), compare_fs_by_lt_pic_idx_asc);
  1221.       gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[0], &listXsize[0], 1);
  1222.       gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[1], &listXsize[1], 1);
  1223.       free(fs_list0);
  1224.       free(fs_list1);
  1225.       free(fs_listlt);
  1226.     }
  1227.   }
  1228.   if ((listXsize[0] == listXsize[1]) && (listXsize[0] > 1))
  1229.   {
  1230.     // check if lists are identical, if yes swap first two elements of listX[1]
  1231.     diff=0;
  1232.     for (j = 0; j< listXsize[0]; j++)
  1233.     {
  1234.       if (listX[0][j]!=listX[1][j])
  1235.         diff=1;
  1236.     }
  1237.     if (!diff)
  1238.     {
  1239.       tmp_s = listX[1][0];
  1240.       listX[1][0]=listX[1][1];
  1241.       listX[1][1]=tmp_s;
  1242.     }
  1243.   }
  1244.   // set max size
  1245.   listXsize[0] = imin (listXsize[0], img->num_ref_idx_l0_active);
  1246.   listXsize[1] = imin (listXsize[1], img->num_ref_idx_l1_active);
  1247.   // set the unused list entries to NULL
  1248.   for (i=listXsize[0]; i< (MAX_LIST_SIZE) ; i++)
  1249.   {
  1250.     listX[0][i] = NULL;
  1251.   }
  1252.   for (i=listXsize[1]; i< (MAX_LIST_SIZE) ; i++)
  1253.   {
  1254.     listX[1][i] = NULL;
  1255.   }
  1256. }
  1257. /*!
  1258.  ************************************************************************
  1259.  * brief
  1260.  *    Initialize listX[2..5] from lists 0 and 1
  1261.  *    listX[2]: list0 for current_field==top
  1262.  *    listX[3]: list1 for current_field==top
  1263.  *    listX[4]: list0 for current_field==bottom
  1264.  *    listX[5]: list1 for current_field==bottom
  1265.  *
  1266.  ************************************************************************
  1267.  */
  1268. void init_mbaff_lists(void)
  1269. {
  1270.   unsigned j;
  1271.   int i;
  1272.   for (i=2;i<6;i++)
  1273.   {
  1274.     for (j=0; j<MAX_LIST_SIZE; j++)
  1275.     {
  1276.       listX[i][j] = NULL;
  1277.     }
  1278.     listXsize[i]=0;
  1279.   }
  1280.   for (i=0; i<listXsize[0]; i++)
  1281.   {
  1282.     listX[2][2*i]  =listX[0][i]->top_field;
  1283.     listX[2][2*i+1]=listX[0][i]->bottom_field;
  1284.     listX[4][2*i]  =listX[0][i]->bottom_field;
  1285.     listX[4][2*i+1]=listX[0][i]->top_field;
  1286.   }
  1287.   listXsize[2]=listXsize[4]=listXsize[0] * 2;
  1288.   for (i=0; i<listXsize[1]; i++)
  1289.   {
  1290.     listX[3][2*i]  =listX[1][i]->top_field;
  1291.     listX[3][2*i+1]=listX[1][i]->bottom_field;
  1292.     listX[5][2*i]  =listX[1][i]->bottom_field;
  1293.     listX[5][2*i+1]=listX[1][i]->top_field;
  1294.   }
  1295.   listXsize[3]=listXsize[5]=listXsize[1] * 2;
  1296. }
  1297.  /*!
  1298.  ************************************************************************
  1299.  * brief
  1300.  *    Returns short term pic with given picNum
  1301.  *
  1302.  ************************************************************************
  1303.  */
  1304. static StorablePicture*  get_short_term_pic(int picNum)
  1305. {
  1306.   unsigned i;
  1307.   for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1308.   {
  1309.     if (img->structure==FRAME)
  1310.     {
  1311.       if (dpb.fs_ref[i]->is_reference == 3)
  1312.         if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNum))
  1313.           return dpb.fs_ref[i]->frame;
  1314.     }
  1315.     else
  1316.     {
  1317.       if (dpb.fs_ref[i]->is_reference & 1)
  1318.         if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNum))
  1319.           return dpb.fs_ref[i]->top_field;
  1320.       if (dpb.fs_ref[i]->is_reference & 2)
  1321.         if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNum))
  1322.           return dpb.fs_ref[i]->bottom_field;
  1323.     }
  1324.   }
  1325.   return NULL;
  1326. }
  1327. /*!
  1328.  ************************************************************************
  1329.  * brief
  1330.  *    Returns short term pic with given LongtermPicNum
  1331.  *
  1332.  ************************************************************************
  1333.  */
  1334. static StorablePicture*  get_long_term_pic(int LongtermPicNum)
  1335. {
  1336.   unsigned i;
  1337.   for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1338.   {
  1339.     if (img->structure==FRAME)
  1340.     {
  1341.       if (dpb.fs_ltref[i]->is_reference == 3)
  1342.         if ((dpb.fs_ltref[i]->frame->is_long_term)&&(dpb.fs_ltref[i]->frame->long_term_pic_num == LongtermPicNum))
  1343.           return dpb.fs_ltref[i]->frame;
  1344.     }
  1345.     else
  1346.     {
  1347.       if (dpb.fs_ltref[i]->is_reference & 1)
  1348.         if ((dpb.fs_ltref[i]->top_field->is_long_term)&&(dpb.fs_ltref[i]->top_field->long_term_pic_num == LongtermPicNum))
  1349.           return dpb.fs_ltref[i]->top_field;
  1350.       if (dpb.fs_ltref[i]->is_reference & 2)
  1351.         if ((dpb.fs_ltref[i]->bottom_field->is_long_term)&&(dpb.fs_ltref[i]->bottom_field->long_term_pic_num == LongtermPicNum))
  1352.           return dpb.fs_ltref[i]->bottom_field;
  1353.     }
  1354.   }
  1355.   return NULL;
  1356. }
  1357. /*!
  1358.  ************************************************************************
  1359.  * brief
  1360.  *    Reordering process for short-term reference pictures
  1361.  *
  1362.  ************************************************************************
  1363.  */
  1364. static void reorder_short_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int picNumLX, int *refIdxLX)
  1365. {
  1366.   int cIdx, nIdx;
  1367.   StorablePicture *picLX;
  1368.   picLX = get_short_term_pic(picNumLX);
  1369.   for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )
  1370.     RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];
  1371.   RefPicListX[ (*refIdxLX)++ ] = picLX;
  1372.   nIdx = *refIdxLX;
  1373.   for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )
  1374.     if (RefPicListX[ cIdx ])
  1375.       if( (RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->pic_num != picNumLX ))
  1376.         RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];
  1377. }
  1378. /*!
  1379.  ************************************************************************
  1380.  * brief
  1381.  *    Reordering process for short-term reference pictures
  1382.  *
  1383.  ************************************************************************
  1384.  */
  1385. static void reorder_long_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int LongTermPicNum, int *refIdxLX)
  1386. {
  1387.   int cIdx, nIdx;
  1388.   StorablePicture *picLX;
  1389.   picLX = get_long_term_pic(LongTermPicNum);
  1390.   for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )
  1391.     RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];
  1392.   RefPicListX[ (*refIdxLX)++ ] = picLX;
  1393.   nIdx = *refIdxLX;
  1394.   for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )
  1395.     if( (!RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->long_term_pic_num != LongTermPicNum ))
  1396.       RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];
  1397. }
  1398. /*!
  1399.  ************************************************************************
  1400.  * brief
  1401.  *    Reordering process for reference picture lists
  1402.  *
  1403.  ************************************************************************
  1404.  */
  1405. void reorder_ref_pic_list(StorablePicture **list, int *list_size, int num_ref_idx_lX_active_minus1, int *reordering_of_pic_nums_idc, int *abs_diff_pic_num_minus1, int *long_term_pic_idx)
  1406. {
  1407.   int i;
  1408.   int maxPicNum, currPicNum, picNumLXNoWrap, picNumLXPred, picNumLX;
  1409.   int refIdxLX = 0;
  1410.   if (img->structure==FRAME)
  1411.   {
  1412.     maxPicNum  = max_frame_num;
  1413.     currPicNum = img->frame_num;
  1414.   }
  1415.   else
  1416.   {
  1417.     maxPicNum  = 2 * max_frame_num;
  1418.     currPicNum = 2 * img->frame_num + 1;
  1419.   }
  1420.   picNumLXPred = currPicNum;
  1421.   for (i=0; reordering_of_pic_nums_idc[i]!=3; i++)
  1422.   {
  1423.     if (reordering_of_pic_nums_idc[i]>3)
  1424.       error ("Invalid remapping_of_pic_nums_idc command", 500);
  1425.     if (reordering_of_pic_nums_idc[i] < 2)
  1426.     {
  1427.       if (reordering_of_pic_nums_idc[i] == 0)
  1428.       {
  1429.         if( picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 ) < 0 )
  1430.           picNumLXNoWrap = picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 ) + maxPicNum;
  1431.         else
  1432.           picNumLXNoWrap = picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 );
  1433.       }
  1434.       else // (reordering_of_pic_nums_idc[i] == 1)
  1435.       {
  1436.         if( picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 )  >=  maxPicNum )
  1437.           picNumLXNoWrap = picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 ) - maxPicNum;
  1438.         else
  1439.           picNumLXNoWrap = picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 );
  1440.       }
  1441.       picNumLXPred = picNumLXNoWrap;
  1442.       if( picNumLXNoWrap > currPicNum )
  1443.         picNumLX = picNumLXNoWrap - maxPicNum;
  1444.       else
  1445.         picNumLX = picNumLXNoWrap;
  1446.       reorder_short_term(list, num_ref_idx_lX_active_minus1, picNumLX, &refIdxLX);
  1447.     }
  1448.     else //(reordering_of_pic_nums_idc[i] == 2)
  1449.     {
  1450.       reorder_long_term(list, num_ref_idx_lX_active_minus1, long_term_pic_idx[i], &refIdxLX);
  1451.     }
  1452.   }
  1453.   // that's a definition
  1454.   *list_size = num_ref_idx_lX_active_minus1 + 1;
  1455. }
  1456. /*!
  1457.  ************************************************************************
  1458.  * brief
  1459.  *    Update the list of frame stores that contain reference frames/fields
  1460.  *
  1461.  ************************************************************************
  1462.  */
  1463. void update_ref_list(void)
  1464. {
  1465.   unsigned i, j;
  1466.   for (i=0, j=0; i<dpb.used_size; i++)
  1467.   {
  1468.     if (is_short_term_reference(dpb.fs[i]))
  1469.     {
  1470.       dpb.fs_ref[j++]=dpb.fs[i];
  1471.     }
  1472.   }
  1473.   dpb.ref_frames_in_buffer = j;
  1474.   while (j<dpb.size)
  1475.   {
  1476.     dpb.fs_ref[j++]=NULL;
  1477.   }
  1478. }
  1479. /*!
  1480.  ************************************************************************
  1481.  * brief
  1482.  *    Update the list of frame stores that contain long-term reference
  1483.  *    frames/fields
  1484.  *
  1485.  ************************************************************************
  1486.  */
  1487. void update_ltref_list(void)
  1488. {
  1489.   unsigned i, j;
  1490.   for (i=0, j=0; i<dpb.used_size; i++)
  1491.   {
  1492.     if (is_long_term_reference(dpb.fs[i]))
  1493.     {
  1494.       dpb.fs_ltref[j++]=dpb.fs[i];
  1495.     }
  1496.   }
  1497.   dpb.ltref_frames_in_buffer=j;
  1498.   while (j<dpb.size)
  1499.   {
  1500.     dpb.fs_ltref[j++]=NULL;
  1501.   }
  1502. }
  1503. /*!
  1504.  ************************************************************************
  1505.  * brief
  1506.  *    Perform Memory management for idr pictures
  1507.  *
  1508.  ************************************************************************
  1509.  */
  1510. static void idr_memory_management(StorablePicture* p)
  1511. {
  1512.   unsigned i;
  1513.   assert (img->currentPicture->idr_flag);
  1514.   if (img->no_output_of_prior_pics_flag)
  1515.   {
  1516.     // free all stored pictures
  1517.     for (i=0; i<dpb.used_size; i++)
  1518.     {
  1519.       // reset all reference settings
  1520.       free_frame_store(dpb.fs[i]);
  1521.       dpb.fs[i] = alloc_frame_store();
  1522.     }
  1523.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1524.     {
  1525.       dpb.fs_ref[i]=NULL;
  1526.     }
  1527.     for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1528.     {
  1529.       dpb.fs_ltref[i]=NULL;
  1530.     }
  1531.     dpb.used_size=0;
  1532.   }
  1533.   else
  1534.   {
  1535.     flush_dpb();
  1536.   }
  1537.   dpb.last_picture = NULL;
  1538.   update_ref_list();
  1539.   update_ltref_list();
  1540.   dpb.last_output_poc = INT_MIN;
  1541.   if (img->long_term_reference_flag)
  1542.   {
  1543.     dpb.max_long_term_pic_idx = 0;
  1544.     p->is_long_term           = 1;
  1545.     p->long_term_frame_idx    = 0;
  1546.   }
  1547.   else
  1548.   {
  1549.     dpb.max_long_term_pic_idx = -1;
  1550.     p->is_long_term           = 0;
  1551.   }
  1552. }
  1553. /*!
  1554.  ************************************************************************
  1555.  * brief
  1556.  *    Perform Sliding window decoded reference picture marking process
  1557.  *
  1558.  ************************************************************************
  1559.  */
  1560. static void sliding_window_memory_management(StorablePicture* p)
  1561. {
  1562.   unsigned i;
  1563.   assert (!img->currentPicture->idr_flag);
  1564.   // if this is a reference pic with sliding sliding window, unmark first ref frame
  1565.   if (dpb.ref_frames_in_buffer==active_sps->num_ref_frames - dpb.ltref_frames_in_buffer)
  1566.   {
  1567.     for (i=0; i<dpb.used_size;i++)
  1568.     {
  1569.       if (dpb.fs[i]->is_reference  && (!(dpb.fs[i]->is_long_term)))
  1570.       {
  1571.         unmark_for_reference(dpb.fs[i]);
  1572.         update_ref_list();
  1573.         break;
  1574.       }
  1575.     }
  1576.   }
  1577.   p->is_long_term = 0;
  1578. }
  1579. /*!
  1580.  ************************************************************************
  1581.  * brief
  1582.  *    Calculate picNumX
  1583.  ************************************************************************
  1584.  */
  1585. static int get_pic_num_x (StorablePicture *p, int difference_of_pic_nums_minus1)
  1586. {
  1587.   int currPicNum;
  1588.   if (p->structure == FRAME)
  1589.     currPicNum = p->frame_num;
  1590.   else
  1591.     currPicNum = 2 * p->frame_num + 1;
  1592.   return currPicNum - (difference_of_pic_nums_minus1 + 1);
  1593. }
  1594. /*!
  1595.  ************************************************************************
  1596.  * brief
  1597.  *    Adaptive Memory Management: Mark short term picture unused
  1598.  ************************************************************************
  1599.  */
  1600. static void mm_unmark_short_term_for_reference(StorablePicture *p, int difference_of_pic_nums_minus1)
  1601. {
  1602.   int picNumX;
  1603.   unsigned i;
  1604.   picNumX = get_pic_num_x(p, difference_of_pic_nums_minus1);
  1605.   for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1606.   {
  1607.     if (p->structure == FRAME)
  1608.     {
  1609.       if ((dpb.fs_ref[i]->is_reference==3) && (dpb.fs_ref[i]->is_long_term==0))
  1610.       {
  1611.         if (dpb.fs_ref[i]->frame->pic_num == picNumX)
  1612.         {
  1613.           unmark_for_reference(dpb.fs_ref[i]);
  1614.           return;
  1615.         }
  1616.       }
  1617.     }
  1618.     else
  1619.     {
  1620.       if ((dpb.fs_ref[i]->is_reference & 1) && (!(dpb.fs_ref[i]->is_long_term & 1)))
  1621.       {
  1622.         if (dpb.fs_ref[i]->top_field->pic_num == picNumX)
  1623.         {
  1624.           dpb.fs_ref[i]->top_field->used_for_reference = 0;
  1625.           dpb.fs_ref[i]->is_reference &= 2;
  1626.           if (dpb.fs_ref[i]->is_used == 3)
  1627.           {
  1628.             dpb.fs_ref[i]->frame->used_for_reference = 0;
  1629.           }
  1630.           return;
  1631.         }
  1632.       }
  1633.       if ((dpb.fs_ref[i]->is_reference & 2) && (!(dpb.fs_ref[i]->is_long_term & 2)))
  1634.       {
  1635.         if (dpb.fs_ref[i]->bottom_field->pic_num == picNumX)
  1636.         {
  1637.           dpb.fs_ref[i]->bottom_field->used_for_reference = 0;
  1638.           dpb.fs_ref[i]->is_reference &= 1;
  1639.           if (dpb.fs_ref[i]->is_used == 3)
  1640.           {
  1641.             dpb.fs_ref[i]->frame->used_for_reference = 0;
  1642.           }
  1643.           return;
  1644.         }
  1645.       }
  1646.     }
  1647.   }
  1648. }
  1649. /*!
  1650.  ************************************************************************
  1651.  * brief
  1652.  *    Adaptive Memory Management: Mark long term picture unused
  1653.  ************************************************************************
  1654.  */
  1655. static void mm_unmark_long_term_for_reference(StorablePicture *p, int long_term_pic_num)
  1656. {
  1657.   unsigned i;
  1658.   for (i=0; i<dpb.ltref_frames_in_buffer; i++)
  1659.   {
  1660.     if (p->structure == FRAME)
  1661.     {
  1662.       if ((dpb.fs_ltref[i]->is_reference==3) && (dpb.fs_ltref[i]->is_long_term==3))
  1663.       {
  1664.         if (dpb.fs_ltref[i]->frame->long_term_pic_num == long_term_pic_num)
  1665.         {
  1666.           unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1667.         }
  1668.       }
  1669.     }
  1670.     else
  1671.     {
  1672.       if ((dpb.fs_ltref[i]->is_reference & 1) && ((dpb.fs_ltref[i]->is_long_term & 1)))
  1673.       {
  1674.         if (dpb.fs_ltref[i]->top_field->long_term_pic_num == long_term_pic_num)
  1675.         {
  1676.           dpb.fs_ltref[i]->top_field->used_for_reference = 0;
  1677.           dpb.fs_ltref[i]->top_field->is_long_term = 0;
  1678.           dpb.fs_ltref[i]->is_reference &= 2;
  1679.           dpb.fs_ltref[i]->is_long_term &= 2;
  1680.           if (dpb.fs_ltref[i]->is_used == 3)
  1681.           {
  1682.             dpb.fs_ltref[i]->frame->used_for_reference = 0;
  1683.             dpb.fs_ltref[i]->frame->is_long_term = 0;
  1684.           }
  1685.           return;
  1686.         }
  1687.       }
  1688.       if ((dpb.fs_ltref[i]->is_reference & 2) && ((dpb.fs_ltref[i]->is_long_term & 2)))
  1689.       {
  1690.         if (dpb.fs_ltref[i]->bottom_field->long_term_pic_num == long_term_pic_num)
  1691.         {
  1692.           dpb.fs_ltref[i]->bottom_field->used_for_reference = 0;
  1693.           dpb.fs_ltref[i]->bottom_field->is_long_term = 0;
  1694.           dpb.fs_ltref[i]->is_reference &= 1;
  1695.           dpb.fs_ltref[i]->is_long_term &= 1;
  1696.           if (dpb.fs_ltref[i]->is_used == 3)
  1697.           {
  1698.             dpb.fs_ltref[i]->frame->used_for_reference = 0;
  1699.             dpb.fs_ltref[i]->frame->is_long_term = 0;
  1700.           }
  1701.           return;
  1702.         }
  1703.       }
  1704.     }
  1705.   }
  1706. }
  1707. /*!
  1708.  ************************************************************************
  1709.  * brief
  1710.  *    Mark a long-term reference frame or complementary field pair unused for referemce
  1711.  ************************************************************************
  1712.  */
  1713. static void unmark_long_term_frame_for_reference_by_frame_idx(int long_term_frame_idx)
  1714. {
  1715.   unsigned i;
  1716.   for(i=0; i<dpb.ltref_frames_in_buffer; i++)
  1717.   {
  1718.     if (dpb.fs_ltref[i]->long_term_frame_idx == long_term_frame_idx)
  1719.       unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1720.   }
  1721. }
  1722. /*!
  1723.  ************************************************************************
  1724.  * brief
  1725.  *    Mark a long-term reference field unused for reference only if it's not
  1726.  *    the complementary field of the picture indicated by picNumX
  1727.  ************************************************************************
  1728.  */
  1729. static void unmark_long_term_field_for_reference_by_frame_idx(PictureStructure structure, int long_term_frame_idx, int mark_current, unsigned curr_frame_num, int curr_pic_num)
  1730. {
  1731.   unsigned i;
  1732.   assert(structure!=FRAME);
  1733.   if (curr_pic_num<0)
  1734.     curr_pic_num+=(2*max_frame_num);
  1735.   for(i=0; i<dpb.ltref_frames_in_buffer; i++)
  1736.   {
  1737.     if (dpb.fs_ltref[i]->long_term_frame_idx == long_term_frame_idx)
  1738.     {
  1739.       if (structure == TOP_FIELD)
  1740.       {
  1741.         if ((dpb.fs_ltref[i]->is_long_term == 3))
  1742.         {
  1743.           unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1744.         }
  1745.         else
  1746.         {
  1747.           if ((dpb.fs_ltref[i]->is_long_term == 1))
  1748.           {
  1749.             unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1750.           }
  1751.           else
  1752.           {
  1753.             if (mark_current)
  1754.             {
  1755.               if (dpb.last_picture)
  1756.               {
  1757.                 if ( ( dpb.last_picture != dpb.fs_ltref[i] )|| dpb.last_picture->frame_num != curr_frame_num)
  1758.                   unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1759.               }
  1760.               else
  1761.               {
  1762.                 unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1763.               }
  1764.             }
  1765.             else
  1766.             {
  1767.               if ((dpb.fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num/2))
  1768.               {
  1769.                 unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1770.               }
  1771.             }
  1772.           }
  1773.         }
  1774.       }
  1775.       if (structure == BOTTOM_FIELD)
  1776.       {
  1777.         if ((dpb.fs_ltref[i]->is_long_term == 3))
  1778.         {
  1779.           unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1780.         }
  1781.         else
  1782.         {
  1783.           if ((dpb.fs_ltref[i]->is_long_term == 2))
  1784.           {
  1785.             unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1786.           }
  1787.           else
  1788.           {
  1789.             if (mark_current)
  1790.             {
  1791.               if (dpb.last_picture)
  1792.               {
  1793.                 if ( ( dpb.last_picture != dpb.fs_ltref[i] )|| dpb.last_picture->frame_num != curr_frame_num)
  1794.                   unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1795.               }
  1796.               else
  1797.               {
  1798.                 unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1799.               }
  1800.             }
  1801.             else
  1802.             {
  1803.               if ((dpb.fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num/2))
  1804.               {
  1805.                 unmark_for_long_term_reference(dpb.fs_ltref[i]);
  1806.               }
  1807.             }
  1808.           }
  1809.         }
  1810.       }
  1811.     }
  1812.   }
  1813. }
  1814. /*!
  1815.  ************************************************************************
  1816.  * brief
  1817.  *    mark a picture as long-term reference
  1818.  ************************************************************************
  1819.  */
  1820. static void mark_pic_long_term(StorablePicture* p, int long_term_frame_idx, int picNumX)
  1821. {
  1822.   unsigned i;
  1823.   int add_top, add_bottom;
  1824.   if (p->structure == FRAME)
  1825.   {
  1826.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1827.     {
  1828.       if (dpb.fs_ref[i]->is_reference == 3)
  1829.       {
  1830.         if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNumX))
  1831.         {
  1832.           dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_frame_idx
  1833.                                              = long_term_frame_idx;
  1834.           dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
  1835.           dpb.fs_ref[i]->frame->is_long_term = 1;
  1836.           if (dpb.fs_ref[i]->top_field && dpb.fs_ref[i]->bottom_field)
  1837.           {
  1838.             dpb.fs_ref[i]->top_field->long_term_frame_idx = dpb.fs_ref[i]->bottom_field->long_term_frame_idx
  1839.                                                           = long_term_frame_idx;
  1840.             dpb.fs_ref[i]->top_field->long_term_pic_num = long_term_frame_idx;
  1841.             dpb.fs_ref[i]->bottom_field->long_term_pic_num = long_term_frame_idx;
  1842.             dpb.fs_ref[i]->top_field->is_long_term = dpb.fs_ref[i]->bottom_field->is_long_term
  1843.                                                    = 1;
  1844.           }
  1845.           dpb.fs_ref[i]->is_long_term = 3;
  1846.           return;
  1847.         }
  1848.       }
  1849.     }
  1850.     printf ("Warning: reference frame for long term marking not foundn");
  1851.   }
  1852.   else
  1853.   {
  1854.     if (p->structure == TOP_FIELD)
  1855.     {
  1856.       add_top    = 1;
  1857.       add_bottom = 0;
  1858.     }
  1859.     else
  1860.     {
  1861.       add_top    = 0;
  1862.       add_bottom = 1;
  1863.     }
  1864.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1865.     {
  1866.       if (dpb.fs_ref[i]->is_reference & 1)
  1867.       {
  1868.         if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNumX))
  1869.         {
  1870.           if ((dpb.fs_ref[i]->is_long_term) && (dpb.fs_ref[i]->long_term_frame_idx != long_term_frame_idx))
  1871.           {
  1872.               printf ("Warning: assigning long_term_frame_idx different from other fieldn");
  1873.           }
  1874.           dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->top_field->long_term_frame_idx
  1875.                                              = long_term_frame_idx;
  1876.           dpb.fs_ref[i]->top_field->long_term_pic_num = 2 * long_term_frame_idx + add_top;
  1877.           dpb.fs_ref[i]->top_field->is_long_term = 1;
  1878.           dpb.fs_ref[i]->is_long_term |= 1;
  1879.           if (dpb.fs_ref[i]->is_long_term == 3)
  1880.           {
  1881.             dpb.fs_ref[i]->frame->is_long_term = 1;
  1882.             dpb.fs_ref[i]->frame->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
  1883.           }
  1884.           return;
  1885.         }
  1886.       }
  1887.       if (dpb.fs_ref[i]->is_reference & 2)
  1888.       {
  1889.         if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNumX))
  1890.         {
  1891.           if ((dpb.fs_ref[i]->is_long_term) && (dpb.fs_ref[i]->long_term_frame_idx != long_term_frame_idx))
  1892.           {
  1893.               printf ("Warning: assigning long_term_frame_idx different from other fieldn");
  1894.           }
  1895.           dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->bottom_field->long_term_frame_idx
  1896.                                              = long_term_frame_idx;
  1897.           dpb.fs_ref[i]->bottom_field->long_term_pic_num = 2 * long_term_frame_idx + add_bottom;
  1898.           dpb.fs_ref[i]->bottom_field->is_long_term = 1;
  1899.           dpb.fs_ref[i]->is_long_term |= 2;
  1900.           if (dpb.fs_ref[i]->is_long_term == 3)
  1901.           {
  1902.             dpb.fs_ref[i]->frame->is_long_term = 1;
  1903.             dpb.fs_ref[i]->frame->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
  1904.           }
  1905.           return;
  1906.         }
  1907.       }
  1908.     }
  1909.     printf ("Warning: reference field for long term marking not foundn");
  1910.   }
  1911. }
  1912. /*!
  1913.  ************************************************************************
  1914.  * brief
  1915.  *    Assign a long term frame index to a short term picture
  1916.  ************************************************************************
  1917.  */
  1918. static void mm_assign_long_term_frame_idx(StorablePicture* p, int difference_of_pic_nums_minus1, int long_term_frame_idx)
  1919. {
  1920.   int picNumX;
  1921.   picNumX = get_pic_num_x(p, difference_of_pic_nums_minus1);
  1922.   // remove frames/fields with same long_term_frame_idx
  1923.   if (p->structure == FRAME)
  1924.   {
  1925.     unmark_long_term_frame_for_reference_by_frame_idx(long_term_frame_idx);
  1926.   }
  1927.   else
  1928.   {
  1929.     unsigned i;
  1930.     PictureStructure structure = FRAME;
  1931.     for (i=0; i<dpb.ref_frames_in_buffer; i++)
  1932.     {
  1933.       if (dpb.fs_ref[i]->is_reference & 1)
  1934.       {
  1935.         if (dpb.fs_ref[i]->top_field->pic_num == picNumX)
  1936.         {
  1937.           structure = TOP_FIELD;
  1938.           break;
  1939.         }
  1940.       }
  1941.       if (dpb.fs_ref[i]->is_reference & 2)
  1942.       {
  1943.         if (dpb.fs_ref[i]->bottom_field->pic_num == picNumX)
  1944.         {
  1945.           structure = BOTTOM_FIELD;
  1946.           break;
  1947.         }
  1948.       }
  1949.     }
  1950.     if (structure==FRAME)
  1951.     {
  1952.       error ("field for long term marking not found",200);
  1953.     }
  1954.     unmark_long_term_field_for_reference_by_frame_idx(structure, long_term_frame_idx, 0, 0, picNumX);
  1955.   }
  1956.   mark_pic_long_term(p, long_term_frame_idx, picNumX);
  1957. }
  1958. /*!
  1959.  ************************************************************************
  1960.  * brief
  1961.  *    Set new max long_term_frame_idx
  1962.  ************************************************************************
  1963.  */
  1964. void mm_update_max_long_term_frame_idx(int max_long_term_frame_idx_plus1)
  1965. {
  1966.   unsigned i;