Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-04-29 14:01:15 +0300
committerMichael Niedermayer <michaelni@gmx.at>2015-04-29 14:23:45 +0300
commitab7ad5e6a1b8359b169e7bcbe96ce7162d0c0002 (patch)
tree884b721a07e241495ab86a2317d929a8b71dbee8 /libavcodec/h264_slice.c
parent580c86925ddf8c85d2e6f57ed55dd75853748b29 (diff)
parentee62b364be0c30cba83b5ff10a3ca8c3e866ade6 (diff)
Merge commit 'ee62b364be0c30cba83b5ff10a3ca8c3e866ade6'
* commit 'ee62b364be0c30cba83b5ff10a3ca8c3e866ade6': h264: eliminate ff_h264_set_parameter_from_sps() Conflicts: libavcodec/h264.c libavcodec/h264.h libavcodec/h264_slice.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264_slice.c')
-rw-r--r--libavcodec/h264_slice.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 9624c36d73..7551df7da5 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -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);