mirror of https://git.ffmpeg.org/ffmpeg.git
h264: use externally provided dimensions when they appear to be more correct.
This is based on:
commit 30f515091c
Author: Mans Rullgard <mans@mansr.com>
h264: allow cropping to AVCodecContext.width/height
The above commit is not taken as is as its buggy (incorrect handling of
the interlaced case) and didnt apply cleanly.
Fixes ticket156
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
3275981207
commit
dfaf2dd956
|
@ -2982,9 +2982,19 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
|||
"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);
|
||||
if( FFALIGN(s->avctx->width , 16 ) == s->width
|
||||
&& FFALIGN(s->avctx->height, 16*(2 - h->sps.frame_mbs_only_flag)) == s->height
|
||||
&& !h->sps.crop_right && !h->sps.crop_bottom
|
||||
&& (s->avctx->width != s->width || s->avctx->height && s->height)
|
||||
) {
|
||||
av_log(h->s.avctx, AV_LOG_DEBUG, "Using externally provided dimensions\n");
|
||||
s->avctx->coded_width = s->width;
|
||||
s->avctx->coded_height = s->height;
|
||||
} else{
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue