66#define MAX_DURATION (24*60*60*1000000LL)
67#define OFFSET(x) offsetof(AudioPhaseMeterContext, x)
68#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
69#define get_duration(index) (index[1] - index[0])
81 {
"phasing",
"set mono and out-of-phase detection output",
OFFSET(do_phasing_detection),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
FLAGS },
103 { .nb_channels = 0 },
151 if (!strcmp(
s->mpc_str,
"none"))
152 s->draw_median_phase = 0;
154 s->draw_median_phase = 1;
161static inline int get_x(
float phase,
int w)
163 return (phase + 1.f) / 2.f * (
w - 1.f);
170 snprintf(buf,
sizeof(buf),
"lavfi.aphasemeter.%s",
key);
178 if (!
s->is_mono && mono_measurement) {
180 s->start_mono_presence = 1;
181 s->mono_idx[0] = insamples->
pts;
183 if (
s->is_mono && mono_measurement &&
s->start_mono_presence) {
184 s->mono_idx[1] =
s->frame_end;
186 if (mono_duration >=
s->duration) {
189 s->start_mono_presence = 0;
192 if (
s->is_mono && !mono_measurement) {
193 s->mono_idx[1] = insamples ? insamples->
pts :
s->frame_end;
195 if (mono_duration >=
s->duration) {
210 if (!
s->is_out_phase && out_phase_measurement) {
212 s->start_out_phase_presence = 1;
213 s->out_phase_idx[0] = insamples->
pts;
215 if (
s->is_out_phase && out_phase_measurement &&
s->start_out_phase_presence) {
216 s->out_phase_idx[1] =
s->frame_end;
218 if (out_phase_duration >=
s->duration) {
221 s->start_out_phase_presence = 0;
224 if (
s->is_out_phase && !out_phase_measurement) {
225 s->out_phase_idx[1] = insamples ? insamples->
pts :
s->frame_end;
227 if (out_phase_duration >=
s->duration) {
245 const int rc =
s->contrast[0];
246 const int gc =
s->contrast[1];
247 const int bc =
s->contrast[2];
252 int mono_measurement;
253 int out_phase_measurement;
254 float tolerance = 1.0f -
s->tolerance;
258 if (
s->do_video && (!
s->out ||
s->out->width != outlink->
w ||
259 s->out->height != outlink->
h)) {
268 for (
i = 0;
i < outlink->
h;
i++)
269 memset(
out->data[0] +
i *
out->linesize[0], 0, outlink->
w * 4);
270 }
else if (
s->do_video) {
275 for (
i = outlink->
h - 1;
i >= 10;
i--)
276 memmove(
out->data[0] + (
i ) *
out->linesize[0],
277 out->data[0] + (
i-1) *
out->linesize[0],
279 for (
i = 0;
i < outlink->
w;
i++)
284 const float *
src = (
float *)in->
data[0] +
i * 2;
286 const float phase =
isnan(
f) ? 1 :
f;
287 const int x =
get_x(phase,
s->w);
290 dst =
out->data[0] + x * 4;
302 if (
s->draw_median_phase) {
307 for (
i = 1;
i < 10 &&
i < outlink->
h;
i++)
308 memcpy(
out->data[0] +
i *
out->linesize[0],
out->data[0], outlink->
w * 4);
319 if (
s->do_phasing_detection) {
324 mono_measurement = (tolerance - fphase) < FLT_EPSILON;
325 out_phase_measurement = (angle - fphase) > FLT_EPSILON;
333 if (
s->do_video && new_pts !=
s->last_pts) {
336 s->out->pts =
s->last_pts = new_pts;
337 s->out->duration = 1;
368 if (
s->nb_samples > 0)
390 if (
s->do_phasing_detection) {
434 .p.name =
"aphasemeter",
436 .p.priv_class = &aphasemeter_class,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static enum AVSampleFormat sample_fmts[]
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static const AVFilterPad inputs[]
static int config_input(AVFilterLink *inlink)
const FFFilter ff_avf_aphasemeter
static AVFormatContext * ctx
static void update_out_phase_detection(AVFilterContext *ctx, AVFrame *insamples, int out_phase_measurement)
static void add_metadata(AVFrame *insamples, const char *key, char *value)
static int get_x(float phase, int w)
#define get_duration(index)
static int config_input(AVFilterLink *inlink)
static void update_mono_detection(AVFilterContext *ctx, AVFrame *insamples, int mono_measurement)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static int activate(AVFilterContext *ctx)
static av_cold void uninit(AVFilterContext *ctx)
static const AVOption aphasemeter_options[]
static int config_video_output(AVFilterLink *outlink)
int ff_append_outpad(AVFilterContext *f, AVFilterPad *p)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe)
Take samples from the link's FIFO and update the link's stats.
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
Make sure a frame is writable.
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Main libavfilter public API header.
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
@ AV_OPT_TYPE_DURATION
Underlying C type is int64_t.
@ AV_OPT_TYPE_VIDEO_RATE
Underlying C type is AVRational.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
#define AV_CHANNEL_LAYOUT_STEREO
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
#define AV_LOG_INFO
Standard information.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
AVSampleFormat
Audio sample formats.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FF_FILTER_FORWARD_STATUS_ALL(inlink, filter)
Acknowledge the status on an input link and forward it to an output link.
#define FILTER_INPUTS(array)
#define FF_FILTER_FORWARD_WANTED(outlink, inlink)
Forward the frame_wanted_out flag from an output link to an input link.
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
static FilterLink * ff_filter_link(AVFilterLink *link)
#define AVFILTER_DEFINE_CLASS(fname)
#define FILTER_QUERY_FUNC2(func)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
enum MovChannelLayoutTag * layouts
int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, void *log_ctx)
Put the RGBA values that correspond to color_string in rgba_color.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
An AVChannelLayout holds information about the channel layout of audio data.
Describe the class of an AVClass context structure.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
int sample_rate
samples per second
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVDictionary * metadata
metadata.
Rational number (pair of numerator and denominator).
int start_out_phase_presence
Link properties exposed to filter code, but not external callers.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable.
timestamp utils, mostly useful for debugging/logging purposes
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.