|
|
|
@ -1270,6 +1270,7 @@ static int context_init(H264Context *h) |
|
|
|
|
h->ref_cache[1][scan8[7] + 1] = |
|
|
|
|
h->ref_cache[1][scan8[13] + 1] = PART_NOT_AVAILABLE; |
|
|
|
|
|
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
/* init ER */ |
|
|
|
|
er->avctx = h->avctx; |
|
|
|
|
er->dsp = &h->dsp; |
|
|
|
@ -1309,6 +1310,7 @@ static int context_init(H264Context *h) |
|
|
|
|
er->dc_val[2] = er->dc_val[1] + c_size; |
|
|
|
|
for (i = 0; i < yc_size; i++) |
|
|
|
|
h->dc_val_base[i] = 1024; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
@ -1339,9 +1341,11 @@ static av_cold void common_init(H264Context *h) |
|
|
|
|
|
|
|
|
|
h->dequant_coeff_pps = -1; |
|
|
|
|
|
|
|
|
|
h->dsp.dct_bits = 16; |
|
|
|
|
/* needed so that IDCT permutation is known early */ |
|
|
|
|
ff_dsputil_init(&h->dsp, h->avctx); |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
h->dsp.dct_bits = 16; |
|
|
|
|
/* needed so that IDCT permutation is known early */ |
|
|
|
|
ff_dsputil_init(&h->dsp, h->avctx); |
|
|
|
|
} |
|
|
|
|
ff_videodsp_init(&h->vdsp, 8); |
|
|
|
|
|
|
|
|
|
memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t)); |
|
|
|
@ -1765,9 +1769,11 @@ int ff_h264_frame_start(H264Context *h) |
|
|
|
|
h->cur_pic = *h->cur_pic_ptr; |
|
|
|
|
h->cur_pic.f.extended_data = h->cur_pic.f.data; |
|
|
|
|
|
|
|
|
|
ff_er_frame_start(&h->er); |
|
|
|
|
h->er.last_pic = |
|
|
|
|
h->er.next_pic = NULL; |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
ff_er_frame_start(&h->er); |
|
|
|
|
h->er.last_pic = |
|
|
|
|
h->er.next_pic = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assert(h->linesize && h->uvlinesize); |
|
|
|
|
|
|
|
|
@ -2777,7 +2783,8 @@ static int field_end(H264Context *h, int in_setup) |
|
|
|
|
* past end by one (callers fault) and resync_mb_y != 0 |
|
|
|
|
* causes problems for the first MB line, too. |
|
|
|
|
*/ |
|
|
|
|
if (!FIELD_PICTURE && h->current_slice && !h->sps.new) { |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE && |
|
|
|
|
!FIELD_PICTURE && h->current_slice && !h->sps.new) { |
|
|
|
|
h->er.cur_pic = h->cur_pic_ptr; |
|
|
|
|
ff_er_frame_end(&h->er); |
|
|
|
|
} |
|
|
|
@ -2880,8 +2887,10 @@ static int h264_set_parameter_from_sps(H264Context *h) |
|
|
|
|
ff_h264qpel_init(&h->h264qpel, h->sps.bit_depth_luma); |
|
|
|
|
ff_h264_pred_init(&h->hpc, h->avctx->codec_id, h->sps.bit_depth_luma, |
|
|
|
|
h->sps.chroma_format_idc); |
|
|
|
|
h->dsp.dct_bits = h->sps.bit_depth_luma > 8 ? 32 : 16; |
|
|
|
|
ff_dsputil_init(&h->dsp, h->avctx); |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
h->dsp.dct_bits = h->sps.bit_depth_luma > 8 ? 32 : 16; |
|
|
|
|
ff_dsputil_init(&h->dsp, h->avctx); |
|
|
|
|
} |
|
|
|
|
ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma); |
|
|
|
|
} else { |
|
|
|
|
av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n", |
|
|
|
@ -3043,7 +3052,9 @@ static int h264_slice_header_init(H264Context *h, int reinit) |
|
|
|
|
H264Context *c; |
|
|
|
|
c = h->thread_context[i] = av_mallocz(sizeof(H264Context)); |
|
|
|
|
c->avctx = h->avctx; |
|
|
|
|
c->dsp = h->dsp; |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
c->dsp = h->dsp; |
|
|
|
|
} |
|
|
|
|
c->vdsp = h->vdsp; |
|
|
|
|
c->h264dsp = h->h264dsp; |
|
|
|
|
c->h264qpel = h->h264qpel; |
|
|
|
@ -4152,10 +4163,12 @@ static void decode_finish_row(H264Context *h) |
|
|
|
|
static void er_add_slice(H264Context *h, int startx, int starty, |
|
|
|
|
int endx, int endy, int status) |
|
|
|
|
{ |
|
|
|
|
ERContext *er = &h->er; |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
ERContext *er = &h->er; |
|
|
|
|
|
|
|
|
|
er->ref_count = h->ref_count[0]; |
|
|
|
|
ff_er_add_slice(er, startx, starty, endx, endy, status); |
|
|
|
|
er->ref_count = h->ref_count[0]; |
|
|
|
|
ff_er_add_slice(er, startx, starty, endx, endy, status); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int decode_slice(struct AVCodecContext *avctx, void *arg) |
|
|
|
@ -4344,7 +4357,9 @@ static int execute_decode_slices(H264Context *h, int context_count) |
|
|
|
|
av_assert0(context_count > 0); |
|
|
|
|
for (i = 1; i < context_count; i++) { |
|
|
|
|
hx = h->thread_context[i]; |
|
|
|
|
hx->er.error_count = 0; |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
hx->er.error_count = 0; |
|
|
|
|
} |
|
|
|
|
hx->x264_build = h->x264_build; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -4357,8 +4372,10 @@ static int execute_decode_slices(H264Context *h, int context_count) |
|
|
|
|
h->mb_y = hx->mb_y; |
|
|
|
|
h->droppable = hx->droppable; |
|
|
|
|
h->picture_structure = hx->picture_structure; |
|
|
|
|
for (i = 1; i < context_count; i++) |
|
|
|
|
h->er.error_count += h->thread_context[i]->er.error_count; |
|
|
|
|
if (CONFIG_ERROR_RESILIENCE) { |
|
|
|
|
for (i = 1; i < context_count; i++) |
|
|
|
|
h->er.error_count += h->thread_context[i]->er.error_count; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|