summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorSreerenj Balachandran <sreerenj.balachandran@intel.com>2015-08-13 05:07:52 +0300
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>2015-08-13 05:07:52 +0300
commit53a0e78948bb43b2d7e21130de14744b0272b126 (patch)
tree14ad94090244b232bbf8b96cd5ea1566e57cfe75 /gst-libs
parent1f287dc71c104b30050379a4558ba007d02446ed (diff)
downloadgst-vaapi-53a0e78948bb43b2d7e21130de14744b0272b126.tar.gz
decoder: hevc: Add calculation of WpOffsetHalfRangeC
This is necessary for finding ChromaOffsetL0/ChromaOffsetL1 prediction weight table values with out using any hard coding. Fixme: We don't have parser API for sps_range_extension, so assumed zero value for high_precision_offsets_enabled_flag. Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_h265.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h265.c b/gst-libs/gst/vaapi/gstvaapidecoder_h265.c
index eec156c5..9b212ad1 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_h265.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_h265.c
@@ -388,6 +388,7 @@ struct _GstVaapiDecoderH265Private
guint RefPicList1_count;
guint32 SpsMaxLatencyPictures;
+ gint32 WpOffsetHalfRangeC;
guint nal_length_size;
@@ -1487,6 +1488,7 @@ decode_sps (GstVaapiDecoderH265 * decoder, GstVaapiDecoderUnit * unit)
GstVaapiDecoderH265Private *const priv = &decoder->priv;
GstVaapiParserInfoH265 *const pi = unit->parsed_info;
GstH265SPS *const sps = &pi->data.sps;
+ guint high_precision_offsets_enabled_flag = 0, bitdepthC = 0;
GST_DEBUG ("decode SPS");
@@ -1495,6 +1497,13 @@ decode_sps (GstVaapiDecoderH265 * decoder, GstVaapiDecoderUnit * unit)
sps->max_num_reorder_pics[sps->max_sub_layers_minus1] +
sps->max_latency_increase_plus1[sps->max_sub_layers_minus1] - 1;
+ /* Calculate WpOffsetHalfRangeC: (7-34)
+ * Fixme: We don't have parser API for sps_range_extension, so assuming
+ * high_precision_offsets_enabled_flag as zero */
+ bitdepthC = sps->bit_depth_chroma_minus8 + 8;
+ priv->WpOffsetHalfRangeC =
+ 1 << (high_precision_offsets_enabled_flag ? (bitdepthC - 1) : 7);
+
gst_vaapi_parser_info_h265_replace (&priv->sps[sps->id], pi);
return GST_VAAPI_DECODER_STATUS_SUCCESS;
@@ -2325,6 +2334,7 @@ static gboolean
fill_pred_weight_table (GstVaapiDecoderH265 * decoder,
GstVaapiSlice * slice, GstH265SliceHdr * slice_hdr)
{
+ GstVaapiDecoderH265Private *const priv = &decoder->priv;
VASliceParameterBufferHEVC *const slice_param = slice->param;
GstH265PPS *const pps = get_pps (decoder);
GstH265SPS *const sps = get_sps (decoder);
@@ -2379,9 +2389,10 @@ fill_pred_weight_table (GstVaapiDecoderH265 * decoder,
(1 << chroma_log2_weight_denom) + w->delta_chroma_weight_l0[i][j];
/* 7-56 */
slice_param->ChromaOffsetL0[i][j] = CLAMP (
- (127 + w->delta_chroma_offset_l0[i][j] -
- ((128 * chroma_weight) >> chroma_log2_weight_denom)), -128,
- 127);
+ (priv->WpOffsetHalfRangeC + w->delta_chroma_offset_l0[i][j] -
+ ((priv->WpOffsetHalfRangeC *
+ chroma_weight) >> chroma_log2_weight_denom)),
+ -priv->WpOffsetHalfRangeC, priv->WpOffsetHalfRangeC - 1);
}
}
}
@@ -2400,10 +2411,13 @@ fill_pred_weight_table (GstVaapiDecoderH265 * decoder,
chroma_weight =
(1 << chroma_log2_weight_denom) +
w->delta_chroma_weight_l1[i][j];
+ /* 7-56 */
slice_param->ChromaOffsetL1[i][j] =
- CLAMP ((127 + w->delta_chroma_offset_l1[i][j] -
- ((128 * chroma_weight) >> chroma_log2_weight_denom)), -128,
- 127);
+ CLAMP ((priv->WpOffsetHalfRangeC +
+ w->delta_chroma_offset_l1[i][j] -
+ ((priv->WpOffsetHalfRangeC *
+ chroma_weight) >> chroma_log2_weight_denom)),
+ -priv->WpOffsetHalfRangeC, priv->WpOffsetHalfRangeC - 1);
}
}
}