Skip to content

Commit be1b1bf

Browse files
authored
Merge pull request #137 from yilun-zhangs/Parameter-Rate
fix the case that parameter and substream have different rate
2 parents 526f4b1 + 77f1a9a commit be1b1bf

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

code/src/iamf_dec/IAMF_decoder.c

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)