Skip to content

Commit

Permalink
fixed potential fps signaling bug in nalu reframer
Browse files Browse the repository at this point in the history
  • Loading branch information
jeanlf committed Dec 6, 2023
1 parent fe6bb7b commit eca3eb6
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 15 deletions.
33 changes: 20 additions & 13 deletions src/filter_core/filter_pid.c
Expand Up @@ -954,6 +954,7 @@ static GF_Err gf_filter_pid_configure(GF_Filter *filter, GF_FilterPid *pid, GF_P

//destroy pid instance
gf_filter_pid_inst_del(pidinst);
pidinst = NULL;
gf_mx_v(pid->filter->tasks_mx);
}

Expand Down Expand Up @@ -1073,10 +1074,12 @@ static GF_Err gf_filter_pid_configure(GF_Filter *filter, GF_FilterPid *pid, GF_P
if (filter->swap_pidinst_dst->props) {
GF_FilterPidInst *swap_pidi = filter->swap_pidinst_dst;
if (safe_int_dec(&swap_pidi->props->reference_count)==0) {
gf_mx_p(swap_pidi->pid->filter->tasks_mx);
gf_list_del_item(swap_pidi->pid->properties, pidinst->props);
gf_mx_v(swap_pidi->pid->filter->tasks_mx);
gf_props_del(pidinst->props);
if (pidinst) {
gf_mx_p(swap_pidi->pid->filter->tasks_mx);
gf_list_del_item(swap_pidi->pid->properties, pidinst->props);
gf_mx_v(swap_pidi->pid->filter->tasks_mx);
gf_props_del(pidinst->props);
}
}
filter->swap_pidinst_dst->props = NULL;
}
Expand Down Expand Up @@ -1126,7 +1129,8 @@ static GF_Err gf_filter_pid_configure(GF_Filter *filter, GF_FilterPid *pid, GF_P

if (ctype==GF_PID_CONF_REMOVE) {
gf_mx_p(filter->tasks_mx);
gf_list_del_item(filter->input_pids, pidinst);
if (pidinst)
gf_list_del_item(filter->input_pids, pidinst);
filter->num_input_pids = gf_list_count(filter->input_pids);
if (!filter->num_input_pids)
filter->single_source = NULL;
Expand All @@ -1138,20 +1142,23 @@ static GF_Err gf_filter_pid_configure(GF_Filter *filter, GF_FilterPid *pid, GF_P
//on the first gf_filter_pid_inst_delete_task executed.
//we therefore track at the PID level the number of gf_filter_pid_inst_delete_task tasks pending and
//won't destroy the PID until that number is O
gf_mx_p(pidinst->pid->filter->tasks_mx);
pidinst->pid->num_pidinst_del_pending ++;
gf_list_del_item(pidinst->pid->destinations, pidinst);
pidinst->pid->num_destinations = gf_list_count(pidinst->pid->destinations);
gf_filter_instance_detach_pid(pidinst);
gf_mx_v(pidinst->pid->filter->tasks_mx);
if (pidinst) {
gf_mx_p(pidinst->pid->filter->tasks_mx);
pidinst->pid->num_pidinst_del_pending ++;
gf_list_del_item(pidinst->pid->destinations, pidinst);
pidinst->pid->num_destinations = gf_list_count(pidinst->pid->destinations);
gf_filter_instance_detach_pid(pidinst);
gf_mx_v(pidinst->pid->filter->tasks_mx);
}

//disconnected the last input, flag as removed
if (!filter->num_input_pids && !filter->sticky) {
gf_filter_reset_pending_packets(filter);
filter->removed = 1;
}
//post a pid_delete task to also trigger removal of the filter if needed
gf_fs_post_task(filter->session, gf_filter_pid_inst_delete_task, pid->filter, pid, "pid_inst_delete", pidinst);
if (pidinst)
gf_fs_post_task(filter->session, gf_filter_pid_inst_delete_task, pid->filter, pid, "pid_inst_delete", pidinst);

return e;
}
Expand All @@ -1162,7 +1169,7 @@ static GF_Err gf_filter_pid_configure(GF_Filter *filter, GF_FilterPid *pid, GF_P

//we must resent play/pause events when a new pid is reattached to an old pid instance
//in case one of the injected filter(s) monitors play state of the pids (eg reframers)
if (refire_events) {
if (refire_events && pidinst) {
GF_FilterEvent evt;
if (pidinst->is_playing) {
pidinst->is_playing = GF_FALSE;
Expand Down
5 changes: 4 additions & 1 deletion src/filters/ff_enc.c
Expand Up @@ -1755,7 +1755,7 @@ static GF_Err ffenc_configure_pid_ex(GF_Filter *filter, GF_FilterPid *pid, Bool
ctx->timescale = ctx->encoder->time_base.den = prop ? prop->value.uint : 1000;

prop = gf_filter_pid_get_property(pid, GF_PROP_PID_FPS);
if (prop) {
if (prop && prop->value.frac.den) {
Bool reset_gop = GF_FALSE;
//don't write gop info for these codecs, unless ctx->gop_size is set (done later)
if (codec_id==AV_CODEC_ID_FFV1) reset_gop = GF_TRUE;
Expand Down Expand Up @@ -1864,6 +1864,9 @@ static GF_Err ffenc_configure_pid_ex(GF_Filter *filter, GF_FilterPid *pid, Bool
ctx->encoder->pix_fmt = ctx->pixel_fmt;
ctx->init_cts_setup = GF_TRUE;
ctx->frame->format = ctx->encoder->pix_fmt;

if (ctx->codecid==GF_CODECID_AV1)
av_dict_set(&ctx->options, "strict", "experimental", 0);
} else if (type==GF_STREAM_AUDIO) {
ctx->encoder->sample_rate = ctx->sample_rate;
ctx->encoder->channels = ctx->channels;
Expand Down
7 changes: 6 additions & 1 deletion src/filters/reframe_nalu.c
Expand Up @@ -2984,8 +2984,13 @@ static void naldmx_switch_timestamps(GF_NALUDmxCtx *ctx, GF_FilterPacket *pck)
ctx->prev_cts -= 3000;
ctx->prev_cts += diff;
}
} else if (ctx->cur_fps.den > diff)
if (!gf_filter_pid_get_property(ctx->ipid, GF_PROP_PID_FPS))
gf_filter_pid_set_property(ctx->opid, GF_PROP_PID_FPS, & PROP_FRAC(ctx->cur_fps));
} else if (ctx->cur_fps.den > diff) {
ctx->cur_fps.den = (u32) diff;
if (!gf_filter_pid_get_property(ctx->ipid, GF_PROP_PID_FPS))
gf_filter_pid_set_property(ctx->opid, GF_PROP_PID_FPS, & PROP_FRAC(ctx->cur_fps));
}

ctx->prev_dts = ts;
}
Expand Down

0 comments on commit eca3eb6

Please sign in to comment.