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 sub_layer_profile_present_flag.reserve(maxNumSubLayersMinus1);
747 sub_layer_level_present_flag.reserve(maxNumSubLayersMinus1);
748 for (i = 0; i < maxNumSubLayersMinus1; ++i)
750 sub_layer_profile_present_flag.push_back(br.
get_bits(1));
751 sub_layer_level_present_flag.push_back( br.
get_bits(1));
754 if (maxNumSubLayersMinus1 > 0)
756 for (i = maxNumSubLayersMinus1; i < 8; ++i)
760 for (i = 0; i < maxNumSubLayersMinus1; ++i)
762 if (sub_layer_profile_present_flag[i])
768 for (
int j = 0; j < 32; ++j)
779 if (sub_layer_profile_idc[i] == 4 ||
780 sub_layer_profile_compatibility_flag[i][4] ||
781 sub_layer_profile_idc[i] == 5 ||
782 sub_layer_profile_compatibility_flag[i][5] ||
783 sub_layer_profile_idc[i] == 6 ||
784 sub_layer_profile_compatibility_flag[i][6] ||
785 sub_layer_profile_idc[i] == 7 ||
786 sub_layer_profile_compatibility_flag[i][7] ||
787 sub_layer_profile_idc[i] == 8 ||
788 sub_layer_profile_compatibility_flag[i][8] ||
789 sub_layer_profile_idc[i] == 9 ||
790 sub_layer_profile_compatibility_flag[i][9] ||
791 sub_layer_profile_idc[i] == 10 ||
792 sub_layer_profile_compatibility_flag[i][10] ||
793 sub_layer_profile_idc[i] == 11 ||
794 sub_layer_profile_compatibility_flag[i][11])
805 if (sub_layer_profile_idc[i] == 5 ||
806 sub_layer_profile_compatibility_flag[i][5] ||
807 sub_layer_profile_idc[i] == 9 ||
808 sub_layer_profile_compatibility_flag[i][9] ||
809 sub_layer_profile_idc[i] == 10 ||
810 sub_layer_profile_compatibility_flag[i][10] ||
811 sub_layer_profile_idc[i] == 11 ||
812 sub_layer_profile_compatibility_flag[i][11])
828 else if(sub_layer_profile_idc[i] == 2 ||
829 sub_layer_profile_compatibility_flag[i][2])
850 if (sub_layer_profile_idc[i] == 1 ||
851 sub_layer_profile_compatibility_flag[i][1] ||
852 sub_layer_profile_idc[i] == 2 ||
853 sub_layer_profile_compatibility_flag[i][2] ||
854 sub_layer_profile_idc[i] == 3 ||
855 sub_layer_profile_compatibility_flag[i][3] ||
856 sub_layer_profile_idc[i] == 4 ||
857 sub_layer_profile_compatibility_flag[i][4] ||
858 sub_layer_profile_idc[i] == 5 ||
859 sub_layer_profile_compatibility_flag[i][5] ||
860 sub_layer_profile_idc[i] == 9 ||
861 sub_layer_profile_compatibility_flag[i][9] ||
862 sub_layer_profile_idc[i] == 11 ||
863 sub_layer_profile_compatibility_flag[i][11])
871 if (sub_layer_level_present_flag[i])
880 uint8_t* &sl, uint8_t &size,
881 std::vector<int16_t> &scaling_list_dc_coef_minus8)
896 scaling_list_dc_coef_minus8 =
902 scaling_list_dc_coef_minus8 =
922 for (sizeId = 0; sizeId < 4; ++sizeId)
924 for (
uint matrixId = 0; matrixId < ((sizeId == 3) ? 2 : 6); ++matrixId)
926 std::vector<int16_t> scaling_list_dc_coef_minus8 {};
927 uint8_t *sl =
nullptr;
930 dest_scaling_list, sl, size,
931 scaling_list_dc_coef_minus8))
933 LOG(VB_RECORD, LOG_WARNING,
LOC +
934 QString(
"Failed to process scaling list params"));
945 if (!getDefaultScalingLists(&sl, sizeId, matrixId))
947 LOG(VB_RECORD, LOG_WARNING,
LOC +
948 QString(
"Failed to process default scaling lists"));
954 scaling_list_dc_coef_minus8[matrixId] = 8;
963 if (!scaling_list_pred_matrix_id_delta)
965 if (!getDefaultScalingLists(&sl, sizeId, matrixId))
967 LOG(VB_RECORD, LOG_WARNING,
LOC +
968 QString(
"Failed to process default "
975 scaling_list_dc_coef_minus8[matrixId] = 8;
980 uint8_t refMatrixId = matrixId -
981 scaling_list_pred_matrix_id_delta;
983 refMatrixId, &temp_sl,
986 LOG(VB_RECORD, LOG_WARNING,
LOC +
987 QString(
"Failed to process scaling "
992 for (i = 0; i < size; ++i)
997 scaling_list_dc_coef_minus8[matrixId] =
998 scaling_list_dc_coef_minus8[refMatrixId];
1011 if (scaling_list_dc_coef_minus8[matrixId] < -7 ||
1012 247 < scaling_list_dc_coef_minus8[matrixId])
1014 LOG(VB_RECORD, LOG_WARNING,
LOC +
1015 QString(
"scaling_list_dc_coef_minus8[%1] %2 "
1016 "outside -7 and 247")
1018 .arg(scaling_list_dc_coef_minus8[matrixId]));
1020 nextCoef = scaling_list_dc_coef_minus8[matrixId] + 8;
1024 for (uint8_t i = 0; i < size; ++i)
1028 if (scaling_list_delta_coef < -128 ||
1029 scaling_list_delta_coef > 127)
1031 LOG(VB_RECORD, LOG_WARNING,
LOC +
1032 QString(
"scaling_list_delta_coef %1 "
1033 "outside -128 and 127")
1034 .arg(scaling_list_delta_coef));
1036 nextCoef = (nextCoef + scaling_list_delta_coef) & 0xff;
1054 int num_short_term_ref_pic_sets,
1055 std::array<HEVCParser::ShortTermRefPicSet,65> & stRPS,
1056 uint8_t max_dec_pic_buffering_minus1)
1058 std::array<bool,16> use_delta_flag {
false };
1059 std::array<bool,16> used_by_curr_pic_flag {
false };
1060 std::array<uint32_t,16> delta_poc_s0_minus1 { 0 };
1061 std::array<uint32_t,16> delta_poc_s1_minus1 { 0 };
1071 bool inter_ref_pic_set_prediction_flag = (stRPSIdx != 0) ?
1074 if (inter_ref_pic_set_prediction_flag)
1085 int delta_idx_minus1 = (stRPSIdx == num_short_term_ref_pic_sets) ?
1087 if (delta_idx_minus1 > stRPSIdx - 1)
1088 LOG(VB_RECORD, LOG_WARNING,
LOC +
1089 QString(
"Invalid delta_idx_minus1? %1").arg(delta_idx_minus1));
1091 int8_t delta_rps_sign = br.
get_bits(1);
1093 if (abs_delta_rps_minus1 > 32767)
1094 LOG(VB_RECORD, LOG_WARNING,
LOC +
1095 QString(
"Invalid abs_delta_rps_minus1"));
1096 int deltaRPS = ( 1 - (2 * delta_rps_sign) ) * ( abs_delta_rps_minus1 + 1 );
1102 int RefRPSIdx = stRPSIdx - (delta_idx_minus1 + 1);
1105 for (
int j = 0; j <= RefRPS->NumDeltaPocs; ++j)
1107 used_by_curr_pic_flag[j] = br.
get_bits(1);
1118 if (!used_by_curr_pic_flag[j])
1120 use_delta_flag[j] = br.
get_bits(1);
1124 use_delta_flag[j] =
true;
1131 for (
int k = (RefRPS->NumPositivePics - 1); k >= 0; --k)
1133 int dPoc = RefRPS->DeltaPocS1[k] + deltaRPS;
1134 if (dPoc < 0 && use_delta_flag[RefRPS->NumNegativePics + k])
1136 stRPS[stRPSIdx].DeltaPocS0[i] = dPoc;
1137 stRPS[stRPSIdx].UsedByCurrPicS0[i++] =
1138 used_by_curr_pic_flag[RefRPS->NumNegativePics + k];
1142 if (deltaRPS < 0 && use_delta_flag[RefRPS->NumDeltaPocs])
1144 stRPS[stRPSIdx].DeltaPocS0[i] = deltaRPS;
1145 stRPS[stRPSIdx].UsedByCurrPicS0[i++] =
1146 used_by_curr_pic_flag[RefRPS->NumDeltaPocs];
1149 for (
int j = 0; j < RefRPS->NumNegativePics; ++j)
1151 int dPoc = RefRPS->DeltaPocS0[j] + deltaRPS;
1152 if (dPoc < 0 && use_delta_flag[j])
1154 stRPS[stRPSIdx].DeltaPocS0[i] = dPoc;
1155 stRPS[stRPSIdx].UsedByCurrPicS0[i++] = used_by_curr_pic_flag[j];
1158 stRPS[stRPSIdx].NumNegativePics = i;
1161 for (
int k = (RefRPS->NumNegativePics - 1); k >= 0; --k)
1163 int dPoc = RefRPS->DeltaPocS0[k] + deltaRPS;
1164 if (dPoc > 0 && use_delta_flag[k])
1166 stRPS[stRPSIdx].DeltaPocS1[i] = dPoc;
1167 stRPS[stRPSIdx].UsedByCurrPicS1[i++] = used_by_curr_pic_flag[k];
1171 if (deltaRPS > 0 && use_delta_flag[RefRPS->NumDeltaPocs])
1173 stRPS[stRPSIdx].DeltaPocS1[i] = deltaRPS;
1174 stRPS[stRPSIdx].UsedByCurrPicS1[i++] =
1175 used_by_curr_pic_flag[RefRPS->NumDeltaPocs];
1178 for (
int j = 0; j < RefRPS->NumPositivePics; ++j)
1180 int dPoc = RefRPS->DeltaPocS1[j] + deltaRPS;
1181 if (dPoc > 0 && use_delta_flag[RefRPS->NumNegativePics + j])
1183 stRPS[stRPSIdx].DeltaPocS1[i] = dPoc;
1184 stRPS[stRPSIdx].UsedByCurrPicS1[i++] =
1185 used_by_curr_pic_flag[RefRPS->NumNegativePics + j];
1188 stRPS[stRPSIdx].NumPositivePics= i;
1192 stRPS[stRPSIdx].NumNegativePics = std::min((uint8_t)br.
get_ue_golomb(),
1193 max_dec_pic_buffering_minus1);
1194 stRPS[stRPSIdx].NumPositivePics = std::min((uint8_t)br.
get_ue_golomb(),
1195 max_dec_pic_buffering_minus1);
1197 for (i = 0; i < stRPS[stRPSIdx].NumNegativePics; ++i)
1203 stRPS[stRPSIdx].DeltaPocS0[i] = -(delta_poc_s0_minus1[i] + 1);
1205 stRPS[stRPSIdx].DeltaPocS0[i] = stRPS[stRPSIdx].DeltaPocS0[i - 1] -
1206 (delta_poc_s0_minus1[i] + 1);
1208 for (i = 0; i < stRPS[stRPSIdx].NumPositivePics; ++i)
1214 stRPS[stRPSIdx].DeltaPocS1[i] = delta_poc_s1_minus1[i] + 1;
1216 stRPS[stRPSIdx].DeltaPocS1[i] = stRPS[stRPSIdx].DeltaPocS1[i - 1] +
1217 (delta_poc_s1_minus1[i] + 1);
1226 stRPS[stRPSIdx].NumDeltaPocs = stRPS[stRPSIdx].NumNegativePics +
1227 stRPS[stRPSIdx].NumPositivePics;
1239 slice_segment_data(br);
1240 rbsp_slice_segment_trailing_bits(br);
1251 bool dependent_slice_segment_flag =
false;
1261 if (!
m_pps.contains(pps_id))
1263 LOG(VB_RECORD, LOG_DEBUG,
LOC +
1264 QString(
"PPS Id %1 not valid yet. Skipping parsing of slice.")
1275 dependent_slice_segment_flag = br.
get_bits(1);
1280 uint32_t CtbLog2SizeY = MinCbLog2SizeY +
1282 uint32_t CtbSizeY = 1 << CtbLog2SizeY;
1283 uint32_t PicHeightInCtbsY =
1285 static_cast<double>(CtbSizeY));
1286 uint32_t PicWidthInCtbsY =
1288 static_cast<double>(CtbSizeY));
1297 if (!dependent_slice_segment_flag)
1382 (MaxPicOrderCntLsb / 2)))
1389 (MaxPicOrderCntLsb / 2)))
1401 LOG(VB_RECORD, LOG_INFO,
LOC +
1402 QString(
"picOrderCntVal: %1 = %2 + %3")
1405 .arg(slice_pic_order_cnt_lsb));
1411 if (!short_term_ref_pic_set_sps_flag)
1415 else if(num_short_term_ref_pic_sets > 1)
1419 if (long_term_ref_pics_present_flag)
1421 if (num_long_term_ref_pics_sps > 0)
1426 for (i = 0; i < num_long_term_sps + num_long_term_pics; ++i)
1428 if (i < num_long_term_sps)
1430 if (num_long_term_ref_pics_sps > 1)
1436 br.
get_bits(sps->Log2MaxPicOrderCntLsb);
1440 if (delta_poc_msb_present_flag[i])
1446 if (sps_temporal_mvp_enabled_flag)
1453 if (sample_adaptive_offset_enabled_flag)
1456 if (ChromaArrayType != 0)
1461 if (slice_type == P || slice_type == B)
1464 if (num_ref_idx_active_override_flag)
1467 if (slice_type == B)
1472 if (lists_modification_present_flag && NumPicTotalCurr > 1)
1474 ref_pic_lists_modification();
1475 if (slice_type == B)
1480 if (cabac_init_present_flag)
1484 if (slice_temporal_mvp_enabled_flag)
1486 if (slice_type == B)
1490 if (( collocated_from_l0_flag &&
1491 num_ref_idx_l0_active_minus1 > 0) ||
1492 (!collocated_from_l0_flag &&
1493 num_ref_idx_l1_active_minus1 > 0))
1498 if ((weighted_pred_flag && slice_type == P) ||
1499 (weighted_bipred_flag && slice_type == B))
1501 pred_weight_table();
1504 if (motion_vector_resolution_control_idc == 2)
1510 if (pps_slice_chroma_qp_offsets_present_flag)
1515 if (pps_slice_act_qp_offsets_present_flag)
1521 if (chroma_qp_offset_list_enabled_flag)
1525 if (deblocking_filter_override_enabled_flag)
1529 if (deblocking_filter_override_flag)
1532 if (!slice_deblocking_filter_disabled_flag)
1538 if (pps_loop_filter_across_slices_enabled_flag &&
1539 ( slice_sao_luma_flag || slice_sao_chroma_flag ||
1540 !slice_deblocking_filter_disabled_flag))
1547 if (tiles_enabled_flag || entropy_coding_sync_enabled_flag)
1550 if (num_entry_point_offsets > 0)
1553 for (i = 0; i < num_entry_point_offsets; ++i)
1559 if (slice_segment_header_extension_present_flag)
1562 for (i = 0; i < slice_segment_header_extension_length; ++i)
1564 slice_segment_header_extension_data_byte[i];
1579 static std::array<ShortTermRefPicSet,65> short_term_ref_pic_set;
1581 static uint sub_layer_size = 0;
1582 static uint8_t* max_dec_pic_buffering_minus1 =
nullptr;
1589 uint max_sub_layers_minus1 = 0;
1593 max_sub_layers_minus1 = ext_or_max_sub_layers_minus1;
1597 if (!
m_vps.contains(vps_id))
1599 LOG(VB_RECORD, LOG_WARNING,
LOC +
1600 QString(
"Could not find VPS[%1]").arg(vps_id));
1601 max_sub_layers_minus1 = ext_or_max_sub_layers_minus1;
1611 max_sub_layers_minus1 = (ext_or_max_sub_layers_minus1 == 7) ?
1612 m_vps[vps_id].max_sub_layers :
1613 ext_or_max_sub_layers_minus1;
1617 if (sub_layer_size <= max_sub_layers_minus1)
1619 delete[] max_dec_pic_buffering_minus1;
1620 sub_layer_size = max_sub_layers_minus1 + 1;
1621 max_dec_pic_buffering_minus1 =
new uint8_t[sub_layer_size];
1624 bool MultiLayerExtSpsFlag =
1625 (
m_nuhLayerId != 0 && ext_or_max_sub_layers_minus1 == 7);
1627 if (!MultiLayerExtSpsFlag)
1632 LOG(VB_RECORD, LOG_WARNING,
LOC +
1633 QString(
"Failed to parse SPS profiel tier level."));
1641 if (MultiLayerExtSpsFlag)
1701 LOG(VB_RECORD, LOG_WARNING,
LOC +
1702 QString(
"SPS log2_max_pic_order_cnt_lsb %1 > 16")
1710 max_sub_layers_minus1); i <= max_sub_layers_minus1; ++i)
1713 if (max_dec_pic_buffering_minus1[i] > 16)
1715 LOG(VB_RECORD, LOG_WARNING,
LOC +
1716 QString(
"max_dec_pic_bufering_minus1[%1] %2 > 16")
1718 .arg(max_dec_pic_buffering_minus1[i]));
1727 if (!sps_sub_layer_ordering_info_present_flag && sps_max_sub_layers_minus1)
1729 for (i = 0; i <= (sps_max_sub_layers_minus1 - 1); ++i)
1731 max_dec_pic_buffering_minus1[i] =
1732 max_dec_pic_buffering_minus1[sps_max_sub_layers_minus1];
1733 max_num_reorder_pics[i] =
1734 max_num_reorder_pics[sps_max_sub_layers_minus1];
1735 max_latency_increase_plus1[i] =
1736 max_latency_increase_plus1[sps_max_sub_layers_minus1];
1754 bool sps_infer_scaling_list_flag = MultiLayerExtSpsFlag ?
1756 if (sps_infer_scaling_list_flag)
1779 if (num_short_term_ref_pic_sets > short_term_ref_pic_set.size() - 1 )
1781 LOG(VB_RECORD, LOG_WARNING,
LOC +
1782 QString(
"num_short_term_ref_pic_sets %1 > 64")
1783 .arg(num_short_term_ref_pic_sets));
1784 num_short_term_ref_pic_sets = short_term_ref_pic_set.size() - 1;
1786 for(i = 0; i < num_short_term_ref_pic_sets; ++i)
1789 short_term_ref_pic_set,
1790 max_dec_pic_buffering_minus1[max_sub_layers_minus1]))
1799 for (i = 0; i < num_long_term_ref_pics_sps; ++i)
1809 LOG(VB_RECORD, LOG_WARNING,
LOC +
1810 QString(
"POC[%1] %2").arg(i).arg(
m_poc[i]));
1843 uint8_t max_sub_layers_minus1 = br.
get_bits(3);
1848 m_vps[vps_id].max_sub_layers = max_sub_layers_minus1 + 1;
1851 LOG(VB_RECORD, LOG_WARNING,
LOC +
1852 QString(
"Failed to parse VPS profile tier level."));
1856 bool vps_sub_layer_ordering_info_present_flag = br.
get_bits(1);
1857 for (i = (vps_sub_layer_ordering_info_present_flag ? 0 :
1858 max_sub_layers_minus1);
1859 i <= max_sub_layers_minus1; ++i)
1869 if (!vps_sub_layer_ordering_info_present_flag &&
1870 max_sub_layers_minus1)
1872 for (i = 0; i <= (max_sub_layers_minus1 - 1); ++i)
1874 max_dec_pic_buffering_minus1[i] =
1875 max_dec_pic_buffering_minus1[max_sub_layers_minus1];
1876 max_num_reorder_pics[i] =
1877 max_num_reorder_pics[max_sub_layers_minus1];
1878 max_latency_increase_plus1[i] =
1879 max_latency_increase_plus1[max_sub_layers_minus1];
1884 uint8_t vps_max_layer_id = br.
get_bits(6);
1886 for (i = 1; i <= vps_num_layer_sets_minus1; ++i)
1888 for (
int j = 0; j <= vps_max_layer_id; ++j)
1893 if (vps_num_layer_sets_minus1 < 0)
1895 LOG(VB_RECORD, LOG_WARNING,
LOC +
1896 QString(
"vps_num_layer_sets_minus1 %1 < 0")
1897 .arg(vps_num_layer_sets_minus1));
1927 LOG(VB_RECORD, LOG_DEBUG,
1928 QString(
"VUI unitsInTick %1 timeScale %2 fixedRate %3")
1935 for (i = 0; i < vps_num_hrd_parameters; ++i)
1939 cprms_present_flag[i] = br.
get_bits(1);
1940 hrd_parameters(cprms_present_flag[i], max_sub_layers_minus1);
1946 bool vps_extension_flag = br.
get_bits(1);
1947 if (vps_extension_flag)
1949 while (!byte_aligned())
1954 vps_extension2_flag = br.
get_bits(1);
1955 if (vps_extension2_flag)
1957 while (more_rbsp_data())
1961 rbsp_trailing_bits();
1980 sign_data_hiding_enabled_flag;
1981 cabac_init_present_flag;
1982 num_ref_idx_l0_default_active_minus1;
1983 num_ref_idx_l1_default_active_minus1;
1985 constrained_intra_pred_flag;
1986 transform_skip_enabled_flag;
1987 cu_qp_delta_enabled_flag;
1988 if( cu_qp_delta_enabled_flag )
1989 diff_cu_qp_delta_depth;
1992 pps_slice_chroma_qp_offsets_present_flag;
1994 weighted_bipred_flag;
1995 transquant_bypass_enabled_flag;
1997 entropy_coding_sync_enabled_flag;
1998 if( tiles_enabled_flag ) {
1999 num_tile_columns_minus1;
2000 num_tile_rows_minus1;
2001 uniform_spacing_flag;
2002 if( !uniform_spacing_flag ) {
2003 for( i = 0; i < num_tile_columns_minus1; i++ )
2004 column_width_minus1[ i ];
2005 for( i = 0; i < num_tile_rows_minus1; i++ )
2006 row_height_minus1[ i ];
2008 loop_filter_across_tiles_enabled_flag;
2009 pps_loop_filter_across_slices_enabled_flag;
2010 deblocking_filter_control_present_flag;
2011 if( deblocking_filter_control_present_flag ) {
2013 deblocking_filter_override_enabled_flag;
2014 pps_deblocking_filter_disabled_flag;
2015 if( !pps_deblocking_filter_disabled_flag ) {
2016 pps_beta_offset_div2;
2020 pps_scaling_list_data_present_flag;
2021 if( pps_scaling_list_data_present_flag )
2022 scaling_list_data( );
2023 lists_modification_present_flag;
2024 log2_parallel_merge_level_minus2;
2025 slice_segment_header_extension_present_flag;
2026 pps_extension_present_flag;
2027 if( pps_extension_present_flag ) {
2028 pps_range_extension_flag;
2029 pps_multilayer_extension_flag;
2030 pps_3d_extension_flag;
2031 pps_scc_extension_flag;
2032 pps_extension_4bits;
2034 if( pps_range_extension_flag )
2035 pps_range_extension( );
2036 if( pps_multilayer_extension_flag )
2037 pps_multilayer_extension( );
2038 if( pps_3d_extension_flag )
2039 pps_3d_extension( );
2040 if( pps_scc_extension_flag )
2041 pps_scc_extension( );
2042 if( pps_extension_4bits )
2043 while( more_rbsp_data( ) )
2044 pps_extension_data_flag;
2045 rbsp_trailing_bits( )
2054 static const std::array<const uint8_t,5> subwc {1, 2, 2, 1, 1};
2065 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