Browse Source

h264: move dist_scale_factor[_field] into the per-slice context

tags/n2.7
Anton Khirnov 11 years ago
parent
commit
ee0d774dfa
3 changed files with 11 additions and 9 deletions
  1. +4
    -3
      libavcodec/h264.h
  2. +6
    -5
      libavcodec/h264_direct.c
  3. +1
    -1
      libavcodec/h264_slice.c

+ 4
- 3
libavcodec/h264.h View File

@@ -359,6 +359,9 @@ typedef struct H264SliceContext {
int col_parity;
int col_fieldoff;

int dist_scale_factor[32];
int dist_scale_factor_field[2][32];

/**
* non zero coeff count cache.
* is 64 if not available.
@@ -444,8 +447,6 @@ typedef struct H264Context {
int picture_structure;
int first_field;

int dist_scale_factor[32];
int dist_scale_factor_field[2][32];
int map_col_to_list0[2][16 + 32];
int map_col_to_list0_field[2][2][16 + 32];

@@ -821,7 +822,7 @@ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl);

void h264_init_dequant_tables(H264Context *h);

void ff_h264_direct_dist_scale_factor(H264Context *const h);
void ff_h264_direct_dist_scale_factor(H264Context *const h, H264SliceContext *sl);
void ff_h264_direct_ref_list_init(H264Context *const h, H264SliceContext *sl);
void ff_h264_pred_direct_motion(H264Context *const h, H264SliceContext *sl,
int *mb_type);


+ 6
- 5
libavcodec/h264_direct.c View File

@@ -47,7 +47,8 @@ static int get_scale_factor(H264Context *const h, int poc, int poc1, int i)
}
}

void ff_h264_direct_dist_scale_factor(H264Context *const h)
void ff_h264_direct_dist_scale_factor(H264Context *const h,
H264SliceContext *sl)
{
const int poc = FIELD_PICTURE(h) ? h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD]
: h->cur_pic_ptr->poc;
@@ -59,12 +60,12 @@ void ff_h264_direct_dist_scale_factor(H264Context *const h)
const int poc = h->cur_pic_ptr->field_poc[field];
const int poc1 = h->ref_list[1][0].field_poc[field];
for (i = 0; i < 2 * h->ref_count[0]; i++)
h->dist_scale_factor_field[field][i ^ field] =
sl->dist_scale_factor_field[field][i ^ field] =
get_scale_factor(h, poc, poc1, i + 16);
}

for (i = 0; i < h->ref_count[0]; i++)
h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i);
sl->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i);
}

static void fill_colmap(H264Context *h, int map[2][16 + 32], int list,
@@ -555,13 +556,13 @@ single_col:
{
const int *map_col_to_list0[2] = { h->map_col_to_list0[0],
h->map_col_to_list0[1] };
const int *dist_scale_factor = h->dist_scale_factor;
const int *dist_scale_factor = sl->dist_scale_factor;
int ref_offset;

if (FRAME_MBAFF(h) && IS_INTERLACED(*mb_type)) {
map_col_to_list0[0] = h->map_col_to_list0_field[h->mb_y & 1][0];
map_col_to_list0[1] = h->map_col_to_list0_field[h->mb_y & 1][1];
dist_scale_factor = h->dist_scale_factor_field[h->mb_y & 1];
dist_scale_factor = sl->dist_scale_factor_field[h->mb_y & 1];
}
ref_offset = (h->ref_list[1][0].mbaff << 4) & (mb_type_col[0] >> 3);



+ 1
- 1
libavcodec/h264_slice.c View File

@@ -1647,7 +1647,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, H264Contex
}

if (sl->slice_type_nos == AV_PICTURE_TYPE_B && !sl->direct_spatial_mv_pred)
ff_h264_direct_dist_scale_factor(h);
ff_h264_direct_dist_scale_factor(h, sl);
ff_h264_direct_ref_list_init(h, sl);

if (sl->slice_type_nos != AV_PICTURE_TYPE_I && h->pps.cabac) {


Loading…
Cancel
Save