+static inline void add_metadata(AVFrame *insamples, const char *key, char *value)
+{
+ char buf[128];
+
+ snprintf(buf, sizeof(buf), "lavfi.aphasemeter.%s", key);
+ av_dict_set(&insamples->metadata, buf, value, 0);
+}
+
+static inline void update_mono_detection(AudioPhaseMeterContext *s, AVFrame *insamples, int mono_measurement)
+{
+ int64_t mono_duration;
+ if (!s->is_mono && mono_measurement) {
+ s->is_mono = 1;
+ s->start_mono_presence = 1;
+ s->mono_idx[0] = insamples->pts;
+ }
+ if (s->is_mono && mono_measurement && s->start_mono_presence) {
+ s->mono_idx[1] = s->frame_end;
+ mono_duration = get_duration(s->mono_idx);
+ if (mono_duration >= s->duration) {
+ add_metadata(insamples, "mono_start", av_ts2timestr(s->mono_idx[0], &s->time_base));
+ av_log(s, AV_LOG_INFO, "mono_start: %s\n", av_ts2timestr(s->mono_idx[0], &s->time_base));
+ s->start_mono_presence = 0;
+ }
+ }
+ if (s->is_mono && !mono_measurement) {
+ s->mono_idx[1] = insamples ? insamples->pts : s->frame_end;
+ mono_duration = get_duration(s->mono_idx);
+ if (mono_duration >= s->duration) {
+ if (insamples) {
+ add_metadata(insamples, "mono_end", av_ts2timestr(s->mono_idx[1], &s->time_base));
+ add_metadata(insamples, "mono_duration", av_ts2timestr(mono_duration, &s->time_base));
+ }
+ av_log(s, AV_LOG_INFO, "mono_end: %s | mono_duration: %s\n", av_ts2timestr(s->mono_idx[1], &s->time_base), av_ts2timestr(mono_duration, &s->time_base));
+ }
+ s->is_mono = 0;
+ }
+}
+
+static inline void update_out_phase_detection(AudioPhaseMeterContext *s, AVFrame *insamples, int out_phase_measurement)
+{
+ int64_t out_phase_duration;
+ if (!s->is_out_phase && out_phase_measurement) {
+ s->is_out_phase = 1;
+ s->start_out_phase_presence = 1;
+ s->out_phase_idx[0] = insamples->pts;
+ }
+ if (s->is_out_phase && out_phase_measurement && s->start_out_phase_presence) {
+ s->out_phase_idx[1] = s->frame_end;
+ out_phase_duration = get_duration(s->out_phase_idx);
+ if (out_phase_duration >= s->duration) {
+ add_metadata(insamples, "out_phase_start", av_ts2timestr(s->out_phase_idx[0], &s->time_base));
+ av_log(s, AV_LOG_INFO, "out_phase_start: %s\n", av_ts2timestr(s->out_phase_idx[0], &s->time_base));
+ s->start_out_phase_presence = 0;
+ }
+ }
+ if (s->is_out_phase && !out_phase_measurement) {
+ s->out_phase_idx[1] = insamples ? insamples->pts : s->frame_end;
+ out_phase_duration = get_duration(s->out_phase_idx);
+ if (out_phase_duration >= s->duration) {
+ if (insamples) {
+ add_metadata(insamples, "out_phase_end", av_ts2timestr(s->out_phase_idx[1], &s->time_base));
+ add_metadata(insamples, "out_phase_duration", av_ts2timestr(out_phase_duration, &s->time_base));
+ }
+ av_log(s, AV_LOG_INFO, "out_phase_end: %s | out_phase_duration: %s\n", av_ts2timestr(s->out_phase_idx[1], &s->time_base), av_ts2timestr(out_phase_duration, &s->time_base));
+ }
+ s->is_out_phase = 0;
+ }
+}
+