Commit f90281ca authored by Guillaume Martres's avatar Guillaume Martres Committed by Michael Niedermayer

hevc: Correctly set time_base

- Try reading the time_base information from the VPS too, not just the VUI
- Only set time_base when an SPS is activated, not when it's decoded.
- Reduce the fraction before setting it.
- Don't set anything if the fraction is invalid (because the VUI is not
  present or because the encoded value is invalid).

Conflicts:
	libavcodec/hevc_ps.c
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 679a6377
...@@ -283,6 +283,7 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb) ...@@ -283,6 +283,7 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
static int set_sps(HEVCContext *s, const HEVCSPS *sps) static int set_sps(HEVCContext *s, const HEVCSPS *sps)
{ {
int ret; int ret;
int num = 0, den = 0;
pic_arrays_free(s); pic_arrays_free(s);
ret = pic_arrays_init(s, sps); ret = pic_arrays_init(s, sps);
...@@ -327,6 +328,19 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps) ...@@ -327,6 +328,19 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps)
s->sps = sps; s->sps = sps;
s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data; s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
if (s->vps->vps_timing_info_present_flag) {
num = s->vps->vps_num_units_in_tick;
den = s->vps->vps_time_scale;
} else if (sps->vui.vui_timing_info_present_flag) {
num = sps->vui.vui_num_units_in_tick;
den = sps->vui.vui_time_scale;
}
if (num != 0 && den != 0)
av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,
num, den, 1 << 30);
return 0; return 0;
fail: fail:
......
...@@ -511,8 +511,6 @@ static void decode_vui(HEVCContext *s, HEVCSPS *sps) ...@@ -511,8 +511,6 @@ static void decode_vui(HEVCContext *s, HEVCSPS *sps)
if (vui->vui_timing_info_present_flag) { if (vui->vui_timing_info_present_flag) {
vui->vui_num_units_in_tick = get_bits(gb, 32); vui->vui_num_units_in_tick = get_bits(gb, 32);
vui->vui_time_scale = get_bits(gb, 32); vui->vui_time_scale = get_bits(gb, 32);
s->avctx->time_base.num = vui->vui_num_units_in_tick;
s->avctx->time_base.den = vui->vui_time_scale;
vui->vui_poc_proportional_to_timing_flag = get_bits1(gb); vui->vui_poc_proportional_to_timing_flag = get_bits1(gb);
if (vui->vui_poc_proportional_to_timing_flag) if (vui->vui_poc_proportional_to_timing_flag)
vui->vui_num_ticks_poc_diff_one_minus1 = get_ue_golomb_long(gb); vui->vui_num_ticks_poc_diff_one_minus1 = get_ue_golomb_long(gb);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment