summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2015-06-13 09:34:43 -0700
committerPhilip Langdale <philipl@overt.org>2015-06-13 21:09:24 -0700
commit1b19d0c6328181d7f680a534b2bb17eadde01dd0 (patch)
treef0373b99b9234dea1fc0645fb70d137a1382805e /libavcodec
parent01fac84fe4351eeadf852bd5a932eea517a9b210 (diff)
avcodec/hevc: Track long and short term RPS size for VDPAU
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@overt.org>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/hevc.c8
-rw-r--r--libavcodec/hevc.h1
2 files changed, 6 insertions, 3 deletions
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 1d2fa9c81d..5237752cd0 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;
}
+ sh->long_term_ref_pic_set_size = pos - get_bits_left(gb);
if (s->sps->sps_temporal_mvp_enabled_flag)
sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index eecccb7f16..44c6c47a51 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -579,6 +579,7 @@ typedef struct SliceHeader {
int short_term_ref_pic_set_size;
ShortTermRPS slice_rps;
const ShortTermRPS *short_term_rps;
+ int long_term_ref_pic_set_size;
LongTermRPS long_term_rps;
unsigned int list_entry_lx[2][32];