resample.h 3.08 KB
Newer Older
Justin Ruggles's avatar
Justin Ruggles committed
1 2 3
/*
 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
 *
4
 * This file is part of FFmpeg.
Justin Ruggles's avatar
Justin Ruggles committed
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
Justin Ruggles's avatar
Justin Ruggles committed
7 8 9 10
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
Justin Ruggles's avatar
Justin Ruggles committed
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
Justin Ruggles's avatar
Justin Ruggles committed
18 19 20 21 22 23 24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVRESAMPLE_RESAMPLE_H
#define AVRESAMPLE_RESAMPLE_H

#include "avresample.h"
25
#include "internal.h"
Justin Ruggles's avatar
Justin Ruggles committed
26 27
#include "audio_data.h"

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
struct ResampleContext {
    AVAudioResampleContext *avr;
    AudioData *buffer;
    uint8_t *filter_bank;
    int filter_length;
    int ideal_dst_incr;
    int dst_incr;
    unsigned int index;
    int frac;
    int src_incr;
    int compensation_distance;
    int phase_shift;
    int phase_mask;
    int linear;
    enum AVResampleFilterType filter_type;
    int kaiser_beta;
    void (*set_filter)(void *filter, double *tab, int phase, int tap_count);
    void (*resample_one)(struct ResampleContext *c, void *dst0,
                         int dst_index, const void *src0,
                         unsigned int index, int frac);
    void (*resample_nearest)(void *dst0, int dst_index,
                             const void *src0, unsigned int index);
    int padding_size;
    int initial_padding_filled;
    int initial_padding_samples;
    int final_padding_filled;
    int final_padding_samples;
};

Justin Ruggles's avatar
Justin Ruggles committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
/**
 * Allocate and initialize a ResampleContext.
 *
 * The parameters in the AVAudioResampleContext are used to initialize the
 * ResampleContext.
 *
 * @param avr  AVAudioResampleContext
 * @return     newly-allocated ResampleContext
 */
ResampleContext *ff_audio_resample_init(AVAudioResampleContext *avr);

/**
 * Free a ResampleContext.
 *
 * @param c  ResampleContext
 */
void ff_audio_resample_free(ResampleContext **c);

/**
 * Resample audio data.
 *
 * Changes the sample rate.
 *
 * @par
 * All samples in the source data may not be consumed depending on the
 * resampling parameters and the size of the output buffer. The unconsumed
 * samples are automatically added to the start of the source in the next call.
 * If the destination data can be reallocated, that may be done in this function
 * in order to fit all available output. If it cannot be reallocated, fewer
 * input samples will be consumed in order to have the output fit in the
 * destination data buffers.
 *
 * @param c         ResampleContext
 * @param dst       destination audio data
 * @param src       source audio data
92
 * @return          0 on success, negative AVERROR code on failure
Justin Ruggles's avatar
Justin Ruggles committed
93
 */
94
int ff_audio_resample(ResampleContext *c, AudioData *dst, AudioData *src);
Justin Ruggles's avatar
Justin Ruggles committed
95 96

#endif /* AVRESAMPLE_RESAMPLE_H */