@@ -844,21 +844,23 @@ static MixGainUnit *iamf_database_parameter_get_mix_gain_unit(
844844 uint64_t start = 0 ;
845845 float ratio = 1.f ;
846846 int use_default = 0 ;
847+ uint64_t tsf_parameter_timestamp = 0 ;
847848
848849 pi = iamf_database_parameter_viewer_get_item (& db -> pViewer , pid );
849850 if (!pi ) return 0 ;
850851
851- ia_logd ("pts %" PRIu64 ", duration %d, parameter id %" PRIu64 ", pts %" PRIu64
852- ", duration %" PRId64 ,
853- pt , duration , pid , pi -> timestamp , pi -> duration );
854- if (pt < pi -> timestamp ) {
852+ tsf_parameter_timestamp = time_transform (pi -> timestamp , pi -> rate , rate );
853+ ia_logd ("pts %" PRIu64 ", duration %d, rate %d, parameter id %" PRIu64
854+ ", pts %" PRIu64 ", duration %" PRId64 ", rate %d" ,
855+ pt , duration , rate , pid , pi -> timestamp , pi -> duration , pi -> rate );
856+ if (pt < tsf_parameter_timestamp ) {
855857 ia_logw ("Don't receive mix gain parameter %" PRIu64 " at %" PRIu64
856858 ", current parameter at "
857859 "%" PRIu64 ,
858- pi -> id , pt , pi -> timestamp );
860+ pi -> id , pt , tsf_parameter_timestamp );
859861 use_default = 1 ;
860862 } else
861- start = pt - pi -> timestamp ;
863+ start = pt - tsf_parameter_timestamp ;
862864
863865 mgu = IAMF_MALLOCZ (MixGainUnit , 1 );
864866 if (!mgu ) return 0 ;
@@ -2360,11 +2362,15 @@ static int iamf_stream_decoder_update_parameter(IAMF_StreamDecoder *dec,
23602362 if (pi -> type == IAMF_PARAMETER_TYPE_DEMIXING ) {
23612363 ChannelLayerContext * ctx = (ChannelLayerContext * )s -> priv ;
23622364 ctx -> dmx_mode = iamf_database_parameter_get_demix_mode (
2363- db , pid , s -> timestamp + dec -> frame_size / 2 );
2365+ db , pid ,
2366+ time_transform (s -> timestamp + dec -> frame_size / 2 , s -> sampling_rate ,
2367+ pi -> rate ));
23642368 ia_logd ("update demix mode %d" , ctx -> dmx_mode );
23652369 } else if (pi -> type == IAMF_PARAMETER_TYPE_RECON_GAIN ) {
23662370 ReconGainList * recon = iamf_database_parameter_get_recon_gain_list (
2367- db , pid , s -> timestamp + dec -> frame_size / 2 );
2371+ db , pid ,
2372+ time_transform (s -> timestamp + dec -> frame_size / 2 , s -> sampling_rate ,
2373+ pi -> rate ));
23682374 ia_logd ("update recon %p" , recon );
23692375 if (recon ) iamf_stream_scale_decoder_update_recon_gain (dec , recon );
23702376 }
@@ -3401,6 +3407,7 @@ static int iamf_decoder_timestamp_sync(IAMF_DecoderHandle handle,
34013407 Viewer * pv = & db -> pViewer ;
34023408 ParameterItem * pi ;
34033409 uint64_t ref_timestamp = timestamp ;
3410+ uint64_t tsf_timestamp = 0 ;
34043411
34053412 if (!timestamp ) return IAMF_OK ;
34063413
@@ -3409,18 +3416,14 @@ static int iamf_decoder_timestamp_sync(IAMF_DecoderHandle handle,
34093416 for (int i = 0 ; i < pv -> count ; ++ i ) {
34103417 pi = (ParameterItem * )pv -> items [i ];
34113418 if (!pi ) continue ;
3419+ tsf_timestamp = time_transform (timestamp , rate , pi -> rate );
34123420 if (!pi -> timestamp ) {
3413- if (pi -> rate != rate ) {
3414- ia_logw ("Difference rate between parameter (%" PRIu64
3415- ") and reference ( %d vs %d )" ,
3416- pi -> id , pi -> rate , rate );
3417- continue ;
3418- }
3419- pi -> timestamp = timestamp ;
3421+ pi -> timestamp = tsf_timestamp ;
34203422 ia_logi ("Parameter (%" PRIu64 ") timestamp sync to %" PRIu64 , pi -> id ,
34213423 timestamp );
34223424 if (ref_timestamp != timestamp ) {
3423- iamf_parameter_item_fill_segment (pi , ref_timestamp - timestamp );
3425+ iamf_parameter_item_fill_segment (
3426+ pi , time_transform (ref_timestamp - timestamp , rate , pi -> rate ));
34243427 }
34253428 } else
34263429 ia_logi ("Parameter (%" PRIu64 ") timestamp %" PRIu64 , pi -> id ,
@@ -3499,7 +3502,8 @@ static int iamf_decoder_enable_mix_presentation(IAMF_DecoderHandle handle,
34993502 iamf_parameter_item_enable (pi , 1 );
35003503 else
35013504 iamf_database_parameter_add_item (db , elem -> parameters [k ],
3502- elem -> element_id , rate );
3505+ elem -> element_id ,
3506+ elem -> parameters [k ]-> rate );
35033507 }
35043508
35053509 pid = sub -> conf_s [i ].element_mix_gain .base .id ;
@@ -3508,8 +3512,8 @@ static int iamf_decoder_enable_mix_presentation(IAMF_DecoderHandle handle,
35083512 if (pi )
35093513 iamf_parameter_item_enable (pi , 1 );
35103514 else if (iamf_database_parameter_add_item (
3511- db , & sub -> conf_s [i ].element_mix_gain .base , INVALID_ID , rate ) ==
3512- IAMF_OK ) {
3515+ db , & sub -> conf_s [i ].element_mix_gain .base , INVALID_ID ,
3516+ sub -> conf_s [ i ]. element_mix_gain . base . rate ) == IAMF_OK ) {
35133517 float gain_db ;
35143518 pi = iamf_database_parameter_get_item (db , pid );
35153519 gain_db = q_to_float (sub -> conf_s [i ].element_mix_gain .mix_gain , 8 );
@@ -3536,9 +3540,9 @@ static int iamf_decoder_enable_mix_presentation(IAMF_DecoderHandle handle,
35363540 pi = iamf_database_parameter_get_item (db , pid );
35373541 if (pi )
35383542 iamf_parameter_item_enable (pi , 1 );
3539- else if (iamf_database_parameter_add_item (db , & sub -> output_mix_gain . base ,
3540- INVALID_ID ,
3541- ctx -> sampling_rate ) == IAMF_OK ) {
3543+ else if (iamf_database_parameter_add_item (
3544+ db , & sub -> output_mix_gain . base , INVALID_ID ,
3545+ sub -> output_mix_gain . base . rate ) == IAMF_OK ) {
35423546 float gain_db ;
35433547 pi = iamf_database_parameter_get_item (db , pid );
35443548 gain_db = q_to_float (sub -> output_mix_gain .mix_gain , 8 );
0 commit comments