|
|
|
@@ -106,9 +106,9 @@ static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, |
|
|
|
|
|
|
|
void ff_h264_draw_horiz_band(H264Context *h, int y, int height) |
|
|
|
{ |
|
|
|
ff_draw_horiz_band(h->avctx, &h->dsp, &h->cur_pic, |
|
|
|
ff_draw_horiz_band(h->avctx, NULL, &h->cur_pic, |
|
|
|
h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL, |
|
|
|
y, height, h->picture_structure, h->first_field, 1, |
|
|
|
y, height, h->picture_structure, h->first_field, 0, |
|
|
|
h->low_delay, h->mb_height * 16, h->mb_width * 16); |
|
|
|
} |
|
|
|
|
|
|
|
@@ -659,8 +659,8 @@ static av_always_inline void mc_dir_part(H264Context *h, Picture *pic, |
|
|
|
int offset = ((mx >> 2) << pixel_shift) + (my >> 2) * h->mb_linesize; |
|
|
|
uint8_t *src_y = pic->f.data[0] + offset; |
|
|
|
uint8_t *src_cb, *src_cr; |
|
|
|
int extra_width = h->emu_edge_width; |
|
|
|
int extra_height = h->emu_edge_height; |
|
|
|
int extra_width = 0; |
|
|
|
int extra_height = 0; |
|
|
|
int emu = 0; |
|
|
|
const int full_mx = mx >> 2; |
|
|
|
const int full_my = my >> 2; |
|
|
|
@@ -2670,29 +2670,6 @@ static int field_end(H264Context *h, int in_setup) |
|
|
|
h->er.next_pic = h->ref_count[1] ? &h->ref_list[1][0] : NULL; |
|
|
|
ff_er_frame_end(&h->er); |
|
|
|
} |
|
|
|
|
|
|
|
/* redraw edges for the frame if decoding didn't complete */ |
|
|
|
if (h->er.error_count && |
|
|
|
!h->avctx->hwaccel && |
|
|
|
!(h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) && |
|
|
|
h->cur_pic_ptr->f.reference && |
|
|
|
!(h->flags & CODEC_FLAG_EMU_EDGE)) { |
|
|
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(h->avctx->pix_fmt); |
|
|
|
int hshift = desc->log2_chroma_w; |
|
|
|
int vshift = desc->log2_chroma_h; |
|
|
|
h->dsp.draw_edges(h->cur_pic.f.data[0], h->linesize, |
|
|
|
h->mb_width * 16, h->mb_height * 16, |
|
|
|
EDGE_WIDTH, EDGE_WIDTH, |
|
|
|
EDGE_TOP | EDGE_BOTTOM); |
|
|
|
h->dsp.draw_edges(h->cur_pic.f.data[1], h->uvlinesize, |
|
|
|
(h->mb_width * 16) >> hshift, (h->mb_height * 16) >> vshift, |
|
|
|
EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift, |
|
|
|
EDGE_TOP | EDGE_BOTTOM); |
|
|
|
h->dsp.draw_edges(h->cur_pic.f.data[2], h->uvlinesize, |
|
|
|
(h->mb_width * 16) >> hshift, (h->mb_height * 16) >> vshift, |
|
|
|
EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift, |
|
|
|
EDGE_TOP | EDGE_BOTTOM); |
|
|
|
} |
|
|
|
emms_c(); |
|
|
|
|
|
|
|
h->current_slice = 0; |
|
|
|
@@ -3596,13 +3573,6 @@ static int decode_slice_header(H264Context *h, H264Context *h0) |
|
|
|
(h->ref_list[j][i].f.reference & 3); |
|
|
|
} |
|
|
|
|
|
|
|
// FIXME: fix draw_edges + PAFF + frame threads |
|
|
|
h->emu_edge_width = (h->flags & CODEC_FLAG_EMU_EDGE || |
|
|
|
(!h->sps.frame_mbs_only_flag && |
|
|
|
h->avctx->active_thread_type)) |
|
|
|
? 0 : 16; |
|
|
|
h->emu_edge_height = (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; |
|
|
|
|
|
|
|
if (h->avctx->debug & FF_DEBUG_PICT_INFO) { |
|
|
|
av_log(h->avctx, AV_LOG_DEBUG, |
|
|
|
"slice:%d %s mb:%d %c%s%s pps:%u frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s %s\n", |
|
|
|
@@ -3969,11 +3939,11 @@ static void decode_finish_row(H264Context *h) |
|
|
|
top -= deblock_border; |
|
|
|
} |
|
|
|
|
|
|
|
if (top >= pic_height || (top + height) < h->emu_edge_height) |
|
|
|
if (top >= pic_height || (top + height) < 0) |
|
|
|
return; |
|
|
|
|
|
|
|
height = FFMIN(height, pic_height - top); |
|
|
|
if (top < h->emu_edge_height) { |
|
|
|
if (top < 0) { |
|
|
|
height = top + height; |
|
|
|
top = 0; |
|
|
|
} |
|
|
|
|