Browse Source

lavfi: add a channels field to AVFilterLink.

Also: fix af_pan and af_aresample, that forgot to update
audio->channels.
tags/n1.1
Nicolas George 13 years ago
parent
commit
238edd2fe3
6 changed files with 22 additions and 2 deletions
  1. +1
    -0
      libavfilter/af_aresample.c
  2. +1
    -0
      libavfilter/af_pan.c
  3. +4
    -2
      libavfilter/audio.c
  4. +5
    -0
      libavfilter/avfilter.c
  5. +10
    -0
      libavfilter/avfilter.h
  6. +1
    -0
      libavfilter/avfiltergraph.c

+ 1
- 0
libavfilter/af_aresample.c View File

@@ -184,6 +184,7 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *insamplesref)


avfilter_copy_buffer_ref_props(outsamplesref, insamplesref); avfilter_copy_buffer_ref_props(outsamplesref, insamplesref);
outsamplesref->format = outlink->format; outsamplesref->format = outlink->format;
outsamplesref->audio->channels = outlink->channels;
outsamplesref->audio->channel_layout = outlink->channel_layout; outsamplesref->audio->channel_layout = outlink->channel_layout;
outsamplesref->audio->sample_rate = outlink->sample_rate; outsamplesref->audio->sample_rate = outlink->sample_rate;




+ 1
- 0
libavfilter/af_pan.c View File

@@ -364,6 +364,7 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *insamples)
swr_convert(pan->swr, outsamples->data, n, (void *)insamples->data, n); swr_convert(pan->swr, outsamples->data, n, (void *)insamples->data, n);
avfilter_copy_buffer_ref_props(outsamples, insamples); avfilter_copy_buffer_ref_props(outsamples, insamples);
outsamples->audio->channel_layout = outlink->channel_layout; outsamples->audio->channel_layout = outlink->channel_layout;
outsamples->audio->channels = outlink->channels;


ret = ff_filter_frame(outlink, outsamples); ret = ff_filter_frame(outlink, outsamples);
avfilter_unref_buffer(insamples); avfilter_unref_buffer(insamples);


+ 4
- 2
libavfilter/audio.c View File

@@ -93,6 +93,7 @@ AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
enum AVSampleFormat sample_fmt, enum AVSampleFormat sample_fmt,
uint64_t channel_layout) uint64_t channel_layout)
{ {
int channels = av_get_channel_layout_nb_channels(channel_layout);
int planes; int planes;
AVFilterBuffer *samples = av_mallocz(sizeof(*samples)); AVFilterBuffer *samples = av_mallocz(sizeof(*samples));
AVFilterBufferRef *samplesref = av_mallocz(sizeof(*samplesref)); AVFilterBufferRef *samplesref = av_mallocz(sizeof(*samplesref));
@@ -107,9 +108,9 @@ AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,


samplesref->audio->nb_samples = nb_samples; samplesref->audio->nb_samples = nb_samples;
samplesref->audio->channel_layout = channel_layout; samplesref->audio->channel_layout = channel_layout;
samplesref->audio->channels = channels;


planes = av_sample_fmt_is_planar(sample_fmt) ?
av_get_channel_layout_nb_channels(channel_layout) : 1;
planes = av_sample_fmt_is_planar(sample_fmt) ? channels : 1;


/* make sure the buffer gets read permission or it's useless for output */ /* make sure the buffer gets read permission or it's useless for output */
samplesref->perms = perms | AV_PERM_READ; samplesref->perms = perms | AV_PERM_READ;
@@ -225,6 +226,7 @@ int ff_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
int ret = 0; int ret = 0;


av_assert1(samplesref->format == link->format); av_assert1(samplesref->format == link->format);
av_assert1(samplesref->audio->channels == link->channels);
av_assert1(samplesref->audio->channel_layout == link->channel_layout); av_assert1(samplesref->audio->channel_layout == link->channel_layout);
av_assert1(samplesref->audio->sample_rate == link->sample_rate); av_assert1(samplesref->audio->sample_rate == link->sample_rate);




+ 5
- 0
libavfilter/avfilter.c View File

@@ -164,6 +164,11 @@ void avfilter_link_free(AVFilterLink **link)
av_freep(link); av_freep(link);
} }


int avfilter_link_get_channels(AVFilterLink *link)
{
return link->channels;
}

void avfilter_link_set_closed(AVFilterLink *link, int closed) void avfilter_link_set_closed(AVFilterLink *link, int closed)
{ {
link->closed = closed; link->closed = closed;


+ 10
- 0
libavfilter/avfilter.h View File

@@ -699,6 +699,11 @@ struct AVFilterLink {
* filter. * filter.
*/ */
int closed; int closed;

/**
* Number of channels.
*/
int channels;
}; };


/** /**
@@ -718,6 +723,11 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
*/ */
void avfilter_link_free(AVFilterLink **link); void avfilter_link_free(AVFilterLink **link);


/**
* Get the number of channels of a link.
*/
int avfilter_link_get_channels(AVFilterLink *link);

/** /**
* Set the closed field of a link. * Set the closed field of a link.
*/ */


+ 1
- 0
libavfilter/avfiltergraph.c View File

@@ -473,6 +473,7 @@ static int pick_format(AVFilterLink *link, AVFilterLink *ref)
} }
link->in_channel_layouts->nb_channel_layouts = 1; link->in_channel_layouts->nb_channel_layouts = 1;
link->channel_layout = link->in_channel_layouts->channel_layouts[0]; link->channel_layout = link->in_channel_layouts->channel_layouts[0];
link->channels = av_get_channel_layout_nb_channels(link->channel_layout);
} }


ff_formats_unref(&link->in_formats); ff_formats_unref(&link->in_formats);


Loading…
Cancel
Save