13static const QString
LOC { QStringLiteral(
"HEVCParser ") };
28 r = (v > 0xFFFF) << 4;
30 shift = (v > 0xFF) << 3;
33 shift = (v > 0xF) << 2;
36 shift = (v > 0x3) << 1;
100 return "RSV_IRAP_VCL22";
102 return "RSV_IRAP_VCL23";
118 return "PREFIX_SEI_NUT";
120 return "SUFFIX_SEI_NUT";
126 const uint32_t byte_count,
127 const uint64_t stream_offset)
129 const uint8_t *startP =
bytes;
137 static int nexttime = 60000;
139 if (timer.
elapsed() > nexttime)
141 LOG(VB_GENERAL, LOG_DEBUG,
142 QString(
"Frames %1 KeyFrames %2 | Total Frames %3 KeyFrames %4")
156 const uint8_t *endP =
167 if (!
fillRBSP(startP, endP - startP, found_start_code))
179 if (found_start_code)
187 LOG(VB_GENERAL, LOG_ERR,
188 "HEVCParser::addBytes: Found new start "
189 "code, but previous NAL is incomplete!");
207 if (nal_unit_header & 0x8000)
209 LOG(VB_GENERAL, LOG_ERR,
"HEVCParser::parseNAL: "
210 "NAL header forbidden_zero_bit is not zero!");
219 LOG(VB_RECORD, LOG_INFO,
220 QString(
"nalTemperalId: %1, "
222 "nalUnitType: %3 %4")
244 return startP -
bytes;
507 LOG(VB_RECORD, LOG_DEBUG,
LOC +
576 bool profilePresentFlag,
577 int maxNumSubLayersMinus1)
581 if (profilePresentFlag)
586 for (
int j = 0; j < 32; ++j)
624 bool general_progressive_source_flag = br.
get_bits(1);
625 bool general_interlaced_source_flag = br.
get_bits(1);
626 if (!general_progressive_source_flag &&
627 general_interlaced_source_flag)
638 if (general_profile_idc == 4 ||
639 general_profile_compatibility_flag[4] ||
640 general_profile_idc == 5 ||
641 general_profile_compatibility_flag[5] ||
642 general_profile_idc == 6 ||
643 general_profile_compatibility_flag[6] ||
644 general_profile_idc == 7 ||
645 general_profile_compatibility_flag[7] ||
646 general_profile_idc == 8 ||
647 general_profile_compatibility_flag[8] ||
648 general_profile_idc == 9 ||
649 general_profile_compatibility_flag[9] ||
650 general_profile_idc == 10 ||
651 general_profile_compatibility_flag[10] ||
652 general_profile_idc == 11 ||
653 general_profile_compatibility_flag[11])
665 if (general_profile_idc == 5 ||
666 general_profile_compatibility_flag[5] ||
667 general_profile_idc == 9 ||
668 general_profile_compatibility_flag[9] ||
669 general_profile_idc == 10 ||
670 general_profile_compatibility_flag[10] ||
671 general_profile_idc == 11 ||
672 general_profile_compatibility_flag[11])
688 else if (general_profile_idc == 2 ||
689 general_profile_compatibility_flag[2])
710 if (general_profile_idc == 1 ||
711 general_profile_compatibility_flag[1] ||
712 general_profile_idc == 2 ||
713 general_profile_compatibility_flag[2] ||
714 general_profile_idc == 3 ||
715 general_profile_compatibility_flag[3] ||
716 general_profile_idc == 4 ||
717 general_profile_compatibility_flag[4] ||
718 general_profile_idc == 5 ||
719 general_profile_compatibility_flag[5] ||
720 general_profile_idc == 9 ||
721 general_profile_compatibility_flag[9] ||
722 general_profile_idc == 11 ||
723 general_profile_compatibility_flag[11])
744 std::vector<bool> sub_layer_profile_present_flag;
745 std::vector<bool> sub_layer_level_present_flag;
746 for (i = 0; i < maxNumSubLayersMinus1; ++i)
748 sub_layer_profile_present_flag.push_back(br.
get_bits(1));
749 sub_layer_level_present_flag.push_back( br.
get_bits(1));
752 if (maxNumSubLayersMinus1 > 0)
754 for (i = maxNumSubLayersMinus1; i < 8; ++i)
758 for (i = 0; i < maxNumSubLayersMinus1; ++i)
760 if (sub_layer_profile_present_flag[i])
766 for (
int j = 0; j < 32; ++j)
777 if (sub_layer_profile_idc[i] == 4 ||
778 sub_layer_profile_compatibility_flag[i][4] ||
779 sub_layer_profile_idc[i] == 5 ||
780 sub_layer_profile_compatibility_flag[i][5] ||
781 sub_layer_profile_idc[i] == 6 ||
782 sub_layer_profile_compatibility_flag[i][6] ||
783 sub_layer_profile_idc[i] == 7 ||
784 sub_layer_profile_compatibility_flag[i][7] ||
785 sub_layer_profile_idc[i] == 8 ||
786 sub_layer_profile_compatibility_flag[i][8] ||
787 sub_layer_profile_idc[i] == 9 ||
788 sub_layer_profile_compatibility_flag[i][9] ||
789 sub_layer_profile_idc[i] == 10 ||
790 sub_layer_profile_compatibility_flag[i][10] ||
791 sub_layer_profile_idc[i] == 11 ||
792 sub_layer_profile_compatibility_flag[i][11])
803 if (sub_layer_profile_idc[i] == 5 ||
804 sub_layer_profile_compatibility_flag[i][5] ||
805 sub_layer_profile_idc[i] == 9 ||
806 sub_layer_profile_compatibility_flag[i][9] ||
807 sub_layer_profile_idc[i] == 10 ||
808 sub_layer_profile_compatibility_flag[i][10] ||
809 sub_layer_profile_idc[i] == 11 ||
810 sub_layer_profile_compatibility_flag[i][11])
826 else if(sub_layer_profile_idc[i] == 2 ||
827 sub_layer_profile_compatibility_flag[i][2])
848 if (sub_layer_profile_idc[i] == 1 ||
849 sub_layer_profile_compatibility_flag[i][1] ||
850 sub_layer_profile_idc[i] == 2 ||
851 sub_layer_profile_compatibility_flag[i][2] ||
852 sub_layer_profile_idc[i] == 3 ||
853 sub_layer_profile_compatibility_flag[i][3] ||
854 sub_layer_profile_idc[i] == 4 ||
855 sub_layer_profile_compatibility_flag[i][4] ||
856 sub_layer_profile_idc[i] == 5 ||
857 sub_layer_profile_compatibility_flag[i][5] ||
858 sub_layer_profile_idc[i] == 9 ||
859 sub_layer_profile_compatibility_flag[i][9] ||
860 sub_layer_profile_idc[i] == 11 ||
861 sub_layer_profile_compatibility_flag[i][11])
869 if (sub_layer_level_present_flag[i])
878 uint8_t* &sl, uint8_t &size,
879 std::vector<int16_t> &scaling_list_dc_coef_minus8)
894 scaling_list_dc_coef_minus8 =
900 scaling_list_dc_coef_minus8 =
920 for (sizeId = 0; sizeId < 4; ++sizeId)
922 for (
uint matrixId = 0; matrixId < ((sizeId == 3) ? 2 : 6); ++matrixId)
924 std::vector<int16_t> scaling_list_dc_coef_minus8 {};
925 uint8_t *sl =
nullptr;
928 dest_scaling_list, sl, size,
929 scaling_list_dc_coef_minus8))
931 LOG(VB_RECORD, LOG_WARNING,
LOC +
932 QString(
"Failed to process scaling list params"));
943 if (!getDefaultScalingLists(&sl, sizeId, matrixId))
945 LOG(VB_RECORD, LOG_WARNING,
LOC +
946 QString(
"Failed to process default scaling lists"));
952 scaling_list_dc_coef_minus8[matrixId] = 8;
961 if (!scaling_list_pred_matrix_id_delta)
963 if (!getDefaultScalingLists(&sl, sizeId, matrixId))
965 LOG(VB_RECORD, LOG_WARNING,
LOC +
966 QString(
"Failed to process default "
973 scaling_list_dc_coef_minus8[matrixId] = 8;
978 uint8_t refMatrixId = matrixId -
979 scaling_list_pred_matrix_id_delta;
981 refMatrixId, &temp_sl,
984 LOG(VB_RECORD, LOG_WARNING,
LOC +
985 QString(
"Failed to process scaling "
990 for (i = 0; i < size; ++i)
995 scaling_list_dc_coef_minus8[matrixId] =
996 scaling_list_dc_coef_minus8[refMatrixId];
1009 if (scaling_list_dc_coef_minus8[matrixId] < -7 ||
1010 247 < scaling_list_dc_coef_minus8[matrixId])
1012 LOG(VB_RECORD, LOG_WARNING,
LOC +
1013 QString(
"scaling_list_dc_coef_minus8[%1] %2 "
1014 "outside -7 and 247")
1016 .arg(scaling_list_dc_coef_minus8[matrixId]));
1018 nextCoef = scaling_list_dc_coef_minus8[matrixId] + 8;
1022 for (uint8_t i = 0; i < size; ++i)
1026 if (scaling_list_delta_coef < -128 ||
1027 scaling_list_delta_coef > 127)
1029 LOG(VB_RECORD, LOG_WARNING,
LOC +
1030 QString(
"scaling_list_delta_coef %1 "
1031 "outside -128 and 127")
1032 .arg(scaling_list_delta_coef));
1034 nextCoef = (nextCoef + scaling_list_delta_coef) & 0xff;
1052 int num_short_term_ref_pic_sets,
1053 std::array<HEVCParser::ShortTermRefPicSet,65> & stRPS,
1054 uint8_t max_dec_pic_buffering_minus1)
1056 std::array<bool,16> use_delta_flag {
false };
1057 std::array<bool,16> used_by_curr_pic_flag {
false };
1058 std::array<uint32_t,16> delta_poc_s0_minus1 { 0 };
1059 std::array<uint32_t,16> delta_poc_s1_minus1 { 0 };
1069 bool inter_ref_pic_set_prediction_flag = (stRPSIdx != 0) ?
1072 if (inter_ref_pic_set_prediction_flag)
1083 int delta_idx_minus1 = (stRPSIdx == num_short_term_ref_pic_sets) ?
1085 if (delta_idx_minus1 > stRPSIdx - 1)
1086 LOG(VB_RECORD, LOG_WARNING,
LOC +
1087 QString(
"Invalid delta_idx_minus1? %1").arg(delta_idx_minus1));
1089 int8_t delta_rps_sign = br.
get_bits(1);
1091 if (abs_delta_rps_minus1 > 32767)
1092 LOG(VB_RECORD, LOG_WARNING,
LOC +
1093 QString(
"Invalid abs_delta_rps_minus1"));
1094 int deltaRPS = ( 1 - 2 * delta_rps_sign ) * ( abs_delta_rps_minus1 + 1 );
1100 int RefRPSIdx = stRPSIdx - (delta_idx_minus1 + 1);
1103 for (
int j = 0; j <= RefRPS->NumDeltaPocs; ++j)
1105 used_by_curr_pic_flag[j] = br.
get_bits(1);
1116 if (!used_by_curr_pic_flag[j])
1118 use_delta_flag[j] = br.
get_bits(1);
1122 use_delta_flag[j] =
true;
1129 for (
int k = (RefRPS->NumPositivePics - 1); k >= 0; --k)
1131 int dPoc = RefRPS->DeltaPocS1[k] + deltaRPS;
1132 if (dPoc < 0 && use_delta_flag[RefRPS->NumNegativePics + k])
1134 stRPS[stRPSIdx].DeltaPocS0[i] = dPoc;
1135 stRPS[stRPSIdx].UsedByCurrPicS0[i++] =
1136 used_by_curr_pic_flag[RefRPS->NumNegativePics + k];
1140 if (deltaRPS < 0 && use_delta_flag[RefRPS->NumDeltaPocs])
1142 stRPS[stRPSIdx].DeltaPocS0[i] = deltaRPS;
1143 stRPS[stRPSIdx].UsedByCurrPicS0[i++] =
1144 used_by_curr_pic_flag[RefRPS->NumDeltaPocs];
1147 for (
int j = 0; j < RefRPS->NumNegativePics; ++j)
1149 int dPoc = RefRPS->DeltaPocS0[j] + deltaRPS;
1150 if (dPoc < 0 && use_delta_flag[j])
1152 stRPS[stRPSIdx].DeltaPocS0[i] = dPoc;
1153 stRPS[stRPSIdx].UsedByCurrPicS0[i++] = used_by_curr_pic_flag[j];
1156 stRPS[stRPSIdx].NumNegativePics = i;
1159 for (
int k = (RefRPS->NumNegativePics - 1); k >= 0; --k)
1161 int dPoc = RefRPS->DeltaPocS0[k] + deltaRPS;
1162 if (dPoc > 0 && use_delta_flag[k])
1164 stRPS[stRPSIdx].DeltaPocS1[i] = dPoc;
1165 stRPS[stRPSIdx].UsedByCurrPicS1[i++] = used_by_curr_pic_flag[k];
1169 if (deltaRPS > 0 && use_delta_flag[RefRPS->NumDeltaPocs])
1171 stRPS[stRPSIdx].DeltaPocS1[i] = deltaRPS;
1172 stRPS[stRPSIdx].UsedByCurrPicS1[i++] =
1173 used_by_curr_pic_flag[RefRPS->NumDeltaPocs];
1176 for (
int j = 0; j < RefRPS->NumPositivePics; ++j)
1178 int dPoc = RefRPS->DeltaPocS1[j] + deltaRPS;
1179 if (dPoc > 0 && use_delta_flag[RefRPS->NumNegativePics + j])
1181 stRPS[stRPSIdx].DeltaPocS1[i] = dPoc;
1182 stRPS[stRPSIdx].UsedByCurrPicS1[i++] =
1183 used_by_curr_pic_flag[RefRPS->NumNegativePics + j];
1186 stRPS[stRPSIdx].NumPositivePics= i;
1190 stRPS[stRPSIdx].NumNegativePics = std::min((uint8_t)br.
get_ue_golomb(),
1191 max_dec_pic_buffering_minus1);
1192 stRPS[stRPSIdx].NumPositivePics = std::min((uint8_t)br.
get_ue_golomb(),
1193 max_dec_pic_buffering_minus1);
1195 for (i = 0; i < stRPS[stRPSIdx].NumNegativePics; ++i)
1201 stRPS[stRPSIdx].DeltaPocS0[i] = -(delta_poc_s0_minus1[i] + 1);
1203 stRPS[stRPSIdx].DeltaPocS0[i] = stRPS[stRPSIdx].DeltaPocS0[i - 1] -
1204 (delta_poc_s0_minus1[i] + 1);
1206 for (i = 0; i < stRPS[stRPSIdx].NumPositivePics; ++i)
1212 stRPS[stRPSIdx].DeltaPocS1[i] = delta_poc_s1_minus1[i] + 1;
1214 stRPS[stRPSIdx].DeltaPocS1[i] = stRPS[stRPSIdx].DeltaPocS1[i - 1] +
1215 (delta_poc_s1_minus1[i] + 1);
1224 stRPS[stRPSIdx].NumDeltaPocs = stRPS[stRPSIdx].NumNegativePics +
1225 stRPS[stRPSIdx].NumPositivePics;
1237 slice_segment_data(br);
1238 rbsp_slice_segment_trailing_bits(br);
1249 bool dependent_slice_segment_flag =
false;
1261 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1262 QString(
"PPS Id %1 not valid yet. Skipping parsing of slice.")
1273 dependent_slice_segment_flag = br.
get_bits(1);
1278 uint32_t CtbLog2SizeY = MinCbLog2SizeY +
1280 uint32_t CtbSizeY = 1 << CtbLog2SizeY;
1281 uint32_t PicHeightInCtbsY =
1283 static_cast<double>(CtbSizeY));
1284 uint32_t PicWidthInCtbsY =
1286 static_cast<double>(CtbSizeY));
1295 if (!dependent_slice_segment_flag)
1380 (MaxPicOrderCntLsb / 2)))
1387 (MaxPicOrderCntLsb / 2)))
1399 LOG(VB_RECORD, LOG_INFO,
LOC +
1400 QString(
"picOrderCntVal: %1 = %2 + %3")
1403 .arg(slice_pic_order_cnt_lsb));
1409 if (!short_term_ref_pic_set_sps_flag)
1413 else if(num_short_term_ref_pic_sets > 1)
1417 if (long_term_ref_pics_present_flag)
1419 if (num_long_term_ref_pics_sps > 0)
1424 for (i = 0; i < num_long_term_sps + num_long_term_pics; ++i)
1426 if (i < num_long_term_sps)
1428 if (num_long_term_ref_pics_sps > 1)
1434 br.
get_bits(sps->Log2MaxPicOrderCntLsb);
1438 if (delta_poc_msb_present_flag[i])
1444 if (sps_temporal_mvp_enabled_flag)
1451 if (sample_adaptive_offset_enabled_flag)
1454 if (ChromaArrayType != 0)
1459 if (slice_type == P || slice_type == B)
1462 if (num_ref_idx_active_override_flag)
1465 if (slice_type == B)
1470 if (lists_modification_present_flag && NumPicTotalCurr > 1)
1472 ref_pic_lists_modification();
1473 if (slice_type == B)
1478 if (cabac_init_present_flag)
1482 if (slice_temporal_mvp_enabled_flag)
1484 if (slice_type == B)
1488 if (( collocated_from_l0_flag &&
1489 num_ref_idx_l0_active_minus1 > 0) ||
1490 (!collocated_from_l0_flag &&
1491 num_ref_idx_l1_active_minus1 > 0))
1496 if ((weighted_pred_flag && slice_type == P) ||
1497 (weighted_bipred_flag && slice_type == B))
1499 pred_weight_table();
1502 if (motion_vector_resolution_control_idc == 2)
1508 if (pps_slice_chroma_qp_offsets_present_flag)
1513 if (pps_slice_act_qp_offsets_present_flag)
1519 if (chroma_qp_offset_list_enabled_flag)
1523 if (deblocking_filter_override_enabled_flag)
1527 if (deblocking_filter_override_flag)
1530 if (!slice_deblocking_filter_disabled_flag)
1536 if (pps_loop_filter_across_slices_enabled_flag &&
1537 ( slice_sao_luma_flag || slice_sao_chroma_flag ||
1538 !slice_deblocking_filter_disabled_flag))
1545 if (tiles_enabled_flag || entropy_coding_sync_enabled_flag)
1548 if (num_entry_point_offsets > 0)
1551 for (i = 0; i < num_entry_point_offsets; ++i)
1557 if (slice_segment_header_extension_present_flag)
1560 for (i = 0; i < slice_segment_header_extension_length; ++i)
1562 slice_segment_header_extension_data_byte[i];
1577 static std::array<ShortTermRefPicSet,65> short_term_ref_pic_set;
1579 static uint sub_layer_size = 0;
1580 static uint8_t* max_dec_pic_buffering_minus1 =
nullptr;
1587 uint max_sub_layers_minus1 = 0;
1590 max_sub_layers_minus1 = ext_or_max_sub_layers_minus1;
1595 LOG(VB_RECORD, LOG_WARNING,
LOC +
1596 QString(
"Could not find VPS[%1]").arg(vps_id));
1597 max_sub_layers_minus1 = ext_or_max_sub_layers_minus1;
1607 max_sub_layers_minus1 = (ext_or_max_sub_layers_minus1 == 7) ?
1608 m_vps[vps_id].max_sub_layers :
1609 ext_or_max_sub_layers_minus1;
1613 if (sub_layer_size <= max_sub_layers_minus1)
1615 delete[] max_dec_pic_buffering_minus1;
1616 sub_layer_size = max_sub_layers_minus1 + 1;
1617 max_dec_pic_buffering_minus1 =
new uint8_t[sub_layer_size];
1620 bool MultiLayerExtSpsFlag =
1621 (
m_nuhLayerId != 0 && ext_or_max_sub_layers_minus1 == 7);
1623 if (!MultiLayerExtSpsFlag)
1628 LOG(VB_RECORD, LOG_WARNING,
LOC +
1629 QString(
"Failed to parse SPS profiel tier level."));
1637 if (MultiLayerExtSpsFlag)
1697 LOG(VB_RECORD, LOG_WARNING,
LOC +
1698 QString(
"SPS log2_max_pic_order_cnt_lsb %1 > 16")
1706 max_sub_layers_minus1); i <= max_sub_layers_minus1; ++i)
1709 if (max_dec_pic_buffering_minus1[i] > 16)
1711 LOG(VB_RECORD, LOG_WARNING,
LOC +
1712 QString(
"max_dec_pic_bufering_minus1[%1] %2 > 16")
1714 .arg(max_dec_pic_buffering_minus1[i]));
1723 if (!sps_sub_layer_ordering_info_present_flag && sps_max_sub_layers_minus1)
1725 for (i = 0; i <= (sps_max_sub_layers_minus1 - 1); ++i)
1727 max_dec_pic_buffering_minus1[i] =
1728 max_dec_pic_buffering_minus1[sps_max_sub_layers_minus1];
1729 max_num_reorder_pics[i] =
1730 max_num_reorder_pics[sps_max_sub_layers_minus1];
1731 max_latency_increase_plus1[i] =
1732 max_latency_increase_plus1[sps_max_sub_layers_minus1];
1750 bool sps_infer_scaling_list_flag = MultiLayerExtSpsFlag ?
1752 if (sps_infer_scaling_list_flag)
1775 if (num_short_term_ref_pic_sets > short_term_ref_pic_set.size() - 1 )
1777 LOG(VB_RECORD, LOG_WARNING,
LOC +
1778 QString(
"num_short_term_ref_pic_sets %1 > 64")
1779 .arg(num_short_term_ref_pic_sets));
1780 num_short_term_ref_pic_sets = short_term_ref_pic_set.size() - 1;
1782 for(i = 0; i < num_short_term_ref_pic_sets; ++i)
1785 short_term_ref_pic_set,
1786 max_dec_pic_buffering_minus1[max_sub_layers_minus1]))
1795 for (i = 0; i < num_long_term_ref_pics_sps; ++i)
1805 LOG(VB_RECORD, LOG_WARNING,
LOC +
1806 QString(
"POC[%1] %2").arg(i).arg(
m_poc[i]));
1839 uint8_t max_sub_layers_minus1 = br.
get_bits(3);
1844 m_vps[vps_id].max_sub_layers = max_sub_layers_minus1 + 1;
1847 LOG(VB_RECORD, LOG_WARNING,
LOC +
1848 QString(
"Failed to parse VPS profile tier level."));
1852 bool vps_sub_layer_ordering_info_present_flag = br.
get_bits(1);
1853 for (i = (vps_sub_layer_ordering_info_present_flag ? 0 :
1854 max_sub_layers_minus1);
1855 i <= max_sub_layers_minus1; ++i)
1865 if (!vps_sub_layer_ordering_info_present_flag &&
1866 max_sub_layers_minus1)
1868 for (i = 0; i <= (max_sub_layers_minus1 - 1); ++i)
1870 max_dec_pic_buffering_minus1[i] =
1871 max_dec_pic_buffering_minus1[max_sub_layers_minus1];
1872 max_num_reorder_pics[i] =
1873 max_num_reorder_pics[max_sub_layers_minus1];
1874 max_latency_increase_plus1[i] =
1875 max_latency_increase_plus1[max_sub_layers_minus1];
1880 uint8_t vps_max_layer_id = br.
get_bits(6);
1882 for (i = 1; i <= vps_num_layer_sets_minus1; ++i)
1884 for (
int j = 0; j <= vps_max_layer_id; ++j)
1889 if (vps_num_layer_sets_minus1 < 0)
1891 LOG(VB_RECORD, LOG_WARNING,
LOC +
1892 QString(
"vps_num_layer_sets_minus1 %1 < 0")
1893 .arg(vps_num_layer_sets_minus1));
1923 LOG(VB_RECORD, LOG_DEBUG,
1924 QString(
"VUI unitsInTick %1 timeScale %2 fixedRate %3")
1931 for (i = 0; i < vps_num_hrd_parameters; ++i)
1935 cprms_present_flag[i] = br.
get_bits(1);
1936 hrd_parameters(cprms_present_flag[i], max_sub_layers_minus1);
1942 bool vps_extension_flag = br.
get_bits(1);
1943 if (vps_extension_flag)
1945 while (!byte_aligned())
1950 vps_extension2_flag = br.
get_bits(1);
1951 if (vps_extension2_flag)
1953 while (more_rbsp_data())
1957 rbsp_trailing_bits();
1976 sign_data_hiding_enabled_flag;
1977 cabac_init_present_flag;
1978 num_ref_idx_l0_default_active_minus1;
1979 num_ref_idx_l1_default_active_minus1;
1981 constrained_intra_pred_flag;
1982 transform_skip_enabled_flag;
1983 cu_qp_delta_enabled_flag;
1984 if( cu_qp_delta_enabled_flag )
1985 diff_cu_qp_delta_depth;
1988 pps_slice_chroma_qp_offsets_present_flag;
1990 weighted_bipred_flag;
1991 transquant_bypass_enabled_flag;
1993 entropy_coding_sync_enabled_flag;
1994 if( tiles_enabled_flag ) {
1995 num_tile_columns_minus1;
1996 num_tile_rows_minus1;
1997 uniform_spacing_flag;
1998 if( !uniform_spacing_flag ) {
1999 for( i = 0; i < num_tile_columns_minus1; i++ )
2000 column_width_minus1[ i ];
2001 for( i = 0; i < num_tile_rows_minus1; i++ )
2002 row_height_minus1[ i ];
2004 loop_filter_across_tiles_enabled_flag;
2005 pps_loop_filter_across_slices_enabled_flag;
2006 deblocking_filter_control_present_flag;
2007 if( deblocking_filter_control_present_flag ) {
2009 deblocking_filter_override_enabled_flag;
2010 pps_deblocking_filter_disabled_flag;
2011 if( !pps_deblocking_filter_disabled_flag ) {
2012 pps_beta_offset_div2;
2016 pps_scaling_list_data_present_flag;
2017 if( pps_scaling_list_data_present_flag )
2018 scaling_list_data( );
2019 lists_modification_present_flag;
2020 log2_parallel_merge_level_minus2;
2021 slice_segment_header_extension_present_flag;
2022 pps_extension_present_flag;
2023 if( pps_extension_present_flag ) {
2024 pps_range_extension_flag;
2025 pps_multilayer_extension_flag;
2026 pps_3d_extension_flag;
2027 pps_scc_extension_flag;
2028 pps_extension_4bits;
2030 if( pps_range_extension_flag )
2031 pps_range_extension( );
2032 if( pps_multilayer_extension_flag )
2033 pps_multilayer_extension( );
2034 if( pps_3d_extension_flag )
2035 pps_3d_extension( );
2036 if( pps_scc_extension_flag )
2037 pps_scc_extension( );
2038 if( pps_extension_4bits )
2039 while( more_rbsp_data( ) )
2040 pps_extension_data_flag;
2041 rbsp_trailing_bits( )
2050 static const std::array<const uint8_t,5> subwc {1, 2, 2, 1, 1};
2061 static const std::array<const uint8_t,5> subhc {1, 2, 1, 1, 1};
static bool scalingListData(BitReader &br, HEVCParser::ScalingList &dest_scaling_list, bool use_default)
static bool getScalingListParams(uint8_t sizeId, uint8_t matrixId, HEVCParser::ScalingList &dest_scaling_list, uint8_t *&sl, uint8_t &size, std::vector< int16_t > &scaling_list_dc_coef_minus8)
static bool shortTermRefPicSet(BitReader &br, int stRPSIdx, int num_short_term_ref_pic_sets, std::array< HEVCParser::ShortTermRefPicSet, 65 > &stRPS, uint8_t max_dec_pic_buffering_minus1)
static uint ceil_log2(uint32_t v)
bitstream reader API header.
This is in libmythtv because that is where the parsers, which are its main users, are.
int get_ue_golomb()
Read an unsigned Exp-Golomb code in the range 0 to 8190 (2^13 - 2).
void skip_bits(unsigned n)
uint32_t get_ue_golomb_long()
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
int get_se_golomb()
read signed exp golomb code.
uint32_t get_bits(unsigned n)
Read 0-32 bits.
uint64_t m_frameStartOffset
bool m_separateColourPlaneFlag
uint m_frameCropBottomOffset
uint64_t m_totalkeyframecnt
uint m_frameCropLeftOffset
uint m_frameCropTopOffset
uint32_t m_syncAccumulator
uint64_t m_keyframeStartOffset
void vui_parameters(BitReader &br, bool hevc)
bool fillRBSP(const uint8_t *byteP, uint32_t byte_count, bool found_start_code)
uint m_frameCropRightOffset
std::map< uint, uint > m_poc
std::map< uint, SPS > m_sps
uint32_t m_picOrderCntMsb
uint pictureHeightCropped(void) const override
uint pictureWidthCropped(void) const override
uint32_t m_prevPicOrderCntMsb
std::map< uint, PPS > m_pps
bool parseSliceSegmentLayer(BitReader &br)
QString NAL_type_str(int8_t type) override
std::map< uint, VPS > m_vps
bool parseSliceSegmentHeader(BitReader &br)
MythAVRational getFrameRate() const override
static bool NALisVCL(uint type)
uint32_t m_resolutionCheck
uint32_t m_picOrderCntVal
void processRBSP(bool rbsp_complete)
uint32_t addBytes(const uint8_t *bytes, uint32_t byte_count, uint64_t stream_offset) override
uint32_t m_prevPicOrderCntLsb
bool profileTierLevel(BitReader &br, bool profilePresentFlag, int maxNumSubLayersMinus1)
bool m_firstSliceSegmentInPicFlag
static bool NALisIRAP(uint type)
bool parsePPS(BitReader &br)
void Reset(void) override
bool parseSPS(BitReader &br)
bool parseVPS(BitReader &br)
C++ wrapper for FFmpeg libavutil AVRational.
A QElapsedTimer based timer to replace use of QTime as a timer.
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
bool start_code_is_valid(uint32_t start_code)
Test whether a start code found by find_start_code() is valid.
MTV_PUBLIC const uint8_t * find_start_code_truncated(const uint8_t *p, const uint8_t *end, uint32_t *start_code)
By preserving the start_code value between subsequent calls, the caller can detect start codes across...
bool dependent_slice_segments_enabled_flag
bool output_flag_present_flag
uint8_t num_extra_slice_header_bits
bool sub_layer_ordering_info_present_flag
bool separate_colour_plane_flag
uint8_t log2_min_luma_coding_block_size
uint8_t log2_diff_max_min_luma_coding_block_size
uint8_t log2_max_pic_order_cnt_lsb
std::array< std::array< uint8_t, 64 >, 6 > scaling_lists_16x16
std::vector< int16_t > scaling_list_dc_coef_minus8_16x16
std::vector< int16_t > scaling_list_dc_coef_minus8_32x32
std::array< std::array< uint8_t, 64 >, 6 > scaling_lists_8x8
std::array< std::array< uint8_t, 16 >, 6 > scaling_lists_4x4
std::array< std::array< uint8_t, 64 >, 2 > scaling_lists_32x32