|
|
|
@ -611,8 +611,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, |
|
|
|
|
|
|
|
|
|
/* copy block_offset since frame_start may not be called */ |
|
|
|
|
memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset)); |
|
|
|
|
|
|
|
|
|
ff_h264_set_parameter_from_sps(h); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!h->cur_pic_ptr) |
|
|
|
@ -1103,6 +1101,37 @@ static int h264_slice_header_init(H264Context *h, int reinit) |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (h->avctx->codec && |
|
|
|
|
h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU && |
|
|
|
|
(h->sps.bit_depth_luma != 8 || h->sps.chroma_format_idc > 1)) { |
|
|
|
|
av_log(h->avctx, AV_LOG_ERROR, |
|
|
|
|
"VDPAU decoding does not support video colorspace.\n"); |
|
|
|
|
ret = AVERROR_INVALIDDATA; |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (h->sps.bit_depth_luma < 8 || h->sps.bit_depth_luma > 14 || |
|
|
|
|
h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13 |
|
|
|
|
) { |
|
|
|
|
av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth %d\n", |
|
|
|
|
h->sps.bit_depth_luma); |
|
|
|
|
ret = AVERROR_INVALIDDATA; |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h->cur_bit_depth_luma = |
|
|
|
|
h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma; |
|
|
|
|
h->cur_chroma_format_idc = h->sps.chroma_format_idc; |
|
|
|
|
h->pixel_shift = h->sps.bit_depth_luma > 8; |
|
|
|
|
|
|
|
|
|
ff_h264dsp_init(&h->h264dsp, h->sps.bit_depth_luma, |
|
|
|
|
h->sps.chroma_format_idc); |
|
|
|
|
ff_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma); |
|
|
|
|
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); |
|
|
|
|
ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma); |
|
|
|
|
|
|
|
|
|
if (nb_slices > H264_MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) { |
|
|
|
|
int max_slices; |
|
|
|
|
if (h->mb_height) |
|
|
|
@ -1300,8 +1329,20 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl) |
|
|
|
|
h->chroma_format_idc = h->sps.chroma_format_idc; |
|
|
|
|
needs_reinit = 1; |
|
|
|
|
} |
|
|
|
|
if ((ret = ff_h264_set_parameter_from_sps(h)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if (h->flags & CODEC_FLAG_LOW_DELAY || |
|
|
|
|
(h->sps.bitstream_restriction_flag && |
|
|
|
|
!h->sps.num_reorder_frames)) { |
|
|
|
|
if (h->avctx->has_b_frames > 1 || h->delayed_pic[0]) |
|
|
|
|
av_log(h->avctx, AV_LOG_WARNING, "Delayed frames seen. " |
|
|
|
|
"Reenabling low delay requires a codec flush.\n"); |
|
|
|
|
else |
|
|
|
|
h->low_delay = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (h->avctx->has_b_frames < 2) |
|
|
|
|
h->avctx->has_b_frames = !h->low_delay; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h->avctx->profile = ff_h264_get_profile(&h->sps); |
|
|
|
|