From a54ece89dab24a06c46ac4c54b420d84e0fd59d7 Mon Sep 17 00:00:00 2001 From: Sees <vsevolod.egorov@vicuesoft.com> Date: Wed, 5 Apr 2023 21:05:12 +0300 Subject: [PATCH] Fix parsing of MAI SEI message 1. Call resizeArrays() after intrinsic_params_equal_flag is read 2. Expect that length of mantissas can be equal to 0 --- source/Lib/DecoderLib/SEIread.cpp | 72 +++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp index d9aed5b276..b254a4c0d9 100644 --- a/source/Lib/DecoderLib/SEIread.cpp +++ b/source/Lib/DecoderLib/SEIread.cpp @@ -2418,10 +2418,10 @@ void SEIReader::xParseSEIMultiviewAcquisitionInfo(SEIMultiviewAcquisitionInfo& s sei_read_flag( pDecodedMessageOutputStream, val, "intrinsic_param_flag" ); sei.m_maiIntrinsicParamFlag = (val == 1); sei_read_flag( pDecodedMessageOutputStream, val, "extrinsic_param_flag" ); sei.m_maiExtrinsicParamFlag = (val == 1); sei_read_uvlc( pDecodedMessageOutputStream, val, "num_views_minus1" ); sei.m_maiNumViewsMinus1 = val ; - sei.resizeArrays( ); if( sei.m_maiIntrinsicParamFlag ) { sei_read_flag( pDecodedMessageOutputStream, val, "intrinsic_params_equal_flag" ); sei.m_maiIntrinsicParamsEqualFlag = (val == 1); + sei.resizeArrays( ); sei_read_uvlc( pDecodedMessageOutputStream, val, "prec_focal_length" ); sei.m_maiPrecFocalLength = val ; sei_read_uvlc( pDecodedMessageOutputStream, val, "prec_principal_point" ); sei.m_maiPrecPrincipalPoint = val ; sei_read_uvlc( pDecodedMessageOutputStream, val, "prec_skew_factor" ); sei.m_maiPrecSkewFactor = val ; @@ -2430,19 +2430,59 @@ void SEIReader::xParseSEIMultiviewAcquisitionInfo(SEIMultiviewAcquisitionInfo& s { sei_read_flag( pDecodedMessageOutputStream, val, "sign_focal_length_x" ); sei.m_maiSignFocalLengthX [i] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_focal_length_x" ); sei.m_maiExponentFocalLengthX [i] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaFocalLengthXLen ( i ), val, "mantissa_focal_length_x" ); sei.m_maiMantissaFocalLengthX [i] = val ; + if (sei.getMantissaFocalLengthXLen( i ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaFocalLengthXLen( i ), val, "mantissa_focal_length_x" ); + sei.m_maiMantissaFocalLengthX[i] = val; + } + else + { + sei.m_maiMantissaFocalLengthX[i] = 0; + } sei_read_flag( pDecodedMessageOutputStream, val, "sign_focal_length_y" ); sei.m_maiSignFocalLengthY [i] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_focal_length_y" ); sei.m_maiExponentFocalLengthY [i] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaFocalLengthYLen ( i ), val, "mantissa_focal_length_y" ); sei.m_maiMantissaFocalLengthY [i] = val ; + if (sei.getMantissaFocalLengthYLen( i ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaFocalLengthYLen( i ), val, "mantissa_focal_length_y"); + sei.m_maiMantissaFocalLengthY[i] = val; + } + else + { + sei.m_maiMantissaFocalLengthY [i] = 0; + } sei_read_flag( pDecodedMessageOutputStream, val, "sign_principal_point_x" ); sei.m_maiSignPrincipalPointX [i] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_principal_point_x" ); sei.m_maiExponentPrincipalPointX[i] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaPrincipalPointXLen( i ), val, "mantissa_principal_point_x" ); sei.m_maiMantissaPrincipalPointX[i] = val ; + if (sei.getMantissaPrincipalPointXLen( i ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaPrincipalPointXLen( i ), val, "mantissa_principal_point_x" ); + sei.m_maiMantissaPrincipalPointX[i] = val; + } + else + { + sei.m_maiMantissaPrincipalPointX[i] = 0; + } sei_read_flag( pDecodedMessageOutputStream, val, "sign_principal_point_y" ); sei.m_maiSignPrincipalPointY [i] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_principal_point_y" ); sei.m_maiExponentPrincipalPointY[i] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaPrincipalPointYLen( i ), val, "mantissa_principal_point_y" ); sei.m_maiMantissaPrincipalPointY[i] = val ; + if (sei.getMantissaPrincipalPointYLen( i ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaPrincipalPointYLen( i ), val, "mantissa_principal_point_y" ); + sei.m_maiMantissaPrincipalPointY[i] = val; + } + else + { + sei.m_maiMantissaPrincipalPointY[i] = 0; + } sei_read_flag( pDecodedMessageOutputStream, val, "sign_skew_factor" ); sei.m_maiSignSkewFactor [i] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_skew_factor" ); sei.m_maiExponentSkewFactor [i] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaSkewFactorLen ( i ), val, "mantissa_skew_factor" ); sei.m_maiMantissaSkewFactor [i] = val ; + if (sei.getMantissaSkewFactorLen( i ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaSkewFactorLen( i ), val, "mantissa_skew_factor" ); + sei.m_maiMantissaSkewFactor[i] = val; + } + else + { + sei.m_maiMantissaSkewFactor[i] = 0; + } } } if( sei.m_maiExtrinsicParamFlag ) @@ -2458,11 +2498,27 @@ void SEIReader::xParseSEIMultiviewAcquisitionInfo(SEIMultiviewAcquisitionInfo& s { sei_read_flag( pDecodedMessageOutputStream, val, "sign_r" ); sei.m_maiSignR [i][j][k] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_r" ); sei.m_maiExponentR[i][j][k] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaRLen( i, j, k ), val, "mantissa_r" ); sei.m_maiMantissaR[i][j][k] = val ; + if (sei.getMantissaRLen( i, j, k ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaRLen( i, j, k ), val, "mantissa_r" ); + sei.m_maiMantissaR[i][j][k] = val; + } + else + { + sei.m_maiMantissaR[i][j][k] = 0; + } } sei_read_flag( pDecodedMessageOutputStream, val, "sign_t" ); sei.m_maiSignT [i][j] = (val == 1); sei_read_code( pDecodedMessageOutputStream, 6, val, "exponent_t" ); sei.m_maiExponentT[i][j] = val ; - sei_read_code( pDecodedMessageOutputStream, sei.getMantissaTLen( i, j ), val, "mantissa_t" ); sei.m_maiMantissaT[i][j] = val ; + if (sei.getMantissaTLen( i, j ) != 0) + { + sei_read_code( pDecodedMessageOutputStream, sei.getMantissaTLen( i, j ), val, "mantissa_t" ); + sei.m_maiMantissaT[i][j] = val; + } + else + { + sei.m_maiMantissaT[i][j] = 0; + } } } } -- GitLab