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

Michael Niedermayer michaelni at gmx.at
Sat Jun 13 22:49:58 CEST 2015


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

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Democracy is the form of government in which you can choose your dictator
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150613/d3334a68/attachment.asc>


More information about the ffmpeg-devel mailing list