38                             int poc, 
int poc1, 
int i)
 
   41     int td = av_clip_int8(poc1 - poc0);
 
   45         int tb = av_clip_int8(poc - poc0);
 
   46         int tx = (16384 + (
FFABS(td) >> 1)) / 
td;
 
   47         return av_clip_intp2((tb * tx + 32) >> 6, 10);
 
   60         for (field = 0; field < 2; field++) {
 
   63             for (i = 0; i < 2 * sl->
ref_count[0]; i++)
 
   73                         int map[2][16 + 32], 
int list,
 
   74                         int field, 
int colfield, 
int mbafi)
 
   77     int j, old_ref, rfield;
 
   78     int start  = mbafi ? 16                       : 0;
 
   83     memset(
map[list], 0, 
sizeof(
map[list]));
 
   85     for (rfield = 0; rfield < 2; rfield++) {
 
   86         for (old_ref = 0; old_ref < ref1->
ref_count[colfield][list]; old_ref++) {
 
   87             int poc = ref1->
ref_poc[colfield][list][old_ref];
 
   92             else if (interl && (poc & 3) == 3)
 
   93                 poc = (poc & ~3) + rfield + 1;
 
   95             for (j = start; j < 
end; j++) {
 
   98                     int cur_ref = mbafi ? (j - 16) ^ field : j;
 
  100                         map[list][2 * old_ref + (rfield ^ field) + 16] = cur_ref;
 
  101                     if (rfield == field || !interl)
 
  102                         map[list][old_ref] = cur_ref;
 
  116     int ref1sidx = (ref1->
reference      & 1) ^ 1;
 
  118     for (list = 0; list < sl->
list_count; list++) {
 
  120         for (j = 0; j < sl->
ref_count[list]; j++)
 
  140         if (col_poc[0] == INT_MAX && col_poc[1] == INT_MAX) {
 
  145                           FFABS(col_poc[1] - cur_poc));
 
  157     for (list = 0; list < 2; list++) {
 
  160             for (field = 0; field < 2; field++)
 
  171     int ref_height        = 16 * h->
mb_height >> ref_field_picture;
 
  180                              FFMIN(16 * mb_y >> ref_field_picture,
 
  182                              ref_field_picture && ref_field);
 
  192     const int16_t (*l1mv0)[2], (*l1mv1)[2];
 
  193     const int8_t *l1ref0, *l1ref1;
 
  194     const int is_b8x8 = 
IS_8X8(*mb_type);
 
  206 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16 | MB_TYPE_INTRA4x4 | \ 
  207                                 MB_TYPE_INTRA16x16 | MB_TYPE_INTRA_PCM) 
  210     for (list = 0; list < 2; list++) {
 
  219         ref[list] = 
FFMIN3((
unsigned)left_ref,
 
  222         if (ref[list] >= 0) {
 
  228             int match_count = (left_ref == ref[list]) +
 
  229                               (top_ref  == ref[list]) +
 
  232             if (match_count > 1) { 
 
  236                 assert(match_count == 1);
 
  237                 if (left_ref == ref[list])
 
  239                 else if (top_ref == ref[list])
 
  254     if (ref[0] < 0 && ref[1] < 0) {
 
  261     if (!(is_b8x8 | mv[0] | mv[1])) {
 
  285             mb_y           =  sl->
mb_y & ~1;
 
  313             } 
else if (!is_b8x8 &&
 
  338             l1mv0  += 2 * b4_stride;
 
  339             l1mv1  += 2 * b4_stride;
 
  345         for (i8 = 0; i8 < 4; i8++) {
 
  348             int xy8 = x8     + y8 * b8_stride;
 
  349             int xy4 = x8 * 3 + y8 * b4_stride;
 
  361                 ((l1ref0[xy8] == 0 &&
 
  362                   FFABS(l1mv0[xy4][0]) <= 1 &&
 
  363                   FFABS(l1mv0[xy4][1]) <= 1) ||
 
  366                   FFABS(l1mv1[xy4][0]) <= 1 &&
 
  367                   FFABS(l1mv1[xy4][1]) <= 1))) {
 
  382         if (!is_b8x8 && !(n & 3))
 
  393               FFABS(l1mv0[0][0]) <= 1 &&
 
  394               FFABS(l1mv0[0][1]) <= 1) ||
 
  395              (l1ref0[0] < 0 && !l1ref1[0] &&
 
  396               FFABS(l1mv1[0][0]) <= 1 &&
 
  397               FFABS(l1mv1[0][1]) <= 1 &&
 
  412         for (i8 = 0; i8 < 4; i8++) {
 
  413             const int x8 = i8 & 1;
 
  414             const int y8 = i8 >> 1;
 
  427             assert(b8_stride == 2);
 
  434                 const int16_t (*l1mv)[2] = l1ref0[i8] == 0 ? l1mv0 : l1mv1;
 
  436                     const int16_t *mv_col = l1mv[x8 * 3 + y8 * 3 * b4_stride];
 
  437                     if (
FFABS(mv_col[0]) <= 1 && 
FFABS(mv_col[1]) <= 1) {
 
  448                     for (i4 = 0; i4 < 4; i4++) {
 
  449                         const int16_t *mv_col = l1mv[x8 * 2 + (i4 & 1) +
 
  450                                                      (y8 * 2 + (i4 >> 1)) * b4_stride];
 
  451                         if (
FFABS(mv_col[0]) <= 1 && 
FFABS(mv_col[1]) <= 1) {
 
  465         if (!is_b8x8 && !(n & 15))
 
  479     const int16_t (*l1mv0)[2], (*l1mv1)[2];
 
  480     const int8_t *l1ref0, *l1ref1;
 
  481     const int is_b8x8 = 
IS_8X8(*mb_type);
 
  482     unsigned int sub_mb_type;
 
  503             mb_y           = sl->
mb_y & ~1;
 
  536             } 
else if (!is_b8x8 &&
 
  562             l1mv0  += 2 * b4_stride;
 
  563             l1mv1  += 2 * b4_stride;
 
  584             for (i8 = 0; i8 < 4; i8++) {
 
  585                 const int x8 = i8 & 1;
 
  586                 const int y8 = i8 >> 1;
 
  588                 const int16_t (*l1mv)[2] = l1mv0;
 
  602                 ref0 = l1ref0[x8 + y8 * b8_stride];
 
  604                     ref0 = map_col_to_list0[0][ref0 + ref_offset];
 
  606                     ref0 = map_col_to_list0[1][l1ref1[x8 + y8 * b8_stride] +
 
  610                 scale = dist_scale_factor[ref0];
 
  615                     const int16_t *mv_col = l1mv[x8 * 3 + y8 * b4_stride];
 
  616                     int my_col            = (mv_col[1] << y_shift) / 2;
 
  617                     int mx                = (scale * mv_col[0] + 128) >> 8;
 
  618                     int my                = (scale * my_col    + 128) >> 8;
 
  637                 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset]
 
  638                                                 : map_col_to_list0[1][l1ref1[0] + ref_offset];
 
  639                 const int scale = dist_scale_factor[ref0];
 
  640                 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0];
 
  642                 mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
 
  643                 mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
 
  646                 mv1      = 
pack16to32(mv_l0[0] - mv_col[0], mv_l0[1] - mv_col[1]);
 
  652             for (i8 = 0; i8 < 4; i8++) {
 
  653                 const int x8 = i8 & 1;
 
  654                 const int y8 = i8 >> 1;
 
  656                 const int16_t (*l1mv)[2] = l1mv0;
 
  669                 assert(b8_stride == 2);
 
  672                     ref0 = map_col_to_list0[0][ref0 + ref_offset];
 
  674                     ref0 = map_col_to_list0[1][l1ref1[i8] + ref_offset];
 
  677                 scale = dist_scale_factor[ref0];
 
  682                     const int16_t *mv_col = l1mv[x8 * 3 + y8 * 3 * b4_stride];
 
  683                     int mx                = (scale * mv_col[0] + 128) >> 8;
 
  684                     int my                = (scale * mv_col[1] + 128) >> 8;
 
  688                                    pack16to32(mx - mv_col[0], my - mv_col[1]), 4);
 
  690                     for (i4 = 0; i4 < 4; i4++) {
 
  691                         const int16_t *mv_col = l1mv[x8 * 2 + (i4 & 1) +
 
  692                                                      (y8 * 2 + (i4 >> 1)) * b4_stride];
 
  694                         mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
 
  695                         mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
 
  698                                             mv_l0[1] - mv_col[1]));
 
static void pred_spatial_direct_motion(const H264Context *const h, H264SliceContext *sl, int *mb_type)
int long_ref
1->long term reference 0->short term reference 
int16_t mv_cache[2][5 *8][2]
Motion vector cache. 
int dist_scale_factor[32]
int16_t(*[2] motion_val)[2]
void ff_h264_pred_direct_motion(const H264Context *const h, H264SliceContext *sl, int *mb_type)
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures. 
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1 
uint16_t sub_mb_type[4]
as a DCT coefficient is int32_t in high depth, we need to reserve twice the space. 
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code. 
int field_picture
whether or not picture was encoded in separate fields 
static av_cold int end(AVCodecContext *avctx)
Multithreading support functions. 
int map_col_to_list0_field[2][2][16+32]
#define PICT_BOTTOM_FIELD
static void fill_rectangle(SDL_Surface *screen, int x, int y, int w, int h, int color, int update)
void ff_h264_direct_ref_list_init(const H264Context *const h, H264SliceContext *sl)
H.264 / AVC / MPEG-4 part10 codec. 
static void await_reference_mb_row(const H264Context *const h, H264Ref *ref, int mb_y)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
static const uint16_t mask[17]
int map_col_to_list0[2][16+32]
int active_thread_type
Which multithreading methods are in use by the codec. 
int ref_poc[2][2][32]
POCs of the frames/fields used as reference (FIXME need per slice) 
int direct_spatial_mv_pred
H264SEIUnregistered unregistered
int frame_num
frame_num (raw frame_num from slice header) 
static av_always_inline uint32_t pack16to32(unsigned a, unsigned b)
#define MB_TYPE_16x16_OR_INTRA
int slice_type_nos
S free slice type (SI/SP are remapped to I/P) 
static const uint8_t scan8[16 *3+3]
useful rectangle filling function 
#define FF_THREAD_FRAME
Decode more than one frame at once. 
static void pred_temp_direct_motion(const H264Context *const h, H264SliceContext *sl, int *mb_type)
#define MB_TYPE_INTERLACED
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int direct_8x8_inference_flag
#define PART_NOT_AVAILABLE
static int get_scale_factor(H264SliceContext *sl, int poc, int poc1, int i)
static const int8_t mv[256][2]
Libavcodec external API header. 
int field_poc[2]
top/bottom POC 
H264Picture * cur_pic_ptr
const VDPAUPixFmtMap * map
static void fill_colmap(const H264Context *h, H264SliceContext *sl, int map[2][16+32], int list, int field, int colfield, int mbafi)
int mbaff
1 -> MBAFF frame 0-> not MBAFF 
common internal api header. 
static int ref[MAX_W *MAX_W]
int8_t ref_cache[2][5 *8]
H264Ref ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs. 
int ref_count[2][2]
number of entries in ref_poc (FIXME need per slice) 
int dist_scale_factor_field[2][32]
void ff_h264_direct_dist_scale_factor(const H264Context *const h, H264SliceContext *sl)