Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Error resilience / concealment
  3.  *
  4.  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. /**
  24.  * @file
  25.  * Error resilience / concealment.
  26.  */
  27.  
  28. #include <limits.h>
  29.  
  30. #include "libavutil/atomic.h"
  31. #include "libavutil/internal.h"
  32. #include "avcodec.h"
  33. #include "error_resilience.h"
  34. #include "me_cmp.h"
  35. #include "mpegutils.h"
  36. #include "mpegvideo.h"
  37. #include "rectangle.h"
  38. #include "thread.h"
  39. #include "version.h"
  40.  
  41. /**
  42.  * @param stride the number of MVs to get to the next row
  43.  * @param mv_step the number of MVs per row or column in a macroblock
  44.  */
  45. static void set_mv_strides(ERContext *s, int *mv_step, int *stride)
  46. {
  47.     if (s->avctx->codec_id == AV_CODEC_ID_H264) {
  48.         av_assert0(s->quarter_sample);
  49.         *mv_step = 4;
  50.         *stride  = s->mb_width * 4;
  51.     } else {
  52.         *mv_step = 2;
  53.         *stride  = s->b8_stride;
  54.     }
  55. }
  56.  
  57. /**
  58.  * Replace the current MB with a flat dc-only version.
  59.  */
  60. static void put_dc(ERContext *s, uint8_t *dest_y, uint8_t *dest_cb,
  61.                    uint8_t *dest_cr, int mb_x, int mb_y)
  62. {
  63.     int *linesize = s->cur_pic.f->linesize;
  64.     int dc, dcu, dcv, y, i;
  65.     for (i = 0; i < 4; i++) {
  66.         dc = s->dc_val[0][mb_x * 2 + (i &  1) + (mb_y * 2 + (i >> 1)) * s->b8_stride];
  67.         if (dc < 0)
  68.             dc = 0;
  69.         else if (dc > 2040)
  70.             dc = 2040;
  71.         for (y = 0; y < 8; y++) {
  72.             int x;
  73.             for (x = 0; x < 8; x++)
  74.                 dest_y[x + (i &  1) * 8 + (y + (i >> 1) * 8) * linesize[0]] = dc / 8;
  75.         }
  76.     }
  77.     dcu = s->dc_val[1][mb_x + mb_y * s->mb_stride];
  78.     dcv = s->dc_val[2][mb_x + mb_y * s->mb_stride];
  79.     if (dcu < 0)
  80.         dcu = 0;
  81.     else if (dcu > 2040)
  82.         dcu = 2040;
  83.     if (dcv < 0)
  84.         dcv = 0;
  85.     else if (dcv > 2040)
  86.         dcv = 2040;
  87.  
  88.     if (dest_cr)
  89.     for (y = 0; y < 8; y++) {
  90.         int x;
  91.         for (x = 0; x < 8; x++) {
  92.             dest_cb[x + y * linesize[1]] = dcu / 8;
  93.             dest_cr[x + y * linesize[2]] = dcv / 8;
  94.         }
  95.     }
  96. }
  97.  
  98. static void filter181(int16_t *data, int width, int height, int stride)
  99. {
  100.     int x, y;
  101.  
  102.     /* horizontal filter */
  103.     for (y = 1; y < height - 1; y++) {
  104.         int prev_dc = data[0 + y * stride];
  105.  
  106.         for (x = 1; x < width - 1; x++) {
  107.             int dc;
  108.             dc = -prev_dc +
  109.                  data[x     + y * stride] * 8 -
  110.                  data[x + 1 + y * stride];
  111.             dc = (dc * 10923 + 32768) >> 16;
  112.             prev_dc = data[x + y * stride];
  113.             data[x + y * stride] = dc;
  114.         }
  115.     }
  116.  
  117.     /* vertical filter */
  118.     for (x = 1; x < width - 1; x++) {
  119.         int prev_dc = data[x];
  120.  
  121.         for (y = 1; y < height - 1; y++) {
  122.             int dc;
  123.  
  124.             dc = -prev_dc +
  125.                  data[x +  y      * stride] * 8 -
  126.                  data[x + (y + 1) * stride];
  127.             dc = (dc * 10923 + 32768) >> 16;
  128.             prev_dc = data[x + y * stride];
  129.             data[x + y * stride] = dc;
  130.         }
  131.     }
  132. }
  133.  
  134. /**
  135.  * guess the dc of blocks which do not have an undamaged dc
  136.  * @param w     width in 8 pixel blocks
  137.  * @param h     height in 8 pixel blocks
  138.  */
  139. static void guess_dc(ERContext *s, int16_t *dc, int w,
  140.                      int h, int stride, int is_luma)
  141. {
  142.     int b_x, b_y;
  143.     int16_t  (*col )[4] = av_malloc_array(stride, h*sizeof( int16_t)*4);
  144.     uint32_t (*dist)[4] = av_malloc_array(stride, h*sizeof(uint32_t)*4);
  145.  
  146.     if(!col || !dist) {
  147.         av_log(s->avctx, AV_LOG_ERROR, "guess_dc() is out of memory\n");
  148.         goto fail;
  149.     }
  150.  
  151.     for(b_y=0; b_y<h; b_y++){
  152.         int color= 1024;
  153.         int distance= -1;
  154.         for(b_x=0; b_x<w; b_x++){
  155.             int mb_index_j= (b_x>>is_luma) + (b_y>>is_luma)*s->mb_stride;
  156.             int error_j= s->error_status_table[mb_index_j];
  157.             int intra_j = IS_INTRA(s->cur_pic.mb_type[mb_index_j]);
  158.             if(intra_j==0 || !(error_j&ER_DC_ERROR)){
  159.                 color= dc[b_x + b_y*stride];
  160.                 distance= b_x;
  161.             }
  162.             col [b_x + b_y*stride][1]= color;
  163.             dist[b_x + b_y*stride][1]= distance >= 0 ? b_x-distance : 9999;
  164.         }
  165.         color= 1024;
  166.         distance= -1;
  167.         for(b_x=w-1; b_x>=0; b_x--){
  168.             int mb_index_j= (b_x>>is_luma) + (b_y>>is_luma)*s->mb_stride;
  169.             int error_j= s->error_status_table[mb_index_j];
  170.             int intra_j = IS_INTRA(s->cur_pic.mb_type[mb_index_j]);
  171.             if(intra_j==0 || !(error_j&ER_DC_ERROR)){
  172.                 color= dc[b_x + b_y*stride];
  173.                 distance= b_x;
  174.             }
  175.             col [b_x + b_y*stride][0]= color;
  176.             dist[b_x + b_y*stride][0]= distance >= 0 ? distance-b_x : 9999;
  177.         }
  178.     }
  179.     for(b_x=0; b_x<w; b_x++){
  180.         int color= 1024;
  181.         int distance= -1;
  182.         for(b_y=0; b_y<h; b_y++){
  183.             int mb_index_j= (b_x>>is_luma) + (b_y>>is_luma)*s->mb_stride;
  184.             int error_j= s->error_status_table[mb_index_j];
  185.             int intra_j = IS_INTRA(s->cur_pic.mb_type[mb_index_j]);
  186.             if(intra_j==0 || !(error_j&ER_DC_ERROR)){
  187.                 color= dc[b_x + b_y*stride];
  188.                 distance= b_y;
  189.             }
  190.             col [b_x + b_y*stride][3]= color;
  191.             dist[b_x + b_y*stride][3]= distance >= 0 ? b_y-distance : 9999;
  192.         }
  193.         color= 1024;
  194.         distance= -1;
  195.         for(b_y=h-1; b_y>=0; b_y--){
  196.             int mb_index_j= (b_x>>is_luma) + (b_y>>is_luma)*s->mb_stride;
  197.             int error_j= s->error_status_table[mb_index_j];
  198.             int intra_j = IS_INTRA(s->cur_pic.mb_type[mb_index_j]);
  199.             if(intra_j==0 || !(error_j&ER_DC_ERROR)){
  200.                 color= dc[b_x + b_y*stride];
  201.                 distance= b_y;
  202.             }
  203.             col [b_x + b_y*stride][2]= color;
  204.             dist[b_x + b_y*stride][2]= distance >= 0 ? distance-b_y : 9999;
  205.         }
  206.     }
  207.  
  208.     for (b_y = 0; b_y < h; b_y++) {
  209.         for (b_x = 0; b_x < w; b_x++) {
  210.             int mb_index, error, j;
  211.             int64_t guess, weight_sum;
  212.             mb_index = (b_x >> is_luma) + (b_y >> is_luma) * s->mb_stride;
  213.             error    = s->error_status_table[mb_index];
  214.  
  215.             if (IS_INTER(s->cur_pic.mb_type[mb_index]))
  216.                 continue; // inter
  217.             if (!(error & ER_DC_ERROR))
  218.                 continue; // dc-ok
  219.  
  220.             weight_sum = 0;
  221.             guess      = 0;
  222.             for (j = 0; j < 4; j++) {
  223.                 int64_t weight  = 256 * 256 * 256 * 16 / FFMAX(dist[b_x + b_y*stride][j], 1);
  224.                 guess          += weight*(int64_t)col[b_x + b_y*stride][j];
  225.                 weight_sum     += weight;
  226.             }
  227.             guess = (guess + weight_sum / 2) / weight_sum;
  228.             dc[b_x + b_y * stride] = guess;
  229.         }
  230.     }
  231.  
  232. fail:
  233.     av_freep(&col);
  234.     av_freep(&dist);
  235. }
  236.  
  237. /**
  238.  * simple horizontal deblocking filter used for error resilience
  239.  * @param w     width in 8 pixel blocks
  240.  * @param h     height in 8 pixel blocks
  241.  */
  242. static void h_block_filter(ERContext *s, uint8_t *dst, int w,
  243.                            int h, int stride, int is_luma)
  244. {
  245.     int b_x, b_y, mvx_stride, mvy_stride;
  246.     const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
  247.     set_mv_strides(s, &mvx_stride, &mvy_stride);
  248.     mvx_stride >>= is_luma;
  249.     mvy_stride *= mvx_stride;
  250.  
  251.     for (b_y = 0; b_y < h; b_y++) {
  252.         for (b_x = 0; b_x < w - 1; b_x++) {
  253.             int y;
  254.             int left_status  = s->error_status_table[( b_x      >> is_luma) + (b_y >> is_luma) * s->mb_stride];
  255.             int right_status = s->error_status_table[((b_x + 1) >> is_luma) + (b_y >> is_luma) * s->mb_stride];
  256.             int left_intra   = IS_INTRA(s->cur_pic.mb_type[( b_x      >> is_luma) + (b_y >> is_luma) * s->mb_stride]);
  257.             int right_intra  = IS_INTRA(s->cur_pic.mb_type[((b_x + 1) >> is_luma) + (b_y >> is_luma) * s->mb_stride]);
  258.             int left_damage  = left_status & ER_MB_ERROR;
  259.             int right_damage = right_status & ER_MB_ERROR;
  260.             int offset       = b_x * 8 + b_y * stride * 8;
  261.             int16_t *left_mv  = s->cur_pic.motion_val[0][mvy_stride * b_y + mvx_stride *  b_x];
  262.             int16_t *right_mv = s->cur_pic.motion_val[0][mvy_stride * b_y + mvx_stride * (b_x + 1)];
  263.             if (!(left_damage || right_damage))
  264.                 continue; // both undamaged
  265.             if ((!left_intra) && (!right_intra) &&
  266.                 FFABS(left_mv[0] - right_mv[0]) +
  267.                 FFABS(left_mv[1] + right_mv[1]) < 2)
  268.                 continue;
  269.  
  270.             for (y = 0; y < 8; y++) {
  271.                 int a, b, c, d;
  272.  
  273.                 a = dst[offset + 7 + y * stride] - dst[offset + 6 + y * stride];
  274.                 b = dst[offset + 8 + y * stride] - dst[offset + 7 + y * stride];
  275.                 c = dst[offset + 9 + y * stride] - dst[offset + 8 + y * stride];
  276.  
  277.                 d = FFABS(b) - ((FFABS(a) + FFABS(c) + 1) >> 1);
  278.                 d = FFMAX(d, 0);
  279.                 if (b < 0)
  280.                     d = -d;
  281.  
  282.                 if (d == 0)
  283.                     continue;
  284.  
  285.                 if (!(left_damage && right_damage))
  286.                     d = d * 16 / 9;
  287.  
  288.                 if (left_damage) {
  289.                     dst[offset + 7 + y * stride] = cm[dst[offset + 7 + y * stride] + ((d * 7) >> 4)];
  290.                     dst[offset + 6 + y * stride] = cm[dst[offset + 6 + y * stride] + ((d * 5) >> 4)];
  291.                     dst[offset + 5 + y * stride] = cm[dst[offset + 5 + y * stride] + ((d * 3) >> 4)];
  292.                     dst[offset + 4 + y * stride] = cm[dst[offset + 4 + y * stride] + ((d * 1) >> 4)];
  293.                 }
  294.                 if (right_damage) {
  295.                     dst[offset + 8 + y * stride] = cm[dst[offset +  8 + y * stride] - ((d * 7) >> 4)];
  296.                     dst[offset + 9 + y * stride] = cm[dst[offset +  9 + y * stride] - ((d * 5) >> 4)];
  297.                     dst[offset + 10+ y * stride] = cm[dst[offset + 10 + y * stride] - ((d * 3) >> 4)];
  298.                     dst[offset + 11+ y * stride] = cm[dst[offset + 11 + y * stride] - ((d * 1) >> 4)];
  299.                 }
  300.             }
  301.         }
  302.     }
  303. }
  304.  
  305. /**
  306.  * simple vertical deblocking filter used for error resilience
  307.  * @param w     width in 8 pixel blocks
  308.  * @param h     height in 8 pixel blocks
  309.  */
  310. static void v_block_filter(ERContext *s, uint8_t *dst, int w, int h,
  311.                            int stride, int is_luma)
  312. {
  313.     int b_x, b_y, mvx_stride, mvy_stride;
  314.     const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
  315.     set_mv_strides(s, &mvx_stride, &mvy_stride);
  316.     mvx_stride >>= is_luma;
  317.     mvy_stride *= mvx_stride;
  318.  
  319.     for (b_y = 0; b_y < h - 1; b_y++) {
  320.         for (b_x = 0; b_x < w; b_x++) {
  321.             int x;
  322.             int top_status    = s->error_status_table[(b_x >> is_luma) +  (b_y      >> is_luma) * s->mb_stride];
  323.             int bottom_status = s->error_status_table[(b_x >> is_luma) + ((b_y + 1) >> is_luma) * s->mb_stride];
  324.             int top_intra     = IS_INTRA(s->cur_pic.mb_type[(b_x >> is_luma) + ( b_y      >> is_luma) * s->mb_stride]);
  325.             int bottom_intra  = IS_INTRA(s->cur_pic.mb_type[(b_x >> is_luma) + ((b_y + 1) >> is_luma) * s->mb_stride]);
  326.             int top_damage    = top_status & ER_MB_ERROR;
  327.             int bottom_damage = bottom_status & ER_MB_ERROR;
  328.             int offset        = b_x * 8 + b_y * stride * 8;
  329.  
  330.             int16_t *top_mv    = s->cur_pic.motion_val[0][mvy_stride *  b_y      + mvx_stride * b_x];
  331.             int16_t *bottom_mv = s->cur_pic.motion_val[0][mvy_stride * (b_y + 1) + mvx_stride * b_x];
  332.  
  333.             if (!(top_damage || bottom_damage))
  334.                 continue; // both undamaged
  335.  
  336.             if ((!top_intra) && (!bottom_intra) &&
  337.                 FFABS(top_mv[0] - bottom_mv[0]) +
  338.                 FFABS(top_mv[1] + bottom_mv[1]) < 2)
  339.                 continue;
  340.  
  341.             for (x = 0; x < 8; x++) {
  342.                 int a, b, c, d;
  343.  
  344.                 a = dst[offset + x + 7 * stride] - dst[offset + x + 6 * stride];
  345.                 b = dst[offset + x + 8 * stride] - dst[offset + x + 7 * stride];
  346.                 c = dst[offset + x + 9 * stride] - dst[offset + x + 8 * stride];
  347.  
  348.                 d = FFABS(b) - ((FFABS(a) + FFABS(c) + 1) >> 1);
  349.                 d = FFMAX(d, 0);
  350.                 if (b < 0)
  351.                     d = -d;
  352.  
  353.                 if (d == 0)
  354.                     continue;
  355.  
  356.                 if (!(top_damage && bottom_damage))
  357.                     d = d * 16 / 9;
  358.  
  359.                 if (top_damage) {
  360.                     dst[offset + x +  7 * stride] = cm[dst[offset + x +  7 * stride] + ((d * 7) >> 4)];
  361.                     dst[offset + x +  6 * stride] = cm[dst[offset + x +  6 * stride] + ((d * 5) >> 4)];
  362.                     dst[offset + x +  5 * stride] = cm[dst[offset + x +  5 * stride] + ((d * 3) >> 4)];
  363.                     dst[offset + x +  4 * stride] = cm[dst[offset + x +  4 * stride] + ((d * 1) >> 4)];
  364.                 }
  365.                 if (bottom_damage) {
  366.                     dst[offset + x +  8 * stride] = cm[dst[offset + x +  8 * stride] - ((d * 7) >> 4)];
  367.                     dst[offset + x +  9 * stride] = cm[dst[offset + x +  9 * stride] - ((d * 5) >> 4)];
  368.                     dst[offset + x + 10 * stride] = cm[dst[offset + x + 10 * stride] - ((d * 3) >> 4)];
  369.                     dst[offset + x + 11 * stride] = cm[dst[offset + x + 11 * stride] - ((d * 1) >> 4)];
  370.                 }
  371.             }
  372.         }
  373.     }
  374. }
  375.  
  376. static void guess_mv(ERContext *s)
  377. {
  378.     uint8_t *fixed = s->er_temp_buffer;
  379. #define MV_FROZEN    3
  380. #define MV_CHANGED   2
  381. #define MV_UNCHANGED 1
  382.     const int mb_stride = s->mb_stride;
  383.     const int mb_width  = s->mb_width;
  384.     int mb_height = s->mb_height;
  385.     int i, depth, num_avail;
  386.     int mb_x, mb_y, mot_step, mot_stride;
  387.  
  388.     if (s->last_pic.f && s->last_pic.f->data[0])
  389.         mb_height = FFMIN(mb_height, (s->last_pic.f->height+15)>>4);
  390.     if (s->next_pic.f && s->next_pic.f->data[0])
  391.         mb_height = FFMIN(mb_height, (s->next_pic.f->height+15)>>4);
  392.  
  393.     set_mv_strides(s, &mot_step, &mot_stride);
  394.  
  395.     num_avail = 0;
  396.     for (i = 0; i < mb_width * mb_height; i++) {
  397.         const int mb_xy = s->mb_index2xy[i];
  398.         int f = 0;
  399.         int error = s->error_status_table[mb_xy];
  400.  
  401.         if (IS_INTRA(s->cur_pic.mb_type[mb_xy]))
  402.             f = MV_FROZEN; // intra // FIXME check
  403.         if (!(error & ER_MV_ERROR))
  404.             f = MV_FROZEN; // inter with undamaged MV
  405.  
  406.         fixed[mb_xy] = f;
  407.         if (f == MV_FROZEN)
  408.             num_avail++;
  409.         else if(s->last_pic.f->data[0] && s->last_pic.motion_val[0]){
  410.             const int mb_y= mb_xy / s->mb_stride;
  411.             const int mb_x= mb_xy % s->mb_stride;
  412.             const int mot_index= (mb_x + mb_y*mot_stride) * mot_step;
  413.             s->cur_pic.motion_val[0][mot_index][0]= s->last_pic.motion_val[0][mot_index][0];
  414.             s->cur_pic.motion_val[0][mot_index][1]= s->last_pic.motion_val[0][mot_index][1];
  415.             s->cur_pic.ref_index[0][4*mb_xy]      = s->last_pic.ref_index[0][4*mb_xy];
  416.         }
  417.     }
  418.  
  419.     if ((!(s->avctx->error_concealment&FF_EC_GUESS_MVS)) ||
  420.         num_avail <= mb_width / 2) {
  421.         for (mb_y = 0; mb_y < mb_height; mb_y++) {
  422.             for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  423.                 const int mb_xy = mb_x + mb_y * s->mb_stride;
  424.                 int mv_dir = (s->last_pic.f && s->last_pic.f->data[0]) ? MV_DIR_FORWARD : MV_DIR_BACKWARD;
  425.  
  426.                 if (IS_INTRA(s->cur_pic.mb_type[mb_xy]))
  427.                     continue;
  428.                 if (!(s->error_status_table[mb_xy] & ER_MV_ERROR))
  429.                     continue;
  430.  
  431.                 s->mv[0][0][0] = 0;
  432.                 s->mv[0][0][1] = 0;
  433.                 s->decode_mb(s->opaque, 0, mv_dir, MV_TYPE_16X16, &s->mv,
  434.                              mb_x, mb_y, 0, 0);
  435.             }
  436.         }
  437.         return;
  438.     }
  439.  
  440.     for (depth = 0; ; depth++) {
  441.         int changed, pass, none_left;
  442.  
  443.         none_left = 1;
  444.         changed   = 1;
  445.         for (pass = 0; (changed || pass < 2) && pass < 10; pass++) {
  446.             int mb_x, mb_y;
  447.             int score_sum = 0;
  448.  
  449.             changed = 0;
  450.             for (mb_y = 0; mb_y < mb_height; mb_y++) {
  451.                 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  452.                     const int mb_xy        = mb_x + mb_y * s->mb_stride;
  453.                     int mv_predictor[8][2] = { { 0 } };
  454.                     int ref[8]             = { 0 };
  455.                     int pred_count         = 0;
  456.                     int j;
  457.                     int best_score         = 256 * 256 * 256 * 64;
  458.                     int best_pred          = 0;
  459.                     const int mot_index    = (mb_x + mb_y * mot_stride) * mot_step;
  460.                     int prev_x = 0, prev_y = 0, prev_ref = 0;
  461.  
  462.                     if ((mb_x ^ mb_y ^ pass) & 1)
  463.                         continue;
  464.  
  465.                     if (fixed[mb_xy] == MV_FROZEN)
  466.                         continue;
  467.                     av_assert1(!IS_INTRA(s->cur_pic.mb_type[mb_xy]));
  468.                     av_assert1(s->last_pic.f && s->last_pic.f->data[0]);
  469.  
  470.                     j = 0;
  471.                     if (mb_x > 0             && fixed[mb_xy - 1]         == MV_FROZEN)
  472.                         j = 1;
  473.                     if (mb_x + 1 < mb_width  && fixed[mb_xy + 1]         == MV_FROZEN)
  474.                         j = 1;
  475.                     if (mb_y > 0             && fixed[mb_xy - mb_stride] == MV_FROZEN)
  476.                         j = 1;
  477.                     if (mb_y + 1 < mb_height && fixed[mb_xy + mb_stride] == MV_FROZEN)
  478.                         j = 1;
  479.                     if (j == 0)
  480.                         continue;
  481.  
  482.                     j = 0;
  483.                     if (mb_x > 0             && fixed[mb_xy - 1        ] == MV_CHANGED)
  484.                         j = 1;
  485.                     if (mb_x + 1 < mb_width  && fixed[mb_xy + 1        ] == MV_CHANGED)
  486.                         j = 1;
  487.                     if (mb_y > 0             && fixed[mb_xy - mb_stride] == MV_CHANGED)
  488.                         j = 1;
  489.                     if (mb_y + 1 < mb_height && fixed[mb_xy + mb_stride] == MV_CHANGED)
  490.                         j = 1;
  491.                     if (j == 0 && pass > 1)
  492.                         continue;
  493.  
  494.                     none_left = 0;
  495.  
  496.                     if (mb_x > 0 && fixed[mb_xy - 1]) {
  497.                         mv_predictor[pred_count][0] =
  498.                             s->cur_pic.motion_val[0][mot_index - mot_step][0];
  499.                         mv_predictor[pred_count][1] =
  500.                             s->cur_pic.motion_val[0][mot_index - mot_step][1];
  501.                         ref[pred_count] =
  502.                             s->cur_pic.ref_index[0][4 * (mb_xy - 1)];
  503.                         pred_count++;
  504.                     }
  505.                     if (mb_x + 1 < mb_width && fixed[mb_xy + 1]) {
  506.                         mv_predictor[pred_count][0] =
  507.                             s->cur_pic.motion_val[0][mot_index + mot_step][0];
  508.                         mv_predictor[pred_count][1] =
  509.                             s->cur_pic.motion_val[0][mot_index + mot_step][1];
  510.                         ref[pred_count] =
  511.                             s->cur_pic.ref_index[0][4 * (mb_xy + 1)];
  512.                         pred_count++;
  513.                     }
  514.                     if (mb_y > 0 && fixed[mb_xy - mb_stride]) {
  515.                         mv_predictor[pred_count][0] =
  516.                             s->cur_pic.motion_val[0][mot_index - mot_stride * mot_step][0];
  517.                         mv_predictor[pred_count][1] =
  518.                             s->cur_pic.motion_val[0][mot_index - mot_stride * mot_step][1];
  519.                         ref[pred_count] =
  520.                             s->cur_pic.ref_index[0][4 * (mb_xy - s->mb_stride)];
  521.                         pred_count++;
  522.                     }
  523.                     if (mb_y + 1<mb_height && fixed[mb_xy + mb_stride]) {
  524.                         mv_predictor[pred_count][0] =
  525.                             s->cur_pic.motion_val[0][mot_index + mot_stride * mot_step][0];
  526.                         mv_predictor[pred_count][1] =
  527.                             s->cur_pic.motion_val[0][mot_index + mot_stride * mot_step][1];
  528.                         ref[pred_count] =
  529.                             s->cur_pic.ref_index[0][4 * (mb_xy + s->mb_stride)];
  530.                         pred_count++;
  531.                     }
  532.                     if (pred_count == 0)
  533.                         continue;
  534.  
  535.                     if (pred_count > 1) {
  536.                         int sum_x = 0, sum_y = 0, sum_r = 0;
  537.                         int max_x, max_y, min_x, min_y, max_r, min_r;
  538.  
  539.                         for (j = 0; j < pred_count; j++) {
  540.                             sum_x += mv_predictor[j][0];
  541.                             sum_y += mv_predictor[j][1];
  542.                             sum_r += ref[j];
  543.                             if (j && ref[j] != ref[j - 1])
  544.                                 goto skip_mean_and_median;
  545.                         }
  546.  
  547.                         /* mean */
  548.                         mv_predictor[pred_count][0] = sum_x / j;
  549.                         mv_predictor[pred_count][1] = sum_y / j;
  550.                                  ref[pred_count]    = sum_r / j;
  551.  
  552.                         /* median */
  553.                         if (pred_count >= 3) {
  554.                             min_y = min_x = min_r =  99999;
  555.                             max_y = max_x = max_r = -99999;
  556.                         } else {
  557.                             min_x = min_y = max_x = max_y = min_r = max_r = 0;
  558.                         }
  559.                         for (j = 0; j < pred_count; j++) {
  560.                             max_x = FFMAX(max_x, mv_predictor[j][0]);
  561.                             max_y = FFMAX(max_y, mv_predictor[j][1]);
  562.                             max_r = FFMAX(max_r, ref[j]);
  563.                             min_x = FFMIN(min_x, mv_predictor[j][0]);
  564.                             min_y = FFMIN(min_y, mv_predictor[j][1]);
  565.                             min_r = FFMIN(min_r, ref[j]);
  566.                         }
  567.                         mv_predictor[pred_count + 1][0] = sum_x - max_x - min_x;
  568.                         mv_predictor[pred_count + 1][1] = sum_y - max_y - min_y;
  569.                                  ref[pred_count + 1]    = sum_r - max_r - min_r;
  570.  
  571.                         if (pred_count == 4) {
  572.                             mv_predictor[pred_count + 1][0] /= 2;
  573.                             mv_predictor[pred_count + 1][1] /= 2;
  574.                                      ref[pred_count + 1]    /= 2;
  575.                         }
  576.                         pred_count += 2;
  577.                     }
  578.  
  579. skip_mean_and_median:
  580.                     /* zero MV */
  581.                     pred_count++;
  582.  
  583.                     if (!fixed[mb_xy] && 0) {
  584.                         if (s->avctx->codec_id == AV_CODEC_ID_H264) {
  585.                             // FIXME
  586.                         } else {
  587.                             ff_thread_await_progress(s->last_pic.tf,
  588.                                                      mb_y, 0);
  589.                         }
  590.                         if (!s->last_pic.motion_val[0] ||
  591.                             !s->last_pic.ref_index[0])
  592.                             goto skip_last_mv;
  593.                         prev_x   = s->last_pic.motion_val[0][mot_index][0];
  594.                         prev_y   = s->last_pic.motion_val[0][mot_index][1];
  595.                         prev_ref = s->last_pic.ref_index[0][4 * mb_xy];
  596.                     } else {
  597.                         prev_x   = s->cur_pic.motion_val[0][mot_index][0];
  598.                         prev_y   = s->cur_pic.motion_val[0][mot_index][1];
  599.                         prev_ref = s->cur_pic.ref_index[0][4 * mb_xy];
  600.                     }
  601.  
  602.                     /* last MV */
  603.                     mv_predictor[pred_count][0] = prev_x;
  604.                     mv_predictor[pred_count][1] = prev_y;
  605.                              ref[pred_count]    = prev_ref;
  606.                     pred_count++;
  607.  
  608. skip_last_mv:
  609.  
  610.                     for (j = 0; j < pred_count; j++) {
  611.                         int *linesize = s->cur_pic.f->linesize;
  612.                         int score = 0;
  613.                         uint8_t *src = s->cur_pic.f->data[0] +
  614.                                        mb_x * 16 + mb_y * 16 * linesize[0];
  615.  
  616.                         s->cur_pic.motion_val[0][mot_index][0] =
  617.                             s->mv[0][0][0] = mv_predictor[j][0];
  618.                         s->cur_pic.motion_val[0][mot_index][1] =
  619.                             s->mv[0][0][1] = mv_predictor[j][1];
  620.  
  621.                         // predictor intra or otherwise not available
  622.                         if (ref[j] < 0)
  623.                             continue;
  624.  
  625.                         s->decode_mb(s->opaque, ref[j], MV_DIR_FORWARD,
  626.                                      MV_TYPE_16X16, &s->mv, mb_x, mb_y, 0, 0);
  627.  
  628.                         if (mb_x > 0 && fixed[mb_xy - 1]) {
  629.                             int k;
  630.                             for (k = 0; k < 16; k++)
  631.                                 score += FFABS(src[k * linesize[0] - 1] -
  632.                                                src[k * linesize[0]]);
  633.                         }
  634.                         if (mb_x + 1 < mb_width && fixed[mb_xy + 1]) {
  635.                             int k;
  636.                             for (k = 0; k < 16; k++)
  637.                                 score += FFABS(src[k * linesize[0] + 15] -
  638.                                                src[k * linesize[0] + 16]);
  639.                         }
  640.                         if (mb_y > 0 && fixed[mb_xy - mb_stride]) {
  641.                             int k;
  642.                             for (k = 0; k < 16; k++)
  643.                                 score += FFABS(src[k - linesize[0]] - src[k]);
  644.                         }
  645.                         if (mb_y + 1 < mb_height && fixed[mb_xy + mb_stride]) {
  646.                             int k;
  647.                             for (k = 0; k < 16; k++)
  648.                                 score += FFABS(src[k + linesize[0] * 15] -
  649.                                                src[k + linesize[0] * 16]);
  650.                         }
  651.  
  652.                         if (score <= best_score) { // <= will favor the last MV
  653.                             best_score = score;
  654.                             best_pred  = j;
  655.                         }
  656.                     }
  657.                     score_sum += best_score;
  658.                     s->mv[0][0][0] = mv_predictor[best_pred][0];
  659.                     s->mv[0][0][1] = mv_predictor[best_pred][1];
  660.  
  661.                     for (i = 0; i < mot_step; i++)
  662.                         for (j = 0; j < mot_step; j++) {
  663.                             s->cur_pic.motion_val[0][mot_index + i + j * mot_stride][0] = s->mv[0][0][0];
  664.                             s->cur_pic.motion_val[0][mot_index + i + j * mot_stride][1] = s->mv[0][0][1];
  665.                         }
  666.  
  667.                     s->decode_mb(s->opaque, ref[best_pred], MV_DIR_FORWARD,
  668.                                  MV_TYPE_16X16, &s->mv, mb_x, mb_y, 0, 0);
  669.  
  670.  
  671.                     if (s->mv[0][0][0] != prev_x || s->mv[0][0][1] != prev_y) {
  672.                         fixed[mb_xy] = MV_CHANGED;
  673.                         changed++;
  674.                     } else
  675.                         fixed[mb_xy] = MV_UNCHANGED;
  676.                 }
  677.             }
  678.         }
  679.  
  680.         if (none_left)
  681.             return;
  682.  
  683.         for (i = 0; i < mb_width * mb_height; i++) {
  684.             int mb_xy = s->mb_index2xy[i];
  685.             if (fixed[mb_xy])
  686.                 fixed[mb_xy] = MV_FROZEN;
  687.         }
  688.     }
  689. }
  690.  
  691. static int is_intra_more_likely(ERContext *s)
  692. {
  693.     int is_intra_likely, i, j, undamaged_count, skip_amount, mb_x, mb_y;
  694.  
  695.     if (!s->last_pic.f || !s->last_pic.f->data[0])
  696.         return 1; // no previous frame available -> use spatial prediction
  697.  
  698.     if (s->avctx->error_concealment & FF_EC_FAVOR_INTER)
  699.         return 0;
  700.  
  701.     undamaged_count = 0;
  702.     for (i = 0; i < s->mb_num; i++) {
  703.         const int mb_xy = s->mb_index2xy[i];
  704.         const int error = s->error_status_table[mb_xy];
  705.         if (!((error & ER_DC_ERROR) && (error & ER_MV_ERROR)))
  706.             undamaged_count++;
  707.     }
  708.  
  709.     if (undamaged_count < 5)
  710.         return 0; // almost all MBs damaged -> use temporal prediction
  711.  
  712.     // prevent dsp.sad() check, that requires access to the image
  713.     if (CONFIG_XVMC    &&
  714.         s->avctx->hwaccel && s->avctx->hwaccel->decode_mb &&
  715.         s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I)
  716.         return 1;
  717.  
  718.     skip_amount     = FFMAX(undamaged_count / 50, 1); // check only up to 50 MBs
  719.     is_intra_likely = 0;
  720.  
  721.     j = 0;
  722.     for (mb_y = 0; mb_y < s->mb_height - 1; mb_y++) {
  723.         for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  724.             int error;
  725.             const int mb_xy = mb_x + mb_y * s->mb_stride;
  726.  
  727.             error = s->error_status_table[mb_xy];
  728.             if ((error & ER_DC_ERROR) && (error & ER_MV_ERROR))
  729.                 continue; // skip damaged
  730.  
  731.             j++;
  732.             // skip a few to speed things up
  733.             if ((j % skip_amount) != 0)
  734.                 continue;
  735.  
  736.             if (s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I) {
  737.                 int *linesize = s->cur_pic.f->linesize;
  738.                 uint8_t *mb_ptr      = s->cur_pic.f->data[0] +
  739.                                        mb_x * 16 + mb_y * 16 * linesize[0];
  740.                 uint8_t *last_mb_ptr = s->last_pic.f->data[0] +
  741.                                        mb_x * 16 + mb_y * 16 * linesize[0];
  742.  
  743.                 if (s->avctx->codec_id == AV_CODEC_ID_H264) {
  744.                     // FIXME
  745.                 } else {
  746.                     ff_thread_await_progress(s->last_pic.tf, mb_y, 0);
  747.                 }
  748.                 is_intra_likely += s->mecc.sad[0](NULL, last_mb_ptr, mb_ptr,
  749.                                                   linesize[0], 16);
  750.                 // FIXME need await_progress() here
  751.                 is_intra_likely -= s->mecc.sad[0](NULL, last_mb_ptr,
  752.                                                   last_mb_ptr + linesize[0] * 16,
  753.                                                   linesize[0], 16);
  754.             } else {
  755.                 if (IS_INTRA(s->cur_pic.mb_type[mb_xy]))
  756.                    is_intra_likely++;
  757.                 else
  758.                    is_intra_likely--;
  759.             }
  760.         }
  761.     }
  762. //      av_log(NULL, AV_LOG_ERROR, "is_intra_likely: %d type:%d\n", is_intra_likely, s->pict_type);
  763.     return is_intra_likely > 0;
  764. }
  765.  
  766. void ff_er_frame_start(ERContext *s)
  767. {
  768.     if (!s->avctx->error_concealment)
  769.         return;
  770.  
  771.     if (!s->mecc_inited) {
  772.         ff_me_cmp_init(&s->mecc, s->avctx);
  773.         s->mecc_inited = 1;
  774.     }
  775.  
  776.     memset(s->error_status_table, ER_MB_ERROR | VP_START | ER_MB_END,
  777.            s->mb_stride * s->mb_height * sizeof(uint8_t));
  778.     s->error_count    = 3 * s->mb_num;
  779.     s->error_occurred = 0;
  780. }
  781.  
  782. static int er_supported(ERContext *s)
  783. {
  784.     if(s->avctx->hwaccel && s->avctx->hwaccel->decode_slice           ||
  785. #if FF_API_CAP_VDPAU
  786.        s->avctx->codec->capabilities&AV_CODEC_CAP_HWACCEL_VDPAU          ||
  787. #endif
  788.        !s->cur_pic.f                                                  ||
  789.        s->cur_pic.field_picture
  790.     )
  791.         return 0;
  792.     return 1;
  793. }
  794.  
  795. /**
  796.  * Add a slice.
  797.  * @param endx   x component of the last macroblock, can be -1
  798.  *               for the last of the previous line
  799.  * @param status the status at the end (ER_MV_END, ER_AC_ERROR, ...), it is
  800.  *               assumed that no earlier end or error of the same type occurred
  801.  */
  802. void ff_er_add_slice(ERContext *s, int startx, int starty,
  803.                      int endx, int endy, int status)
  804. {
  805.     const int start_i  = av_clip(startx + starty * s->mb_width, 0, s->mb_num - 1);
  806.     const int end_i    = av_clip(endx   + endy   * s->mb_width, 0, s->mb_num);
  807.     const int start_xy = s->mb_index2xy[start_i];
  808.     const int end_xy   = s->mb_index2xy[end_i];
  809.     int mask           = -1;
  810.  
  811.     if (s->avctx->hwaccel && s->avctx->hwaccel->decode_slice)
  812.         return;
  813.  
  814.     if (start_i > end_i || start_xy > end_xy) {
  815.         av_log(s->avctx, AV_LOG_ERROR,
  816.                "internal error, slice end before start\n");
  817.         return;
  818.     }
  819.  
  820.     if (!s->avctx->error_concealment)
  821.         return;
  822.  
  823.     mask &= ~VP_START;
  824.     if (status & (ER_AC_ERROR | ER_AC_END)) {
  825.         mask           &= ~(ER_AC_ERROR | ER_AC_END);
  826.         avpriv_atomic_int_add_and_fetch(&s->error_count, start_i - end_i - 1);
  827.     }
  828.     if (status & (ER_DC_ERROR | ER_DC_END)) {
  829.         mask           &= ~(ER_DC_ERROR | ER_DC_END);
  830.         avpriv_atomic_int_add_and_fetch(&s->error_count, start_i - end_i - 1);
  831.     }
  832.     if (status & (ER_MV_ERROR | ER_MV_END)) {
  833.         mask           &= ~(ER_MV_ERROR | ER_MV_END);
  834.         avpriv_atomic_int_add_and_fetch(&s->error_count, start_i - end_i - 1);
  835.     }
  836.  
  837.     if (status & ER_MB_ERROR) {
  838.         s->error_occurred = 1;
  839.         avpriv_atomic_int_set(&s->error_count, INT_MAX);
  840.     }
  841.  
  842.     if (mask == ~0x7F) {
  843.         memset(&s->error_status_table[start_xy], 0,
  844.                (end_xy - start_xy) * sizeof(uint8_t));
  845.     } else {
  846.         int i;
  847.         for (i = start_xy; i < end_xy; i++)
  848.             s->error_status_table[i] &= mask;
  849.     }
  850.  
  851.     if (end_i == s->mb_num)
  852.         avpriv_atomic_int_set(&s->error_count, INT_MAX);
  853.     else {
  854.         s->error_status_table[end_xy] &= mask;
  855.         s->error_status_table[end_xy] |= status;
  856.     }
  857.  
  858.     s->error_status_table[start_xy] |= VP_START;
  859.  
  860.     if (start_xy > 0 && !(s->avctx->active_thread_type & FF_THREAD_SLICE) &&
  861.         er_supported(s) && s->avctx->skip_top * s->mb_width < start_i) {
  862.         int prev_status = s->error_status_table[s->mb_index2xy[start_i - 1]];
  863.  
  864.         prev_status &= ~ VP_START;
  865.         if (prev_status != (ER_MV_END | ER_DC_END | ER_AC_END)) {
  866.             s->error_occurred = 1;
  867.             avpriv_atomic_int_set(&s->error_count, INT_MAX);
  868.         }
  869.     }
  870. }
  871.  
  872. void ff_er_frame_end(ERContext *s)
  873. {
  874.     int *linesize = NULL;
  875.     int i, mb_x, mb_y, error, error_type, dc_error, mv_error, ac_error;
  876.     int distance;
  877.     int threshold_part[4] = { 100, 100, 100 };
  878.     int threshold = 50;
  879.     int is_intra_likely;
  880.     int size = s->b8_stride * 2 * s->mb_height;
  881.  
  882.     /* We do not support ER of field pictures yet,
  883.      * though it should not crash if enabled. */
  884.     if (!s->avctx->error_concealment || s->error_count == 0            ||
  885.         s->avctx->lowres                                               ||
  886.         !er_supported(s)                                               ||
  887.         s->error_count == 3 * s->mb_width *
  888.                           (s->avctx->skip_top + s->avctx->skip_bottom)) {
  889.         return;
  890.     }
  891.     linesize = s->cur_pic.f->linesize;
  892.     for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  893.         int status = s->error_status_table[mb_x + (s->mb_height - 1) * s->mb_stride];
  894.         if (status != 0x7F)
  895.             break;
  896.     }
  897.  
  898.     if (   mb_x == s->mb_width
  899.         && s->avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO
  900.         && (s->avctx->height&16)
  901.         && s->error_count == 3 * s->mb_width * (s->avctx->skip_top + s->avctx->skip_bottom + 1)
  902.     ) {
  903.         av_log(s->avctx, AV_LOG_DEBUG, "ignoring last missing slice\n");
  904.         return;
  905.     }
  906.  
  907.     if (s->last_pic.f) {
  908.         if (s->last_pic.f->width  != s->cur_pic.f->width  ||
  909.             s->last_pic.f->height != s->cur_pic.f->height ||
  910.             s->last_pic.f->format != s->cur_pic.f->format) {
  911.             av_log(s->avctx, AV_LOG_WARNING, "Cannot use previous picture in error concealment\n");
  912.             memset(&s->last_pic, 0, sizeof(s->last_pic));
  913.         }
  914.     }
  915.     if (s->next_pic.f) {
  916.         if (s->next_pic.f->width  != s->cur_pic.f->width  ||
  917.             s->next_pic.f->height != s->cur_pic.f->height ||
  918.             s->next_pic.f->format != s->cur_pic.f->format) {
  919.             av_log(s->avctx, AV_LOG_WARNING, "Cannot use next picture in error concealment\n");
  920.             memset(&s->next_pic, 0, sizeof(s->next_pic));
  921.         }
  922.     }
  923.  
  924.     if (!s->cur_pic.motion_val[0] || !s->cur_pic.ref_index[0]) {
  925.         av_log(s->avctx, AV_LOG_ERROR, "Warning MVs not available\n");
  926.  
  927.         for (i = 0; i < 2; i++) {
  928.             s->ref_index_buf[i]  = av_buffer_allocz(s->mb_stride * s->mb_height * 4 * sizeof(uint8_t));
  929.             s->motion_val_buf[i] = av_buffer_allocz((size + 4) * 2 * sizeof(uint16_t));
  930.             if (!s->ref_index_buf[i] || !s->motion_val_buf[i])
  931.                 break;
  932.             s->cur_pic.ref_index[i]  = s->ref_index_buf[i]->data;
  933.             s->cur_pic.motion_val[i] = (int16_t (*)[2])s->motion_val_buf[i]->data + 4;
  934.         }
  935.         if (i < 2) {
  936.             for (i = 0; i < 2; i++) {
  937.                 av_buffer_unref(&s->ref_index_buf[i]);
  938.                 av_buffer_unref(&s->motion_val_buf[i]);
  939.                 s->cur_pic.ref_index[i]  = NULL;
  940.                 s->cur_pic.motion_val[i] = NULL;
  941.             }
  942.             return;
  943.         }
  944.     }
  945.  
  946.     if (s->avctx->debug & FF_DEBUG_ER) {
  947.         for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
  948.             for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  949.                 int status = s->error_status_table[mb_x + mb_y * s->mb_stride];
  950.  
  951.                 av_log(s->avctx, AV_LOG_DEBUG, "%2X ", status);
  952.             }
  953.             av_log(s->avctx, AV_LOG_DEBUG, "\n");
  954.         }
  955.     }
  956.  
  957. #if 1
  958.     /* handle overlapping slices */
  959.     for (error_type = 1; error_type <= 3; error_type++) {
  960.         int end_ok = 0;
  961.  
  962.         for (i = s->mb_num - 1; i >= 0; i--) {
  963.             const int mb_xy = s->mb_index2xy[i];
  964.             int error       = s->error_status_table[mb_xy];
  965.  
  966.             if (error & (1 << error_type))
  967.                 end_ok = 1;
  968.             if (error & (8 << error_type))
  969.                 end_ok = 1;
  970.  
  971.             if (!end_ok)
  972.                 s->error_status_table[mb_xy] |= 1 << error_type;
  973.  
  974.             if (error & VP_START)
  975.                 end_ok = 0;
  976.         }
  977.     }
  978. #endif
  979. #if 1
  980.     /* handle slices with partitions of different length */
  981.     if (s->partitioned_frame) {
  982.         int end_ok = 0;
  983.  
  984.         for (i = s->mb_num - 1; i >= 0; i--) {
  985.             const int mb_xy = s->mb_index2xy[i];
  986.             int error       = s->error_status_table[mb_xy];
  987.  
  988.             if (error & ER_AC_END)
  989.                 end_ok = 0;
  990.             if ((error & ER_MV_END) ||
  991.                 (error & ER_DC_END) ||
  992.                 (error & ER_AC_ERROR))
  993.                 end_ok = 1;
  994.  
  995.             if (!end_ok)
  996.                 s->error_status_table[mb_xy]|= ER_AC_ERROR;
  997.  
  998.             if (error & VP_START)
  999.                 end_ok = 0;
  1000.         }
  1001.     }
  1002. #endif
  1003.     /* handle missing slices */
  1004.     if (s->avctx->err_recognition & AV_EF_EXPLODE) {
  1005.         int end_ok = 1;
  1006.  
  1007.         // FIXME + 100 hack
  1008.         for (i = s->mb_num - 2; i >= s->mb_width + 100; i--) {
  1009.             const int mb_xy = s->mb_index2xy[i];
  1010.             int error1 = s->error_status_table[mb_xy];
  1011.             int error2 = s->error_status_table[s->mb_index2xy[i + 1]];
  1012.  
  1013.             if (error1 & VP_START)
  1014.                 end_ok = 1;
  1015.  
  1016.             if (error2 == (VP_START | ER_MB_ERROR | ER_MB_END) &&
  1017.                 error1 != (VP_START | ER_MB_ERROR | ER_MB_END) &&
  1018.                 ((error1 & ER_AC_END) || (error1 & ER_DC_END) ||
  1019.                 (error1 & ER_MV_END))) {
  1020.                 // end & uninit
  1021.                 end_ok = 0;
  1022.             }
  1023.  
  1024.             if (!end_ok)
  1025.                 s->error_status_table[mb_xy] |= ER_MB_ERROR;
  1026.         }
  1027.     }
  1028.  
  1029. #if 1
  1030.     /* backward mark errors */
  1031.     distance = 9999999;
  1032.     for (error_type = 1; error_type <= 3; error_type++) {
  1033.         for (i = s->mb_num - 1; i >= 0; i--) {
  1034.             const int mb_xy = s->mb_index2xy[i];
  1035.             int       error = s->error_status_table[mb_xy];
  1036.  
  1037.             if (!s->mbskip_table || !s->mbskip_table[mb_xy]) // FIXME partition specific
  1038.                 distance++;
  1039.             if (error & (1 << error_type))
  1040.                 distance = 0;
  1041.  
  1042.             if (s->partitioned_frame) {
  1043.                 if (distance < threshold_part[error_type - 1])
  1044.                     s->error_status_table[mb_xy] |= 1 << error_type;
  1045.             } else {
  1046.                 if (distance < threshold)
  1047.                     s->error_status_table[mb_xy] |= 1 << error_type;
  1048.             }
  1049.  
  1050.             if (error & VP_START)
  1051.                 distance = 9999999;
  1052.         }
  1053.     }
  1054. #endif
  1055.  
  1056.     /* forward mark errors */
  1057.     error = 0;
  1058.     for (i = 0; i < s->mb_num; i++) {
  1059.         const int mb_xy = s->mb_index2xy[i];
  1060.         int old_error   = s->error_status_table[mb_xy];
  1061.  
  1062.         if (old_error & VP_START) {
  1063.             error = old_error & ER_MB_ERROR;
  1064.         } else {
  1065.             error |= old_error & ER_MB_ERROR;
  1066.             s->error_status_table[mb_xy] |= error;
  1067.         }
  1068.     }
  1069. #if 1
  1070.     /* handle not partitioned case */
  1071.     if (!s->partitioned_frame) {
  1072.         for (i = 0; i < s->mb_num; i++) {
  1073.             const int mb_xy = s->mb_index2xy[i];
  1074.             int error = s->error_status_table[mb_xy];
  1075.             if (error & ER_MB_ERROR)
  1076.                 error |= ER_MB_ERROR;
  1077.             s->error_status_table[mb_xy] = error;
  1078.         }
  1079.     }
  1080. #endif
  1081.  
  1082.     dc_error = ac_error = mv_error = 0;
  1083.     for (i = 0; i < s->mb_num; i++) {
  1084.         const int mb_xy = s->mb_index2xy[i];
  1085.         int error = s->error_status_table[mb_xy];
  1086.         if (error & ER_DC_ERROR)
  1087.             dc_error++;
  1088.         if (error & ER_AC_ERROR)
  1089.             ac_error++;
  1090.         if (error & ER_MV_ERROR)
  1091.             mv_error++;
  1092.     }
  1093.     av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
  1094.            dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
  1095.  
  1096.     is_intra_likely = is_intra_more_likely(s);
  1097.  
  1098.     /* set unknown mb-type to most likely */
  1099.     for (i = 0; i < s->mb_num; i++) {
  1100.         const int mb_xy = s->mb_index2xy[i];
  1101.         int error = s->error_status_table[mb_xy];
  1102.         if (!((error & ER_DC_ERROR) && (error & ER_MV_ERROR)))
  1103.             continue;
  1104.  
  1105.         if (is_intra_likely)
  1106.             s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA4x4;
  1107.         else
  1108.             s->cur_pic.mb_type[mb_xy] = MB_TYPE_16x16 | MB_TYPE_L0;
  1109.     }
  1110.  
  1111.     // change inter to intra blocks if no reference frames are available
  1112.     if (!(s->last_pic.f && s->last_pic.f->data[0]) &&
  1113.         !(s->next_pic.f && s->next_pic.f->data[0]))
  1114.         for (i = 0; i < s->mb_num; i++) {
  1115.             const int mb_xy = s->mb_index2xy[i];
  1116.             if (!IS_INTRA(s->cur_pic.mb_type[mb_xy]))
  1117.                 s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA4x4;
  1118.         }
  1119.  
  1120.     /* handle inter blocks with damaged AC */
  1121.     for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
  1122.         for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  1123.             const int mb_xy   = mb_x + mb_y * s->mb_stride;
  1124.             const int mb_type = s->cur_pic.mb_type[mb_xy];
  1125.             const int dir     = !(s->last_pic.f && s->last_pic.f->data[0]);
  1126.             const int mv_dir  = dir ? MV_DIR_BACKWARD : MV_DIR_FORWARD;
  1127.             int mv_type;
  1128.  
  1129.             int error = s->error_status_table[mb_xy];
  1130.  
  1131.             if (IS_INTRA(mb_type))
  1132.                 continue; // intra
  1133.             if (error & ER_MV_ERROR)
  1134.                 continue; // inter with damaged MV
  1135.             if (!(error & ER_AC_ERROR))
  1136.                 continue; // undamaged inter
  1137.  
  1138.             if (IS_8X8(mb_type)) {
  1139.                 int mb_index = mb_x * 2 + mb_y * 2 * s->b8_stride;
  1140.                 int j;
  1141.                 mv_type = MV_TYPE_8X8;
  1142.                 for (j = 0; j < 4; j++) {
  1143.                     s->mv[0][j][0] = s->cur_pic.motion_val[dir][mb_index + (j & 1) + (j >> 1) * s->b8_stride][0];
  1144.                     s->mv[0][j][1] = s->cur_pic.motion_val[dir][mb_index + (j & 1) + (j >> 1) * s->b8_stride][1];
  1145.                 }
  1146.             } else {
  1147.                 mv_type     = MV_TYPE_16X16;
  1148.                 s->mv[0][0][0] = s->cur_pic.motion_val[dir][mb_x * 2 + mb_y * 2 * s->b8_stride][0];
  1149.                 s->mv[0][0][1] = s->cur_pic.motion_val[dir][mb_x * 2 + mb_y * 2 * s->b8_stride][1];
  1150.             }
  1151.  
  1152.             s->decode_mb(s->opaque, 0 /* FIXME h264 partitioned slices need this set */,
  1153.                          mv_dir, mv_type, &s->mv, mb_x, mb_y, 0, 0);
  1154.         }
  1155.     }
  1156.  
  1157.     /* guess MVs */
  1158.     if (s->cur_pic.f->pict_type == AV_PICTURE_TYPE_B) {
  1159.         for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
  1160.             for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  1161.                 int       xy      = mb_x * 2 + mb_y * 2 * s->b8_stride;
  1162.                 const int mb_xy   = mb_x + mb_y * s->mb_stride;
  1163.                 const int mb_type = s->cur_pic.mb_type[mb_xy];
  1164.                 int mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
  1165.  
  1166.                 int error = s->error_status_table[mb_xy];
  1167.  
  1168.                 if (IS_INTRA(mb_type))
  1169.                     continue;
  1170.                 if (!(error & ER_MV_ERROR))
  1171.                     continue; // inter with undamaged MV
  1172.                 if (!(error & ER_AC_ERROR))
  1173.                     continue; // undamaged inter
  1174.  
  1175.                 if (!(s->last_pic.f && s->last_pic.f->data[0]))
  1176.                     mv_dir &= ~MV_DIR_FORWARD;
  1177.                 if (!(s->next_pic.f && s->next_pic.f->data[0]))
  1178.                     mv_dir &= ~MV_DIR_BACKWARD;
  1179.  
  1180.                 if (s->pp_time) {
  1181.                     int time_pp = s->pp_time;
  1182.                     int time_pb = s->pb_time;
  1183.  
  1184.                     av_assert0(s->avctx->codec_id != AV_CODEC_ID_H264);
  1185.                     ff_thread_await_progress(s->next_pic.tf, mb_y, 0);
  1186.  
  1187.                     s->mv[0][0][0] = s->next_pic.motion_val[0][xy][0] *  time_pb            / time_pp;
  1188.                     s->mv[0][0][1] = s->next_pic.motion_val[0][xy][1] *  time_pb            / time_pp;
  1189.                     s->mv[1][0][0] = s->next_pic.motion_val[0][xy][0] * (time_pb - time_pp) / time_pp;
  1190.                     s->mv[1][0][1] = s->next_pic.motion_val[0][xy][1] * (time_pb - time_pp) / time_pp;
  1191.                 } else {
  1192.                     s->mv[0][0][0] = 0;
  1193.                     s->mv[0][0][1] = 0;
  1194.                     s->mv[1][0][0] = 0;
  1195.                     s->mv[1][0][1] = 0;
  1196.                 }
  1197.  
  1198.                 s->decode_mb(s->opaque, 0, mv_dir, MV_TYPE_16X16, &s->mv,
  1199.                              mb_x, mb_y, 0, 0);
  1200.             }
  1201.         }
  1202.     } else
  1203.         guess_mv(s);
  1204.  
  1205.     /* the filters below manipulate raw image, skip them */
  1206.     if (CONFIG_XVMC && s->avctx->hwaccel && s->avctx->hwaccel->decode_mb)
  1207.         goto ec_clean;
  1208.     /* fill DC for inter blocks */
  1209.     for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
  1210.         for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  1211.             int dc, dcu, dcv, y, n;
  1212.             int16_t *dc_ptr;
  1213.             uint8_t *dest_y, *dest_cb, *dest_cr;
  1214.             const int mb_xy   = mb_x + mb_y * s->mb_stride;
  1215.             const int mb_type = s->cur_pic.mb_type[mb_xy];
  1216.  
  1217.             // error = s->error_status_table[mb_xy];
  1218.  
  1219.             if (IS_INTRA(mb_type) && s->partitioned_frame)
  1220.                 continue;
  1221.             // if (error & ER_MV_ERROR)
  1222.             //     continue; // inter data damaged FIXME is this good?
  1223.  
  1224.             dest_y  = s->cur_pic.f->data[0] + mb_x * 16 + mb_y * 16 * linesize[0];
  1225.             dest_cb = s->cur_pic.f->data[1] + mb_x *  8 + mb_y *  8 * linesize[1];
  1226.             dest_cr = s->cur_pic.f->data[2] + mb_x *  8 + mb_y *  8 * linesize[2];
  1227.  
  1228.             dc_ptr = &s->dc_val[0][mb_x * 2 + mb_y * 2 * s->b8_stride];
  1229.             for (n = 0; n < 4; n++) {
  1230.                 dc = 0;
  1231.                 for (y = 0; y < 8; y++) {
  1232.                     int x;
  1233.                     for (x = 0; x < 8; x++)
  1234.                        dc += dest_y[x + (n & 1) * 8 +
  1235.                              (y + (n >> 1) * 8) * linesize[0]];
  1236.                 }
  1237.                 dc_ptr[(n & 1) + (n >> 1) * s->b8_stride] = (dc + 4) >> 3;
  1238.             }
  1239.  
  1240.             if (!s->cur_pic.f->data[2])
  1241.                 continue;
  1242.  
  1243.             dcu = dcv = 0;
  1244.             for (y = 0; y < 8; y++) {
  1245.                 int x;
  1246.                 for (x = 0; x < 8; x++) {
  1247.                     dcu += dest_cb[x + y * linesize[1]];
  1248.                     dcv += dest_cr[x + y * linesize[2]];
  1249.                 }
  1250.             }
  1251.             s->dc_val[1][mb_x + mb_y * s->mb_stride] = (dcu + 4) >> 3;
  1252.             s->dc_val[2][mb_x + mb_y * s->mb_stride] = (dcv + 4) >> 3;
  1253.         }
  1254.     }
  1255. #if 1
  1256.     /* guess DC for damaged blocks */
  1257.     guess_dc(s, s->dc_val[0], s->mb_width*2, s->mb_height*2, s->b8_stride, 1);
  1258.     guess_dc(s, s->dc_val[1], s->mb_width  , s->mb_height  , s->mb_stride, 0);
  1259.     guess_dc(s, s->dc_val[2], s->mb_width  , s->mb_height  , s->mb_stride, 0);
  1260. #endif
  1261.  
  1262.     /* filter luma DC */
  1263.     filter181(s->dc_val[0], s->mb_width * 2, s->mb_height * 2, s->b8_stride);
  1264.  
  1265. #if 1
  1266.     /* render DC only intra */
  1267.     for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
  1268.         for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
  1269.             uint8_t *dest_y, *dest_cb, *dest_cr;
  1270.             const int mb_xy   = mb_x + mb_y * s->mb_stride;
  1271.             const int mb_type = s->cur_pic.mb_type[mb_xy];
  1272.  
  1273.             int error = s->error_status_table[mb_xy];
  1274.  
  1275.             if (IS_INTER(mb_type))
  1276.                 continue;
  1277.             if (!(error & ER_AC_ERROR))
  1278.                 continue; // undamaged
  1279.  
  1280.             dest_y  = s->cur_pic.f->data[0] + mb_x * 16 + mb_y * 16 * linesize[0];
  1281.             dest_cb = s->cur_pic.f->data[1] + mb_x *  8 + mb_y *  8 * linesize[1];
  1282.             dest_cr = s->cur_pic.f->data[2] + mb_x *  8 + mb_y *  8 * linesize[2];
  1283.             if (!s->cur_pic.f->data[2])
  1284.                 dest_cb = dest_cr = NULL;
  1285.  
  1286.             put_dc(s, dest_y, dest_cb, dest_cr, mb_x, mb_y);
  1287.         }
  1288.     }
  1289. #endif
  1290.  
  1291.     if (s->avctx->error_concealment & FF_EC_DEBLOCK) {
  1292.         /* filter horizontal block boundaries */
  1293.         h_block_filter(s, s->cur_pic.f->data[0], s->mb_width * 2,
  1294.                        s->mb_height * 2, linesize[0], 1);
  1295.  
  1296.         /* filter vertical block boundaries */
  1297.         v_block_filter(s, s->cur_pic.f->data[0], s->mb_width * 2,
  1298.                        s->mb_height * 2, linesize[0], 1);
  1299.  
  1300.         if (s->cur_pic.f->data[2]) {
  1301.             h_block_filter(s, s->cur_pic.f->data[1], s->mb_width,
  1302.                         s->mb_height, linesize[1], 0);
  1303.             h_block_filter(s, s->cur_pic.f->data[2], s->mb_width,
  1304.                         s->mb_height, linesize[2], 0);
  1305.             v_block_filter(s, s->cur_pic.f->data[1], s->mb_width,
  1306.                         s->mb_height, linesize[1], 0);
  1307.             v_block_filter(s, s->cur_pic.f->data[2], s->mb_width,
  1308.                         s->mb_height, linesize[2], 0);
  1309.         }
  1310.     }
  1311.  
  1312. ec_clean:
  1313.     /* clean a few tables */
  1314.     for (i = 0; i < s->mb_num; i++) {
  1315.         const int mb_xy = s->mb_index2xy[i];
  1316.         int       error = s->error_status_table[mb_xy];
  1317.  
  1318.         if (s->mbskip_table && s->cur_pic.f->pict_type != AV_PICTURE_TYPE_B &&
  1319.             (error & (ER_DC_ERROR | ER_MV_ERROR | ER_AC_ERROR))) {
  1320.             s->mbskip_table[mb_xy] = 0;
  1321.         }
  1322.         if (s->mbintra_table)
  1323.             s->mbintra_table[mb_xy] = 1;
  1324.     }
  1325.  
  1326.     for (i = 0; i < 2; i++) {
  1327.         av_buffer_unref(&s->ref_index_buf[i]);
  1328.         av_buffer_unref(&s->motion_val_buf[i]);
  1329.         s->cur_pic.ref_index[i]  = NULL;
  1330.         s->cur_pic.motion_val[i] = NULL;
  1331.     }
  1332.  
  1333.     memset(&s->cur_pic, 0, sizeof(ERPicture));
  1334.     memset(&s->last_pic, 0, sizeof(ERPicture));
  1335.     memset(&s->next_pic, 0, sizeof(ERPicture));
  1336. }
  1337.