This page is documenting a merged feature available from release 11.

Rationale

AVResample is getting extended and some resamplers and mixers have additional parameters that can be user-tuned. In order to match AVScale an AVFrame-based API will be introduced, reducing the boilerplate code and providing an example for the developers not using AVFrame but their own abstraction.

API Design

The API extension includes

Additional options

The new avresample_open2() will match the similarly-named functions in AVCodec and AVFormat.

int avresample_open2(AVAudioResampleContext *avr, AVDictionary **opts);

The function is currently equivalent of using the AVOption api directly on the avr context and then call avresample_open.

AVFrame based API

The main focus had been to simplify the setup and make AVResample simpler to use.

int avresample_config(AVAudioResampleContext *avr, AVFrame *out, AVFrame *in, AVDictionary **opts);

int avresample_convert_frame(AVAudioResampleContext *avr, AVFrame *out, AVFrame *in);

The normal workflow would be quite simplified

 AVAudioResampleContext *avr = avresample_alloc();
 AVFrame *out = av_frame_alloc();
 AVFrame *in;

 out->format         = format;
 out->channel_layout = layout;
 out->sample_rate    = rate;

 while (fill_input(in)) {
    ret = avresample_convert_frame(avr, out, in);

    if (configuration_changed(ret))
        avresample_convert_frame(avr, out, NULL);
        process(out);
        avresample_config(avr, out, in);
        avresample_convert_frame(avr, out, in);
    }
    process(out);
 }

 ret = avresample_convert_frame(avr, out, NULL);

 process(out);

Albeit not checking for allocation errors to keep the code compact, the code above is all that's needed to adapt to changes to the input format and convert to a fixed output.

Architecture Design

The internals are quite straightforward and the two functions are leveraging the already public avresample and avformat functions (avresample_convert, avresample_open, avresample_close, allocators).


CategoryBlueprint CategoryBlueprintMerged