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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file errdo.c
  4.  *
  5.  * brief
  6.  *    Contains functions that implement the "decoders in the encoder" concept for the
  7.  *    rate-distortion optimization with losses.
  8.  * date
  9.  *    October 22nd, 2001
  10.  *
  11.  * author
  12.  *    Main contributors (see contributors.h for copyright, address and
  13.  *    affiliation details)
  14.  *    - Dimitrios Kontopodis                    <dkonto@eikon.tum.de>
  15.  *    Code revamped July 2008 by:
  16.  *    - Peshala Pahalawatta (ppaha@dolby.com)
  17.  *************************************************************************************
  18.  */
  19. #include "global.h"
  20. #include "refbuf.h"
  21. #include "image.h"
  22. #include "errdo.h"
  23. #include "errdo_mc_prediction.h"
  24. static StorablePicture* find_nearest_ref_picture(int poc);
  25. static void copy_conceal_mb (StorablePicture *enc_pic, ImageParameters* image, int decoder, int mb_error, Macroblock* currMB, StorablePicture* refPic);
  26. static void get_predicted_mb(StorablePicture *enc_pic, ImageParameters* image, int decoder, Macroblock* currMB);
  27. static void add_residue     (StorablePicture *enc_pic, int decoder, int pl, int block8x8, int x_size, int y_size);
  28. static void Build_Status_Map(byte **s_map);
  29. extern void DeblockFrame(ImageParameters *img, imgpel **, imgpel ***);
  30. /*!
  31. **************************************************************************************
  32. * brief 
  33. *      Decodes one macroblock for error resilient RDO.  
  34. *    Currently does not support:
  35. *    1) B coded pictures
  36. *    2) Chroma components
  37. *    3) Potential error propagation due to intra prediction
  38. *    4) Field coding
  39. **************************************************************************************
  40. */
  41. void decode_one_mb (ImageParameters *image, StorablePicture *enc_pic, int decoder, Macroblock* currMB)
  42. {
  43.   int i0, j;
  44.   static imgpel** curComp;
  45.   static imgpel** oldComp;
  46.   if (currMB->mb_type > P8x8) //Intra MB
  47.   {
  48.     curComp = &enc_pic->p_dec_img[0][decoder][image->pix_y];
  49.     oldComp = &enc_pic->p_curr_img[image->pix_y];
  50.     i0 = image->pix_x;
  51.     for (j = 0; j < MB_BLOCK_SIZE; j++)
  52.     {
  53.       memcpy(&(curComp[j][i0]), &(oldComp[j][i0]), MB_BLOCK_SIZE*sizeof(imgpel));
  54.     }
  55.   }
  56.   else if (currMB->mb_type == 0)
  57.   {
  58.     get_predicted_mb(enc_pic, image, decoder, currMB);
  59.     curComp = &enc_pic->p_dec_img[0][decoder][image->pix_y];
  60.     for(j = 0; j < image->mb_size[0][1]; j++)
  61.     {                
  62.       memcpy(&(curComp[j][image->pix_x]), &(image->mb_pred[0][j][0]), image->mb_size[0][0] * sizeof(imgpel));
  63.     }
  64.   }
  65.   else 
  66.   {
  67.     get_predicted_mb(enc_pic, image, decoder, currMB);
  68.     add_residue(enc_pic, decoder, PLANE_Y, 0, MB_BLOCK_SIZE, MB_BLOCK_SIZE);
  69.   }
  70. }
  71. /*!
  72. **************************************************************************************
  73. * brief 
  74. *      Finds predicted macroblock values 
  75. *   and copies them to img->mb_pred[0][][]
  76. *   Requires img->all_mv, enc_picture->motion.ref_idx to be correct for current
  77. *   macroblock.
  78. **************************************************************************************
  79. */
  80. static void get_predicted_mb(StorablePicture *enc_pic, ImageParameters* image, int decoder, Macroblock* currMB)
  81. {
  82.   int i,j,k;
  83.   int block_size_x, block_size_y;
  84.   int mv_mode, pred_dir;
  85.   int list_offset   = 0; //For now
  86.   int curr_mb_field = 0; //For now
  87.   static const byte decode_block_scan[16] = {0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15};
  88.   int block8x8;
  89.   int k_start, k_end, k_inc;
  90.   if (!currMB->mb_type)
  91.   {
  92.     block_size_x = MB_BLOCK_SIZE;
  93.     block_size_y = MB_BLOCK_SIZE;
  94.     pred_dir = LIST_0;
  95.     perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, 0, 0, 0, 0, list_offset, block_size_x, block_size_y, curr_mb_field);
  96.   }
  97.   else if (currMB->mb_type == 1)
  98.   {
  99.     block_size_x = MB_BLOCK_SIZE;
  100.     block_size_y = MB_BLOCK_SIZE;
  101.     pred_dir = currMB->b8pdir[0];   
  102.     perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, 1, 0, 0, 0, list_offset, block_size_x, block_size_y, curr_mb_field);
  103.   }
  104.   else if (currMB->mb_type == 2)
  105.   {   
  106.     block_size_x = MB_BLOCK_SIZE;
  107.     block_size_y = 8;    
  108.     for (block8x8 = 0; block8x8 < 4; block8x8 += 2)
  109.     {
  110.       pred_dir = currMB->b8pdir[block8x8];
  111.       perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, 2, 0, 0, block8x8, list_offset, block_size_x, block_size_y, curr_mb_field);
  112.     }
  113.   }
  114.   else if (currMB->mb_type == 3)
  115.   {   
  116.     block_size_x = 8;
  117.     block_size_y = 16;
  118.     for (block8x8 = 0; block8x8 < 2; block8x8++)
  119.     {
  120.       i = block8x8<<1;
  121.       j = 0;      
  122.       pred_dir = currMB->b8pdir[block8x8];
  123.       assert (pred_dir<=2);
  124.       perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, 3, 0, i, j, list_offset, block_size_x, block_size_y, curr_mb_field);
  125.     }
  126.   }
  127.   else //Need to change to support B slices.
  128.   {
  129.     for (block8x8 = 0; block8x8 < 4; block8x8++)
  130.     {
  131.       mv_mode  = currMB->b8mode[block8x8];
  132.       pred_dir = currMB->b8pdir[block8x8];
  133.       if ( mv_mode != 0 )
  134.       {
  135.         k_start = (block8x8 << 2);
  136.         k_inc = (mv_mode == 5) ? 2 : 1;
  137.         k_end = (mv_mode == 4) ? k_start + 1 : ((mv_mode == 7) ? k_start + 4 : k_start + k_inc + 1);
  138.         block_size_x = ( mv_mode == 5 || mv_mode == 4 ) ? 8 : 4;
  139.         block_size_y = ( mv_mode == 6 || mv_mode == 4 ) ? 8 : 4;
  140.         for (k = k_start; k < k_end; k += k_inc)
  141.         {
  142.           i =  (decode_block_scan[k] & 3);
  143.           j = ((decode_block_scan[k] >> 2) & 3);
  144.           perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, mv_mode, 0, i, j, list_offset, block_size_x, block_size_y, curr_mb_field);
  145.         }        
  146.       }
  147.     }
  148.   }
  149. }
  150. /*!
  151. **************************************************************************************
  152. * brief 
  153. *      Decodes one 8x8 partition for error resilient RDO.  
  154. *    Currently does not support:
  155. *    1) B coded pictures
  156. *    2) Chroma components
  157. *    3) Potential error propagation due to intra prediction
  158. *    4) Field coding
  159. **************************************************************************************
  160. */
  161. void decode_one_b8block (ImageParameters *image, StorablePicture *enc_pic, int decoder, int mbmode, int block8x8, short mv_mode, short b8ref) //b8ref may not be necessary any more.
  162. {
  163.   int i,j,k;
  164.   int block_size_x, block_size_y;
  165.   int i0 = (block8x8 & 0x01)<<3;
  166.   int j0 = (block8x8 >> 1)<<3,   j1 = j0+8;
  167.   int list_offset = 0;
  168.   int curr_mb_field = 0;
  169.   imgpel **curComp;
  170.   imgpel **oldComp;
  171.   int pred_dir;
  172.   int k_start, k_end, k_inc;
  173.   static const byte decode_block_scan[16] = {0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15};
  174.   if (mv_mode > 8)  //Intra
  175.   {
  176.     for(j = j0; j < j1; j++)
  177.     {
  178.       curComp = &enc_pic->p_dec_img[0][decoder][image->pix_y];
  179.       oldComp = &enc_pic->p_curr_img[image->pix_y];
  180.       memcpy(&(curComp[j][i0]), &(oldComp[j][i0]), sizeof(imgpel)*8);
  181.     }
  182.   }
  183.   else
  184.   {
  185.     pred_dir = 0;
  186.     k_start = (block8x8 << 2);
  187.     k_inc = (mv_mode == 5) ? 2 : 1;
  188.     k_end = (mv_mode == 4) ? k_start + 1 : ((mv_mode == 7) ? k_start + 4 : k_start + k_inc + 1);
  189.     block_size_x = ( mv_mode == 5 || mv_mode == 4 ) ? 8 : 4;
  190.     block_size_y = ( mv_mode == 6 || mv_mode == 4 ) ? 8 : 4;
  191.     for (k = k_start; k < k_end; k += k_inc)
  192.     {
  193.       i =  (decode_block_scan[k] & 3);
  194.       j = ((decode_block_scan[k] >> 2) & 3);
  195.       perform_mc(decoder, PLANE_Y, enc_pic, image, pred_dir, mv_mode, 0, i, j, list_offset, block_size_x, block_size_y, curr_mb_field);
  196.     }        
  197.     add_residue(enc_pic, decoder, PLANE_Y, block8x8, 8, 8);
  198.   }
  199. }
  200. /*!
  201. **************************************************************************************
  202. * brief 
  203. *      Add residual to motion predicted block
  204. **************************************************************************************
  205. */
  206. static void add_residue (StorablePicture *enc_pic, int decoder, int pl, int block8x8, int x_size, int y_size) 
  207. {
  208.   int i,j;
  209.   int i0 = (block8x8 & 0x01)<<3, i1 = i0 + x_size;
  210.   int j0 = (block8x8 >> 1)<<3,   j1 = j0 + y_size;
  211.   imgpel **p_dec_img  = &enc_pic->p_dec_img[pl][decoder][img->pix_y];
  212.   int (*res_img)[16]  = decs->res_img[0];
  213.   imgpel (*mpr)[16]   = img->mb_pred[pl];
  214.   for (j = j0; j < j1; j++)
  215.   {
  216.     for (i = i0; i < i1; i++)
  217.     {
  218.       p_dec_img[j][img->pix_x+i] = iClip3(0, img->max_imgpel_value_comp[pl], (mpr[j][i] + res_img[j][i])); 
  219.     } 
  220.   }
  221. }
  222. /*!
  223.  *************************************************************************************
  224.  * brief
  225.  *    Performs the simulation of the packet losses, calls the error concealment funcs
  226.  *    and copies the decoded images to the reference frame buffers of the decoders
  227.  *
  228.  *************************************************************************************
  229.  */
  230. void UpdateDecoders(InputParameters *params, ImageParameters *image, StorablePicture *enc_pic)
  231. {
  232.   int k;
  233.   for (k = 0; k < params->NoOfDecoders; k++)
  234.   {
  235.     Build_Status_Map(enc_pic->mb_error_map[k]); // simulates the packet losses
  236.     error_conceal_picture(image, enc_pic, k); 
  237.     DeblockFrame (image, enc_pic->p_dec_img[0][k], NULL);
  238.   }
  239. }
  240. /*!
  241.  *************************************************************************************
  242.  * brief
  243.  *    Initialize error concealment function
  244.  *    (Currently only copy concealment is implemented. Can extend to other concealment
  245.  *    types when available.)
  246.  *
  247.  *************************************************************************************
  248.  */
  249. void init_error_conceal(int concealment_type)
  250. {
  251.   error_conceal_picture = copy_conceal_picture;
  252. }
  253. /*!
  254. **************************************************************************************
  255. * brief 
  256. *      Finds predicted macroblock values for error concealment
  257. *   and copies them to img->mb_pred[0][][]
  258. *   Requires enc_picture->motion.mv and enc_picture->motion.ref_idx to be correct for 
  259. *   current picture.
  260. **************************************************************************************
  261. */
  262. static void get_predicted_concealment_mb(StorablePicture* enc_pic, ImageParameters* image, int decoder, Macroblock* currMB)
  263. {
  264.   int i,j,k;
  265.   int block_size_x, block_size_y;
  266.   int mv_mode, pred_dir;
  267.   static const byte decode_block_scan[16] = {0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15};
  268.   int block8x8;
  269.   int k_start, k_end, k_inc;
  270.   if (!currMB->mb_type)
  271.   {
  272.     block_size_x = MB_BLOCK_SIZE;
  273.     block_size_y = MB_BLOCK_SIZE;
  274.     pred_dir = LIST_0;
  275.     perform_mc_concealment(decoder, PLANE_Y, enc_pic, image, pred_dir, 0, 0, block_size_x, block_size_y);
  276.   }
  277.   else if (currMB->mb_type == 1)
  278.   {
  279.     block_size_x = MB_BLOCK_SIZE;
  280.     block_size_y = MB_BLOCK_SIZE;
  281.     pred_dir = currMB->b8pdir[0];   
  282.     perform_mc_concealment(decoder, PLANE_Y, enc_pic, image, pred_dir, 0, 0, block_size_x, block_size_y);
  283.   }
  284.   else if (currMB->mb_type == 2)
  285.   {   
  286.     block_size_x = MB_BLOCK_SIZE;
  287.     block_size_y = 8;    
  288.     for (block8x8 = 0; block8x8 < 4; block8x8 += 2)
  289.     {
  290.       pred_dir = currMB->b8pdir[block8x8];
  291.       perform_mc_concealment(decoder, PLANE_Y, enc_pic, image, pred_dir, 0, block8x8, block_size_x, block_size_y);
  292.     }
  293.   }
  294.   else if (currMB->mb_type == 3)
  295.   {   
  296.     block_size_x = 8;
  297.     block_size_y = 16;
  298.     for (block8x8 = 0; block8x8 < 2; block8x8++)
  299.     {
  300.       i = block8x8<<1;
  301.       j = 0;      
  302.       pred_dir = currMB->b8pdir[block8x8];
  303.       assert (pred_dir<=2);
  304.       perform_mc_concealment(decoder, PLANE_Y, enc_pic, image, pred_dir, i, j, block_size_x, block_size_y);
  305.     }
  306.   }
  307.   else //Need to change to support B slices.
  308.   {
  309.     for (block8x8 = 0; block8x8 < 4; block8x8++)
  310.     {
  311.       mv_mode  = currMB->b8mode[block8x8];
  312.       pred_dir = currMB->b8pdir[block8x8];
  313.       if ( mv_mode != 0 )
  314.       {
  315.         k_start = (block8x8 << 2);
  316.         k_inc = (mv_mode == 5) ? 2 : 1;
  317.         k_end = (mv_mode == 4) ? k_start + 1 : ((mv_mode == 7) ? k_start + 4 : k_start + k_inc + 1);
  318.         block_size_x = ( mv_mode == 5 || mv_mode == 4 ) ? 8 : 4;
  319.         block_size_y = ( mv_mode == 6 || mv_mode == 4 ) ? 8 : 4;
  320.         for (k = k_start; k < k_end; k += k_inc)
  321.         {
  322.           i =  (decode_block_scan[k] & 3);
  323.           j = ((decode_block_scan[k] >> 2) & 3);
  324.           perform_mc_concealment(decoder, PLANE_Y, enc_pic, image, pred_dir, i, j, block_size_x, block_size_y);
  325.         }        
  326.       }
  327.     }
  328.   }
  329. }
  330. /*!
  331.  *************************************************************************************
  332.  * brief
  333.  *    Performs copy error concealment for macroblocks with errors.
  334.  *  Note: Currently assumes that the reference picture lists remain the same for all 
  335.  *        slices of a picture. 
  336.  *  
  337.  *************************************************************************************
  338.  */
  339. void copy_conceal_picture(ImageParameters *image, StorablePicture *enc_pic, int decoder)
  340. {
  341.   unsigned int mb;
  342.   Macroblock* currMB;
  343.   int mb_error;
  344.   byte** mb_error_map = enc_pic->mb_error_map[decoder];
  345.   StorablePicture* refPic;
  346.   refPic = find_nearest_ref_picture(enc_pic->poc); //Used for concealment if actual reference pic is not known.
  347.   for (mb = 0; mb < image->PicSizeInMbs; mb++)
  348.   {
  349.     image->mb_x = PicPos[mb][0];
  350.     image->mb_y = PicPos[mb][1];
  351.     mb_error = mb_error_map[image->mb_y][image->mb_x];
  352.     if (mb_error)
  353.     {
  354.       currMB = &image->mb_data[mb];
  355.       image->block_x = image->mb_x << 2;
  356.       image->block_y = image->mb_y << 2;
  357.       image->pix_x   = image->block_x << 2;
  358.       image->pix_y   = image->block_y << 2;
  359.       copy_conceal_mb(enc_pic, image, decoder, mb_error, currMB, refPic);
  360.     }
  361.   }
  362. }
  363. /******************************************************************************************
  364. *
  365. * Perform copy error concealment for macroblock.
  366. *   
  367. *******************************************************************************************
  368. */
  369. static void copy_conceal_mb(StorablePicture *enc_pic, ImageParameters* image, int decoder, int mb_error, Macroblock* currMB, StorablePicture* refPic)
  370. {
  371.   int j, i0 = img->pix_x;
  372.   imgpel** concealed_img = &(enc_pic->p_dec_img[0][decoder][image->pix_y]);
  373.   imgpel** ref_img;
  374.   if (mb_error == 1 || (mb_error != 3 && currMB->mb_type > P8x8)) //All partitions lost, or intra mb lost
  375.   {
  376.     if (refPic != NULL) //Use nearest reference picture for concealment
  377.     {
  378.       ref_img = &(refPic->p_dec_img[0][decoder][img->pix_y]);
  379.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  380.       {
  381.         memcpy(&(concealed_img[j][i0]), &(ref_img[j][i0]), sizeof(imgpel)*MB_BLOCK_SIZE);
  382.       }
  383.     }
  384.     else //No ref picture available
  385.     {
  386.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  387.       {
  388.         memset(&(concealed_img[j][i0]), 128, sizeof(imgpel)*MB_BLOCK_SIZE); //Only reliable if sizeof(imgpel) = 1
  389.       }
  390.     }
  391.   }
  392.   else if (mb_error != 2 && image->type == P_SLICE && currMB->mb_type && currMB->mb_type < P8x8) //Only partition 3 lost, and P macroblock and not skip
  393.   {
  394.     get_predicted_concealment_mb(enc_pic, image, decoder, currMB);
  395.     for(j = 0; j < MB_BLOCK_SIZE; j++)
  396.     {                
  397.       memcpy(&(concealed_img[j][i0]), &(image->mb_pred[j][0]), MB_BLOCK_SIZE * sizeof(imgpel));
  398.     }
  399.   }
  400. }
  401. /******************************************************************************************
  402. *
  403. *  Finds reference picture with nearest POC to current picture to use for error concealment
  404. *   
  405. *******************************************************************************************
  406. */
  407. static StorablePicture* find_nearest_ref_picture(int poc)
  408. {
  409.   unsigned int i;
  410.   int min_poc_diff = 1000;
  411.   int poc_diff;
  412.   StorablePicture* refPic = NULL;
  413.   for (i = 0; i < dpb.ref_frames_in_buffer; i++)
  414.   {
  415.     if (dpb.fs_ref[i]->is_used==3)
  416.     {
  417.       if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
  418.       {
  419.         poc_diff = iabs(dpb.fs_ref[i]->frame->poc - poc);
  420.         if (poc_diff < min_poc_diff)
  421.         {
  422.           refPic = dpb.fs_ref[i]->frame;
  423.           min_poc_diff = poc_diff;
  424.         }
  425.       }
  426.     }
  427.   }
  428.   return refPic;
  429. }
  430. /*!
  431.  *************************************************************************************
  432.  * brief
  433.  *    Gives the prediction residue for a block
  434.  *************************************************************************************
  435.  */
  436. void compute_residue_block (ImageParameters *image, imgpel **imgY, int res_img[16][16], imgpel mb_pred[16][16], int b8block, int block_size) 
  437. {
  438.   int i,j;
  439.   int i0 = (b8block & 0x01)<<3,   i1 = i0+block_size;
  440.   int j0 = (b8block >> 1)<<3,     j1 = j0+block_size;
  441.   //imgpel  (*mb_pred)[16]        = (i16mode >= 0) ? image->mpr_16x16[0][i16mode] : image->mb_pred[0];;
  442.   for (i = i0; i < i1; i++)
  443.   {
  444.     for (j = j0; j < j1; j++)
  445.     {
  446.       res_img[j][i] = (int)imgY[j][image->pix_x + i] - mb_pred[j][i];
  447.     } 
  448.   }
  449. }
  450. /*!
  451.  *************************************************************************************
  452.  * brief
  453.  *    Stores the pel values for the current best mode.
  454.  *************************************************************************************
  455.  */
  456. void errdo_store_best_block(ImageParameters* image, imgpel*** mbY, imgpel*** dec_img, int i0, int j0, int block_size)
  457. {
  458.   int j, k;
  459.   int i = image->pix_x + i0;
  460.   int j1 = j0 + block_size;
  461.   
  462.   for (k = 0; k < params->NoOfDecoders; k++)
  463.   {
  464.     for (j = j0; j < j1; j++)
  465.     {
  466.       memcpy(&mbY[k][j][i0], &dec_img[k][image->pix_y + j][i], block_size * sizeof(imgpel));
  467.     }
  468.   }
  469. }
  470. /*!
  471.  *************************************************************************************
  472.  * brief
  473.  *    Restores the pel values from the current best 8x8 mode.
  474.  *************************************************************************************
  475.  */
  476. void errdo_get_best_block(ImageParameters* image, imgpel*** dec_img, imgpel*** mbY, int j0, int block_size)
  477. {
  478.   int j, k;
  479.   int j1 = j0 + block_size;
  480.   for (k = 0; k < params->NoOfDecoders; k++)
  481.   {
  482.     for (j = j0; j < j1; j++)
  483.     {
  484.       memcpy(&dec_img[k][image->pix_y + j][image->pix_x], mbY[k][j], block_size * sizeof(imgpel));
  485.     }
  486.   }
  487. }
  488. /*!
  489.  *************************************************************************************
  490.  * brief
  491.  *    Builds a random status map showing whether each MB is received or lost, based
  492.  *    on the packet loss rate and the slice structure.
  493.  *
  494.  * param s_map
  495.  *    The status map to be filled
  496.  *************************************************************************************
  497.  */
  498. static void Build_Status_Map(byte **s_map)
  499. {
  500.   int i,j,slice=-1,mb=0,jj,ii,packet_lost=0;
  501.   jj = img->height/MB_BLOCK_SIZE;
  502.   ii = img->width/MB_BLOCK_SIZE;
  503.   for (j = 0; j < jj; j++)
  504.   {
  505.     for (i = 0; i < ii; i++)
  506.     {
  507.       if (!params->slice_mode || img->mb_data[mb].slice_nr != slice) /* new slice */
  508.       {
  509.         packet_lost=0;
  510.         if ((double)rand()/(double)RAND_MAX*100 < params->LossRateC)   packet_lost += 3;
  511.         if ((double)rand()/(double)RAND_MAX*100 < params->LossRateB)   packet_lost += 2;
  512.         if ((double)rand()/(double)RAND_MAX*100 < params->LossRateA)   packet_lost  = 1;
  513.         slice++;
  514.       }
  515.       if (!packet_lost)
  516.       {
  517.         s_map[j][i]=0;  //! Packet OK
  518.       }
  519.       else
  520.       {
  521.         s_map[j][i]=packet_lost;
  522.         if(params->partition_mode == 0)  s_map[j][i]=1;
  523.       }
  524.       mb++;
  525.     }
  526.   }
  527. }