Quoting Hendrik Leppkes (2015-03-30 12:08:34)
> 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.
> 

Eh right, I wanted to do that but seems I forgot.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to