On Sun, Mar 29, 2015 at 2:18 PM, Anton Khirnov <[email protected]> wrote: > --- > libavcodec/hevc.c | 83 > ++++++++++++++++++++++++++++++------------------------- > 1 file changed, 46 insertions(+), 37 deletions(-) > > diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c > index c275e43..0256fe6 100644 > --- a/libavcodec/hevc.c > +++ b/libavcodec/hevc.c > @@ -383,24 +383,63 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS > *rps, GetBitContext *gb) > return 0; > } > > +static void export_stream_params(AVCodecContext *avctx, > + const HEVCContext *s, const HEVCSPS *sps) > +{ > + const HEVCVPS *vps = (const HEVCVPS*)s->vps_list[sps->vps_id]->data; > + unsigned int num = 0, den = 0; > + > + avctx->pix_fmt = sps->pix_fmt; > + avctx->coded_width = sps->width; > + avctx->coded_height = sps->height; > + avctx->width = sps->output_width; > + avctx->height = sps->output_height; > + avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - > 1].num_reorder_pics; > + > + ff_set_sar(avctx, sps->vui.sar); > + > + if (sps->vui.video_signal_type_present_flag) > + avctx->color_range = sps->vui.video_full_range_flag ? > AVCOL_RANGE_JPEG > + : > AVCOL_RANGE_MPEG; > + else > + avctx->color_range = AVCOL_RANGE_MPEG; > + > + if (sps->vui.colour_description_present_flag) { > + avctx->color_primaries = sps->vui.colour_primaries; > + avctx->color_trc = sps->vui.transfer_characteristic; > + avctx->colorspace = sps->vui.matrix_coeffs; > + } else { > + avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; > + avctx->color_trc = AVCOL_TRC_UNSPECIFIED; > + avctx->colorspace = AVCOL_SPC_UNSPECIFIED; > + } > + > + if (vps->vps_timing_info_present_flag) { > + num = vps->vps_num_units_in_tick; > + den = 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(&avctx->framerate.den, &avctx->framerate.num, > + num, den, 1 << 30); > +} > + > static int set_sps(HEVCContext *s, const HEVCSPS *sps) > { > #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL) > enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts; > int ret; > - unsigned int num = 0, den = 0; > + > + export_stream_params(s->avctx, s, sps); > > pic_arrays_free(s); > ret = pic_arrays_init(s, sps); > if (ret < 0) > goto fail; > > - s->avctx->coded_width = sps->width; > - s->avctx->coded_height = sps->height; > - s->avctx->width = sps->output_width; > - s->avctx->height = sps->output_height; > - s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers > - 1].num_reorder_pics; > - > if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == > AV_PIX_FMT_YUVJ420P) { > #if CONFIG_HEVC_DXVA2_HWACCEL > *fmt++ = AV_PIX_FMT_DXVA2_VLD; > @@ -415,24 +454,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps) > goto fail; > s->avctx->pix_fmt = ret; > > - ff_set_sar(s->avctx, sps->vui.sar); > - > - if (sps->vui.video_signal_type_present_flag) > - s->avctx->color_range = sps->vui.video_full_range_flag ? > AVCOL_RANGE_JPEG > - : > AVCOL_RANGE_MPEG; > - else > - s->avctx->color_range = AVCOL_RANGE_MPEG; > - > - if (sps->vui.colour_description_present_flag) { > - s->avctx->color_primaries = sps->vui.colour_primaries; > - s->avctx->color_trc = sps->vui.transfer_characteristic; > - s->avctx->colorspace = sps->vui.matrix_coeffs; > - } else { > - s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; > - s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED; > - s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED; > - } > - > ff_hevc_pred_init(&s->hpc, sps->bit_depth); > ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth); > ff_videodsp_init (&s->vdsp, sps->bit_depth); > @@ -448,18 +469,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps) > s->sps = sps; > 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->framerate.den, &s->avctx->framerate.num, > - num, den, 1 << 30); > - > return 0; > > fail: > -- > 2.0.0
How about moving the set for profile/level into this function as well? For some reason its being set in an entirely different place right now, despite also coming from the SPS. This would also make it available after codec init then, considering the follow up patches. - Hendrik _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
