[FFmpeg-devel] [PATCH] avcodec/hevc: Track long and short term RPS size for VDPAU

Philip Langdale philipl at overt.org
Sun Jun 14 06:11:03 CEST 2015


On Sat, 13 Jun 2015 22:49:58 +0200
Michael Niedermayer <michaelni at gmx.at> wrote:

> On Sat, Jun 13, 2015 at 09:43:49AM -0700, Philip Langdale wrote:
> > Today, we track the short term RPS size for DXVA, but only if the
> > SliceHeader RPS is being used. Otherwise it's left uninitialized.
> > 
> > NVIDIA's VDPAU implementation requires that the size be accurately
> > tracked even if an SPS RPS is being used. In this case, it's really
> > counting the size of the RPS idx information, but you end up with
> > mangled output if the value is not accurate.
> > 
> > VDPAU also needs the size of the long term RPS.
> > 
> > Signed-off-by: Philip Langdale <philipl at overt.org>
> > ---
> >  libavcodec/hevc.c | 10 ++++++----
> >  libavcodec/hevc.h |  1 +
> >  2 files changed, 7 insertions(+), 4 deletions(-)
> > 
> > diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
> > index 1d2fa9c..95eb354 100644
> > --- a/libavcodec/hevc.c
> > +++ b/libavcodec/hevc.c
> > @@ -502,7 +502,7 @@ static int hls_slice_header(HEVCContext *s)
> >              sh->colour_plane_id = get_bits(gb, 2);
> >  
> >          if (!IS_IDR(s)) {
> > -            int poc;
> > +            int poc, pos;
> >  
> >              sh->pic_order_cnt_lsb = get_bits(gb,
> > s->sps->log2_max_poc_lsb); poc = ff_hevc_compute_poc(s,
> > sh->pic_order_cnt_lsb); @@ -516,13 +516,12 @@ static int
> > hls_slice_header(HEVCContext *s) s->poc = poc;
> >  
> >              sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
> > +            pos = get_bits_left(gb);
> >              if (!sh->short_term_ref_pic_set_sps_flag) {
> > -                int pos = get_bits_left(gb);
> >                  ret = ff_hevc_decode_short_term_rps(s,
> > &sh->slice_rps, s->sps, 1); if (ret < 0)
> >                      return ret;
> >  
> > -                sh->short_term_ref_pic_set_size = pos -
> > get_bits_left(gb); sh->short_term_rps = &sh->slice_rps;
> >              } else {
> >                  int numbits, rps_idx;
> > @@ -536,13 +535,16 @@ static int hls_slice_header(HEVCContext *s)
> >                  rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
> >                  sh->short_term_rps = &s->sps->st_rps[rps_idx];
> >              }
> > +            sh->short_term_ref_pic_set_size = pos -
> > get_bits_left(gb); 
> > +            pos = get_bits_left(gb);
> >              ret = decode_lt_rps(s, &sh->long_term_rps, gb);
> >              if (ret < 0) {
> >                  av_log(s->avctx, AV_LOG_WARNING, "Invalid long
> > term RPS.\n"); if (s->avctx->err_recognition & AV_EF_EXPLODE)
> >                      return AVERROR_INVALIDDATA;
> 
> > -            }
> > +                }
> 
> stray change
> 
> otherwise patch should be fine
> 
> thanks
> 
> [...]

Fixed and pushed. Thanks.


--phil


More information about the ffmpeg-devel mailing list