47 const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
92 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
93 ((height >> log2_min_cb_size) + 1);
147 uint8_t luma_weight_l0_flag[16];
148 uint8_t chroma_weight_l0_flag[16];
149 uint8_t luma_weight_l1_flag[16];
150 uint8_t chroma_weight_l1_flag[16];
151 int luma_log2_weight_denom;
154 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
160 int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)
get_se_golomb(gb);
161 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
170 if (!luma_weight_l0_flag[i]) {
177 chroma_weight_l0_flag[i] =
get_bits1(gb);
180 chroma_weight_l0_flag[i] = 0;
183 if (luma_weight_l0_flag[i]) {
188 if (chroma_weight_l0_flag[i]) {
189 for (j = 0; j < 2; j++) {
193 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
194 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
212 if (!luma_weight_l1_flag[i]) {
219 chroma_weight_l1_flag[i] =
get_bits1(gb);
222 chroma_weight_l1_flag[i] = 0;
225 if (luma_weight_l1_flag[i]) {
230 if (chroma_weight_l1_flag[i]) {
231 for (j = 0; j < 2; j++) {
235 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
236 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
259 int prev_delta_msb = 0;
260 unsigned int nb_sps = 0, nb_sh;
278 for (i = 0; i < rps->
nb_refs; i++) {
295 if (delta_poc_msb_present) {
299 if (i && i != nb_sps)
300 delta += prev_delta_msb;
306 prev_delta_msb =
delta;
318 unsigned int num = 0, den = 0;
323 avctx->
width = sps->
width - ow->left_offset - ow->right_offset;
324 avctx->
height = sps->
height - ow->top_offset - ow->bottom_offset;
355 if (num != 0 && den != 0)
362 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
363 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
364 CONFIG_HEVC_NVDEC_HWACCEL + \
365 CONFIG_HEVC_VAAPI_HWACCEL + \
366 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
367 CONFIG_HEVC_VDPAU_HWACCEL)
373 #if CONFIG_HEVC_DXVA2_HWACCEL
376 #if CONFIG_HEVC_D3D11VA_HWACCEL
380 #if CONFIG_HEVC_VAAPI_HWACCEL
383 #if CONFIG_HEVC_VDPAU_HWACCEL
386 #if CONFIG_HEVC_NVDEC_HWACCEL
389 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
394 #if CONFIG_HEVC_DXVA2_HWACCEL
397 #if CONFIG_HEVC_D3D11VA_HWACCEL
401 #if CONFIG_HEVC_VAAPI_HWACCEL
404 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
407 #if CONFIG_HEVC_NVDEC_HWACCEL
412 #if CONFIG_HEVC_NVDEC_HWACCEL
448 for (i = 0; i < 3; i++) {
457 for(c_idx = 0; c_idx < c_count; c_idx++) {
518 if (sps->
width != last_sps->width || sps->
height != last_sps->height ||
520 last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
540 int slice_address_length;
550 "Invalid slice segment address: %u.\n",
599 "Ignoring POC change between slices: %d -> %d\n", s->
poc, poc);
615 int numbits, rps_idx;
623 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
729 "Invalid collocated_ref_idx: %d.\n",
746 "Invalid number of merging MVP candidates: %d.\n",
768 int deblocking_filter_override_flag = 0;
771 deblocking_filter_override_flag =
get_bits1(gb);
773 if (deblocking_filter_override_flag) {
778 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
779 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
781 "Invalid deblock filter offsets: %d, %d\n",
782 beta_offset_div2, tc_offset_div2);
825 if (offset_len < 1 || offset_len > 32) {
861 for (i = 0; i <
length; i++)
870 "The slice_qp %d is outside the valid range "
902 #define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)])
904 #define SET_SAO(elem, value) \
906 if (!sao_merge_up_flag && !sao_merge_left_flag) \
908 else if (sao_merge_left_flag) \
909 sao->elem = CTB(s->sao, rx-1, ry).elem; \
910 else if (sao_merge_up_flag) \
911 sao->elem = CTB(s->sao, rx, ry-1).elem; \
919 int sao_merge_left_flag = 0;
920 int sao_merge_up_flag = 0;
930 if (ry > 0 && !sao_merge_left_flag) {
955 for (i = 0; i < 4; i++)
959 for (i = 0; i < 4; i++) {
968 }
else if (c_idx != 2) {
974 for (i = 0; i < 4; i++) {
982 sao->
offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
994 if (log2_res_scale_abs_plus1 != 0) {
997 (1 - 2 * res_scale_sign_flag);
1007 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1008 int log2_cb_size,
int log2_trafo_size,
1009 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1012 const int log2_trafo_size_c = log2_trafo_size - s->
ps.
sps->
hshift[1];
1016 int trafo_size = 1 << log2_trafo_size;
1022 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1026 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1028 (cbf_cb[1] || cbf_cr[1]));
1040 "The cu_qp_delta %d is outside the valid range "
1054 if (cu_chroma_qp_offset_flag) {
1055 int cu_chroma_qp_offset_idx = 0;
1059 "cu_chroma_qp_offset_idx not yet tested.\n");
1093 int trafo_size_h = 1 << (log2_trafo_size_c + s->
ps.
sps->
hshift[1]);
1094 int trafo_size_v = 1 << (log2_trafo_size_c + s->
ps.
sps->
vshift[1]);
1105 s->
hpc.
intra_pred[log2_trafo_size_c - 2](
s, x0, y0 + (i << log2_trafo_size_c), 1);
1109 log2_trafo_size_c, scan_idx_c, 1);
1117 int size = 1 << log2_trafo_size_c;
1121 for (i = 0; i < (size *
size); i++) {
1134 s->
hpc.
intra_pred[log2_trafo_size_c - 2](
s, x0, y0 + (i << log2_trafo_size_c), 2);
1138 log2_trafo_size_c, scan_idx_c, 2);
1146 int size = 1 << log2_trafo_size_c;
1150 for (i = 0; i < (size *
size); i++) {
1157 int trafo_size_h = 1 << (log2_trafo_size + 1);
1158 int trafo_size_v = 1 << (log2_trafo_size + s->
ps.
sps->
vshift[1]);
1162 trafo_size_h, trafo_size_v);
1163 s->
hpc.
intra_pred[log2_trafo_size - 2](
s, xBase, yBase + (i << log2_trafo_size), 1);
1167 log2_trafo_size, scan_idx_c, 1);
1172 trafo_size_h, trafo_size_v);
1173 s->
hpc.
intra_pred[log2_trafo_size - 2](
s, xBase, yBase + (i << log2_trafo_size), 2);
1177 log2_trafo_size, scan_idx_c, 2);
1182 int trafo_size_h = 1 << (log2_trafo_size_c + s->
ps.
sps->
hshift[1]);
1183 int trafo_size_v = 1 << (log2_trafo_size_c + s->
ps.
sps->
vshift[1]);
1189 trafo_size_h, trafo_size_v);
1190 s->
hpc.
intra_pred[log2_trafo_size_c - 2](
s, x0, y0 + (1 << log2_trafo_size_c), 1);
1191 s->
hpc.
intra_pred[log2_trafo_size_c - 2](
s, x0, y0 + (1 << log2_trafo_size_c), 2);
1193 }
else if (blk_idx == 3) {
1194 int trafo_size_h = 1 << (log2_trafo_size + 1);
1195 int trafo_size_v = 1 << (log2_trafo_size + s->
ps.
sps->
vshift[1]);
1197 trafo_size_h, trafo_size_v);
1202 trafo_size_h, trafo_size_v);
1203 s->
hpc.
intra_pred[log2_trafo_size - 2](
s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1204 s->
hpc.
intra_pred[log2_trafo_size - 2](
s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1214 int cb_size = 1 << log2_cb_size;
1222 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1223 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1224 s->
is_pcm[i + j * min_pu_width] = 2;
1228 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1229 int log2_cb_size,
int log2_trafo_size,
1230 int trafo_depth,
int blk_idx,
1231 const int *base_cbf_cb,
const int *base_cbf_cr)
1239 cbf_cb[0] = base_cbf_cb[0];
1240 cbf_cb[1] = base_cbf_cb[1];
1241 cbf_cr[0] = base_cbf_cr[0];
1242 cbf_cr[1] = base_cbf_cr[1];
1245 if (trafo_depth == 1) {
1261 if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
1263 trafo_depth < lc->cu.max_trafo_depth &&
1278 if (trafo_depth == 0 || cbf_cb[0]) {
1285 if (trafo_depth == 0 || cbf_cr[0]) {
1293 if (split_transform_flag) {
1294 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1295 const int x1 = x0 + trafo_size_split;
1296 const int y1 = y0 + trafo_size_split;
1298 #define SUBDIVIDE(x, y, idx) \
1300 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1301 log2_trafo_size - 1, trafo_depth + 1, idx, \
1320 cbf_cb[0] || cbf_cr[0] ||
1326 log2_cb_size, log2_trafo_size,
1327 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1333 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1334 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1335 int x_tu = (x0 + j) >> log2_min_tu_size;
1336 int y_tu = (y0 + i) >> log2_min_tu_size;
1337 s->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1354 int cb_size = 1 << log2_cb_size;
1409 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1413 ptrdiff_t srcstride = ref->
linesize[0];
1422 x_off += mv->
x >> 2;
1423 y_off += mv->
y >> 2;
1434 edge_emu_stride, srcstride,
1438 pic_width, pic_height);
1440 srcstride = edge_emu_stride;
1445 block_h, mx, my, block_w);
1449 luma_weight, luma_offset, mx, my, block_w);
1469 AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1470 int block_w,
int block_h,
AVFrame *ref1,
const Mv *mv1,
struct MvField *current_mv)
1473 ptrdiff_t src0stride = ref0->
linesize[0];
1474 ptrdiff_t src1stride = ref1->
linesize[0];
1477 int mx0 = mv0->
x & 3;
1478 int my0 = mv0->
y & 3;
1479 int mx1 = mv1->
x & 3;
1480 int my1 = mv1->
y & 3;
1483 int x_off0 = x_off + (mv0->
x >> 2);
1484 int y_off0 = y_off + (mv0->
y >> 2);
1485 int x_off1 = x_off + (mv1->
x >> 2);
1486 int y_off1 = y_off + (mv1->
y >> 2);
1500 edge_emu_stride, src0stride,
1504 pic_width, pic_height);
1506 src0stride = edge_emu_stride;
1517 edge_emu_stride, src1stride,
1521 pic_width, pic_height);
1523 src1stride = edge_emu_stride;
1527 block_h, mx0, my0, block_w);
1530 block_h, mx1, my1, block_w);
1560 ptrdiff_t dststride,
uint8_t *
src0, ptrdiff_t srcstride,
int reflist,
1561 int x_off,
int y_off,
int block_w,
int block_h,
struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1566 const Mv *
mv = ¤t_mv->
mv[reflist];
1572 intptr_t mx = av_mod_uintp2(mv->
x, 2 + hshift);
1573 intptr_t my = av_mod_uintp2(mv->
y, 2 + vshift);
1574 intptr_t _mx = mx << (1 - hshift);
1575 intptr_t _my = my << (1 - vshift);
1577 x_off += mv->
x >> (2 + hshift);
1578 y_off += mv->
y >> (2 + vshift);
1589 edge_emu_stride, srcstride,
1593 pic_width, pic_height);
1596 srcstride = edge_emu_stride;
1600 block_h, _mx, _my, block_w);
1604 chroma_weight, chroma_offset, _mx, _my, block_w);
1625 int x_off,
int y_off,
int block_w,
int block_h,
struct MvField *current_mv,
int cidx)
1630 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1631 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1636 Mv *mv0 = ¤t_mv->
mv[0];
1637 Mv *mv1 = ¤t_mv->
mv[1];
1641 intptr_t mx0 = av_mod_uintp2(mv0->
x, 2 + hshift);
1642 intptr_t my0 = av_mod_uintp2(mv0->
y, 2 + vshift);
1643 intptr_t mx1 = av_mod_uintp2(mv1->
x, 2 + hshift);
1644 intptr_t my1 = av_mod_uintp2(mv1->
y, 2 + vshift);
1645 intptr_t _mx0 = mx0 << (1 - hshift);
1646 intptr_t _my0 = my0 << (1 - vshift);
1647 intptr_t _mx1 = mx1 << (1 - hshift);
1648 intptr_t _my1 = my1 << (1 - vshift);
1650 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1651 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1652 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1653 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1667 edge_emu_stride, src1stride,
1671 pic_width, pic_height);
1674 src1stride = edge_emu_stride;
1686 edge_emu_stride, src2stride,
1690 pic_width, pic_height);
1693 src2stride = edge_emu_stride;
1697 block_h, _mx0, _my0, block_w);
1700 src2, src2stride, lc->
tmp,
1701 block_h, _mx1, _my1, block_w);
1704 src2, src2stride, lc->
tmp,
1711 _mx1, _my1, block_w);
1718 int y =
FFMAX(0, (mv->
y >> 2) + y0 + height + 9);
1725 int nPbH,
int log2_cb_size,
int part_idx,
1737 if (inter_pred_idc !=
PRED_L1) {
1745 part_idx, merge_idx, mv, mvp_flag, 0);
1750 if (inter_pred_idc !=
PRED_L0) {
1763 part_idx, merge_idx, mv, mvp_flag, 1);
1771 int log2_cb_size,
int partIdx,
int idx)
1773 #define POS(c_idx, x, y) \
1774 &s->frame->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1775 (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)]
1778 struct MvField current_mv = {{{ 0 }}};
1790 int x_cb = x0 >> log2_min_cb_size;
1791 int y_cb = y0 >> log2_min_cb_size;
1807 partIdx, merge_idx, ¤t_mv);
1810 partIdx, merge_idx, ¤t_mv);
1818 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1821 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
1827 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
1840 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
1846 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1849 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1859 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
1865 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1869 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1879 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
1880 ref1->frame, ¤t_mv.
mv[1], ¤t_mv);
1884 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
1887 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
1896 int prev_intra_luma_pred_flag)
1914 int intra_pred_mode;
1919 if ((y0 - 1) < y_ctb)
1922 if (cand_left == cand_up) {
1923 if (cand_left < 2) {
1928 candidate[0] = cand_left;
1929 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1930 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1933 candidate[0] = cand_left;
1934 candidate[1] = cand_up;
1944 if (prev_intra_luma_pred_flag) {
1945 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
1947 if (candidate[0] > candidate[1])
1949 if (candidate[0] > candidate[2])
1951 if (candidate[1] > candidate[2])
1955 for (i = 0; i < 3; i++)
1956 if (intra_pred_mode >= candidate[i])
1963 for (i = 0; i < size_in_pus; i++) {
1964 memset(&s->
tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1965 intra_pred_mode, size_in_pus);
1967 for (j = 0; j < size_in_pus; j++) {
1972 return intra_pred_mode;
1976 int log2_cb_size,
int ct_depth)
1989 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
1990 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
1996 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1997 uint8_t prev_intra_luma_pred_flag[4];
1999 int pb_size = (1 << log2_cb_size) >> split;
2000 int side = split + 1;
2004 for (i = 0; i < side; i++)
2005 for (j = 0; j < side; j++)
2008 for (i = 0; i < side; i++) {
2009 for (j = 0; j < side; j++) {
2010 if (prev_intra_luma_pred_flag[2 * i + j])
2017 prev_intra_luma_pred_flag[2 * i + j]);
2022 for (i = 0; i < side; i++) {
2023 for (j = 0; j < side; j++) {
2025 if (chroma_mode != 4) {
2038 if (chroma_mode != 4) {
2042 mode_idx = intra_chroma_table[chroma_mode];
2049 if (chroma_mode != 4) {
2065 int pb_size = 1 << log2_cb_size;
2073 if (size_in_pus == 0)
2075 for (j = 0; j < size_in_pus; j++)
2076 memset(&s->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2078 for (j = 0; j < size_in_pus; j++)
2079 for (k = 0; k < size_in_pus; k++)
2085 int cb_size = 1 << log2_cb_size;
2088 int length = cb_size >> log2_min_cb_size;
2090 int x_cb = x0 >> log2_min_cb_size;
2091 int y_cb = y0 >> log2_min_cb_size;
2092 int idx = log2_cb_size - 2;
2103 for (x = 0; x < 4; x++)
2115 x = y_cb * min_cb_width + x_cb;
2116 for (y = 0; y <
length; y++) {
2117 memset(&s->
skip_flag[x], skip_flag, length);
2122 x = y_cb * min_cb_width + x_cb;
2123 for (y = 0; y <
length; y++) {
2150 log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) {
2176 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2180 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2184 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2188 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2192 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2196 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2197 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2198 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2204 int rqt_root_cbf = 1;
2211 const static int cbf[2] = { 0 };
2217 log2_cb_size, 0, 0, cbf, cbf);
2230 x = y_cb * min_cb_width + x_cb;
2231 for (y = 0; y <
length; y++) {
2236 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2237 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2247 int log2_cb_size,
int cb_depth)
2250 const int cb_size = 1 << log2_cb_size;
2255 if (x0 + cb_size <= s->ps.sps->width &&
2256 y0 + cb_size <= s->ps.sps->height &&
2275 const int cb_size_split = cb_size >> 1;
2276 const int x1 = x0 + cb_size_split;
2277 const int y1 = y0 + cb_size_split;
2285 if (more_data && x1 < s->ps.sps->width) {
2290 if (more_data && y1 < s->ps.sps->height) {
2295 if (more_data && x1 < s->ps.sps->width &&
2296 y1 < s->ps.sps->height) {
2302 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2303 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2307 return ((x1 + cb_size_split) < s->
ps.
sps->
width ||
2315 if ((!((x0 + cb_size) %
2322 return !end_of_slice_flag;
2337 int ctb_addr_in_slice = ctb_addr_rs - s->
sh.
slice_addr;
2342 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2368 if (ctb_addr_in_slice <= 0)
2370 if (ctb_addr_in_slice < s->ps.sps->ctb_width)
2403 while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2423 if (more_data < 0) {
2458 int *ctb_row_p = input_ctb_row;
2459 int ctb_row = ctb_row_p[job];
2469 ret =
init_get_bits8(&lc->
gb,
s->data +
s->sh.offset[ctb_row - 1],
s->sh.size[ctb_row - 1]);
2475 while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2476 int x_ctb = (ctb_addr_rs %
s->ps.sps->ctb_width) <<
s->ps.sps->log2_ctb_size;
2477 int y_ctb = (ctb_addr_rs /
s->ps.sps->ctb_width) <<
s->ps.sps->log2_ctb_size;
2491 hls_sao_param(
s, x_ctb >>
s->ps.sps->log2_ctb_size, y_ctb >>
s->ps.sps->log2_ctb_size);
2494 if (more_data < 0) {
2505 if (!more_data && (x_ctb+ctb_size) <
s->ps.sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2511 if ((x_ctb+ctb_size) >=
s->ps.sps->width && (y_ctb+ctb_size) >=
s->ps.sps->height ) {
2516 ctb_addr_rs =
s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2519 if(x_ctb >=
s->ps.sps->width) {
2527 s->tab_slice_address[ctb_addr_rs] = -1;
2541 int64_t startheader, cmpt = 0;
2572 for (j = 0, cmpt = 0, startheader = offset + s->
sh.
entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2581 for (j = 0, cmpt = 0, startheader = offset
2594 if (length < offset) {
2694 const int mapping[3] = {2, 0, 1};
2695 const int chroma_den = 50000;
2696 const int luma_den = 10000;
2703 for (i = 0; i < 3; i++) {
2704 const int j = mapping[i];
2724 "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n",
2733 "min_luminance=%f, max_luminance=%f\n",
2838 int ctb_addr_ts, ret;
2927 if (s->
max_ra == INT_MAX) {
2948 }
else if (!s->
ref) {
2955 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2965 "Error constructing the reference lists for the current slice.\n");
2989 if (ctb_addr_ts < 0) {
3018 int eos_at_start = 1;
3030 "Error splitting the input into NAL units.\n");
3059 "Error parsing NAL unit #%d.\n", i);
3074 for (i = 0; i < 16; i++)
3075 av_log(log_ctx, level,
"%02"PRIx8, md5[i]);
3104 for (i = 0; frame->
data[i]; i++) {
3112 for (j = 0; j <
h; j++) {
3117 (
const uint16_t *) src, w);
3170 int new_extradata_size;
3184 &new_extradata_size);
3185 if (new_extradata && new_extradata_size > 0) {
3199 "hardware accelerator failed to decode picture\n");
3280 for (i = 0; i < 3; i++) {
3489 memset(s, 0,
sizeof(*s));
3507 #define OFFSET(x) offsetof(HEVCContext, x)
3508 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3511 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
3513 {
"strict-displaywin",
"stricly apply default display window size",
OFFSET(apply_defdispwin),
3531 .priv_class = &hevc_decoder_class,
3543 #if CONFIG_HEVC_DXVA2_HWACCEL
3546 #if CONFIG_HEVC_D3D11VA_HWACCEL
3549 #if CONFIG_HEVC_D3D11VA2_HWACCEL
3552 #if CONFIG_HEVC_NVDEC_HWACCEL
3555 #if CONFIG_HEVC_VAAPI_HWACCEL
3558 #if CONFIG_HEVC_VDPAU_HWACCEL
3561 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
static int set_side_data(HEVCContext *s)
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride, AVFrame *ref, const Mv *mv, int x_off, int y_off, int block_w, int block_h, int luma_weight, int luma_offset)
8.5.3.2.2.1 Luma sample unidirectional interpolation process
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int is_nalff, int nal_length_size, enum AVCodecID codec_id, int small_padding)
Split an input packet into NAL units.
static void intra_prediction_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
unsigned int log2_min_cb_size
const char const char void * val
discard all frames except keyframes
int(* start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Called at the beginning of each frame or field picture.
uint8_t log2_sao_offset_scale_luma
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static enum AVPixelFormat pix_fmt
int anticlockwise_rotation
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
static int verify_md5(HEVCContext *s, AVFrame *frame)
This structure describes decoded (raw) audio or video data.
int current_frame_is_frame0_flag
unsigned MaxCLL
Max content light level (cd/m^2).
#define HWACCEL_D3D11VA2(codec)
#define atomic_store(object, desired)
AVBufferRef * vps_list[HEVC_MAX_VPS_COUNT]
ptrdiff_t const GLvoid * data
static void flush(AVCodecContext *avctx)
enum AVStereo3DView view
Determines which views are packed.
uint8_t diff_cu_chroma_qp_offset_depth
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
#define HWACCEL_NVDEC(codec)
int coded_width
Bitstream width / height, may be different from width/height e.g.
int max_dec_pic_buffering
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth)
int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
uint8_t edge_emu_buffer[(MAX_PB_SIZE+7)*EDGE_EMU_BUFFER_STRIDE *2]
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
void(* put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, int denom, int wx0, int wx1, int ox0, int ox1, intptr_t mx, intptr_t my, int width)
#define LIBAVUTIL_VERSION_INT
int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc)
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
int16_t x
horizontal component of motion vector
void(* bswap16_buf)(uint16_t *dst, const uint16_t *src, int len)
hardware decoding through Videotoolbox
static av_cold int init(AVCodecContext *avctx)
static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
void * hwaccel_picture_private
uint8_t intra_split_flag
IntraSplitFlag.
int rem_intra_luma_pred_mode
static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1, int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
8.5.3.2.2.2 Chroma sample bidirectional interpolation process
enum AVColorRange color_range
MPEG vs JPEG YUV range.
static int hls_transform_tree(HEVCContext *s, int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int trafo_depth, int blk_idx, const int *base_cbf_cb, const int *base_cbf_cr)
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
int ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth)
static const AVClass hevc_decoder_class
Views are next to each other, but when upscaling apply a checkerboard pattern.
Frame contains only the right view.
static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
const char * av_default_item_name(void *ptr)
Return the context name.
uint8_t weighted_bipred_flag
static void hevc_decode_flush(AVCodecContext *avctx)
int ff_hevc_sao_offset_sign_decode(HEVCContext *s)
int ff_hevc_frame_rps(HEVCContext *s)
Construct the reference picture sets for the current frame.
int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
uint8_t seq_loop_filter_across_slices_enabled_flag
uint8_t cabac_init_present_flag
#define AV_PIX_FMT_YUV420P12
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void(* put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width)
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps, HEVCSEI *sei, int *is_nalff, int *nal_length_size, int err_recognition, int apply_defdispwin, void *logctx)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
discard all non intra frames
uint8_t used_by_curr_pic_lt_sps_flag[HEVC_MAX_LONG_TERM_REF_PICS]
ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]
Views are next to each other.
int * ctb_addr_ts_to_rs
CtbAddrTSToRS.
int num_ref_idx_l0_default_active
num_ref_idx_l0_default_active_minus1 + 1
#define HWACCEL_D3D11VA(codec)
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
int8_t cr_qp_offset_list[6]
int ff_hevc_merge_flag_decode(HEVCContext *s)
#define SET_SAO(elem, value)
void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
static void hls_sao_param(HEVCContext *s, int rx, int ry)
uint16_t seq_decode
Sequence counters for decoded and output frames, so that old frames are output first after a POC rese...
static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb, int ctb_addr_ts)
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
Flip the input matrix horizontally and/or vertically.
void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len)
Update hash value.
Macro definitions for various function/variable attributes.
HEVCSEIMasteringDisplay mastering_display
void av_display_rotation_set(int32_t matrix[9], double angle)
Initialize a transformation matrix describing a pure counterclockwise rotation by the specified angle...
Frame contains only the left view.
uint8_t entropy_coding_sync_enabled_flag
int ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s)
enum AVDiscard skip_frame
Skip decoding for selected frames.
AVBufferPool * rpl_tab_pool
candidate references for the current frame
uint8_t log2_sao_offset_scale_chroma
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
void(* emulated_edge_mc)(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_linesize, ptrdiff_t src_linesize, int block_w, int block_h, int src_x, int src_y, int w, int h)
Copy a rectangular area of samples to a temporary buffer and replicate the border samples...
unsigned int log2_max_trafo_size
void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags)
void(* put_hevc_epel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
int ff_hevc_sao_merge_flag_decode(HEVCContext *s)
HEVCSEIContentLight content_light
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
int is_nalff
this flag is != 0 if bitstream is encapsulated as a format defined in 14496-15
int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
enum HEVCNALUnitType nal_unit_type
static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0, int log2_cb_size, int ct_depth)
static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
Stereo 3D type: this structure describes how two videos are packed within a single video surface...
uint8_t ctb_up_right_flag
int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
struct HEVCFrame * ref[HEVC_MAX_REFS]
uint8_t vps_timing_info_present_flag
void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, int log2_trafo_size)
#define BOUNDARY_LEFT_TILE
int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
int num_ref_idx_l1_default_active
num_ref_idx_l1_default_active_minus1 + 1
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
unsigned int log2_min_pcm_cb_size
int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
#define QPEL_EXTRA_BEFORE
Structure to hold side data for an AVFrame.
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
#define HWACCEL_DXVA2(codec)
static double av_q2d(AVRational a)
Convert an AVRational to a double.
void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src)
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
void(* put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
AVBufferRef * pps_list[HEVC_MAX_PPS_COUNT]
uint8_t loop_filter_disable_flag
int ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth)
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
uint8_t cu_transquant_bypass_flag
int16_t tmp[MAX_PB_SIZE *MAX_PB_SIZE]
void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size)
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void(* put_hevc_qpel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
int8_t cb_qp_offset_list[6]
static av_unused const uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
int ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx)
uint8_t transquant_bypass_enable_flag
int temporal_id
temporal_id_plus1 - 1
HEVCLocalContext * HEVClcList[MAX_NB_THREADS]
int ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s)
const AVProfile ff_hevc_profiles[]
int slice_idx
number of the slice being currently decoded
static int get_bits_left(GetBitContext *gb)
static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
uint8_t intra_pred_mode[4]
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
#define SAMPLE_CTB(tab, x, y)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int has_b_frames
Size of the frame reordering buffer in the decoder.
int ff_hevc_frame_nb_refs(const HEVCContext *s)
Get the number of candidate references for the current frame.
int flags
Additional information about the frame packing.
uint8_t slice_initialized
1 if the independent slice segment header was successfully parsed
unsigned int log2_max_poc_lsb
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
Compute POC of the current frame and return it.
int content_interpretation_type
#define atomic_load(object)
int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
AVBufferRef * rpl_tab_buf
discard all bidirectional frames
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
void ff_hevc_hls_filters(HEVCContext *s, int x_ctb, int y_ctb, int ctb_size)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int vui_timing_info_present_flag
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
int active_thread_type
Which multithreading methods are in use by the codec.
static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
ATSC A53 Part 4 Closed Captions.
void(* intra_pred[4])(struct HEVCContext *s, int x0, int y0, int c_idx)
static av_always_inline int ff_hevc_nal_is_nonref(enum HEVCNALUnitType type)
static void intra_prediction_unit_default_value(HEVCContext *s, int x0, int y0, int log2_cb_size)
unsigned int log2_ctb_size
static int set_sps(HEVCContext *s, const HEVCSPS *sps, enum AVPixelFormat pix_fmt)
uint8_t * sao_pixel_buffer_h[3]
const char * name
Name of the codec implementation.
int preferred_transfer_characteristics
static const uint8_t offset[127][2]
#define BOUNDARY_UPPER_TILE
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
uint8_t max_trafo_depth
MaxTrafoDepth.
uint8_t edge_emu_buffer2[(MAX_PB_SIZE+7)*EDGE_EMU_BUFFER_STRIDE *2]
uint16_t sequence
A sequence counter, so that old frames are output first after a POC reset.
static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, AVPacket *avpkt)
static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
int ff_hevc_sao_band_position_decode(HEVCContext *s)
static char * split(char *message, char delim)
uint8_t tiles_enabled_flag
int ff_alloc_entries(AVCodecContext *avctx, int count)
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
int eo_class[3]
sao_eo_class
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
uint32_t vps_num_units_in_tick
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Views are alternated temporally.