summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorJoakim Plate <elupus@ecce.se>2011-11-06 00:59:37 +0100
committerMichael Niedermayer <michaelni@gmx.at>2011-11-06 01:46:14 +0100
commit29a29226bb01d8e46b731e73f637563e5c4cccfe (patch)
treea0aae656829c551da7bd634d8e16240faba3d21f /libavcodec/h264.c
parent1125571b736b664a5ef079ec9e6f09640682eeda (diff)
Set avctx->coded_width/height to uncropped h264 sizes
avctx->width/height remain right/bottom cropped as previous behaviour. Hardware decoders need to know the uncropped data to allocate surfaces of correct height. Some hardware is picky and fails to decoder properly if a surface larger than needed is used during decode, so just aligning up is not enough. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 1b8f390214..d5b9b179ff 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -2700,11 +2700,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
s->chroma_y_shift = h->sps.chroma_format_idc <= 1; // 400 uses yuv420p
- s->width = 16*s->mb_width - (2>>CHROMA444)*FFMIN(h->sps.crop_right, (8<<CHROMA444)-1);
- if(h->sps.frame_mbs_only_flag)
- s->height= 16*s->mb_height - (1<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1);
- else
- s->height= 16*s->mb_height - (2<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1);
+ s->width = 16*s->mb_width;
+ s->height= 16*s->mb_height;
if (s->context_initialized
&& ( s->width != s->avctx->coded_width || s->height != s->avctx->coded_height
@@ -2725,8 +2722,9 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
av_log(h->s.avctx, AV_LOG_ERROR, "Cannot (re-)initialize context during parallel decoding.\n");
return -1;
}
-
avcodec_set_dimensions(s->avctx, s->width, s->height);
+ s->avctx->width -= (2>>CHROMA444)*FFMIN(h->sps.crop_right, (8<<CHROMA444)-1);
+ s->avctx->height -= (1<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1) * (2 - h->sps.frame_mbs_only_flag);
s->avctx->sample_aspect_ratio= h->sps.sar;
av_assert0(s->avctx->sample_aspect_ratio.den);