2013-04-05 19:47:51 +02:00
|
|
|
/*
|
|
|
|
* This file is part of mpv.
|
|
|
|
*
|
|
|
|
* mpv is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* mpv is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef MP_AUDIO_H
|
|
|
|
#define MP_AUDIO_H
|
|
|
|
|
|
|
|
#include "format.h"
|
2013-04-05 20:39:52 +02:00
|
|
|
#include "chmap.h"
|
2013-04-05 19:47:51 +02:00
|
|
|
|
|
|
|
// Audio data chunk
|
|
|
|
struct mp_audio {
|
2013-11-10 23:11:40 +01:00
|
|
|
int samples; // number of samples in data (per channel)
|
|
|
|
void *planes[MP_NUM_CHANNELS]; // data buffer (one per plane)
|
|
|
|
int rate; // sample rate
|
2013-04-05 20:39:52 +02:00
|
|
|
struct mp_chmap channels; // channel layout, use mp_audio_set_*() to set
|
2013-04-05 19:47:51 +02:00
|
|
|
int format; // format (AF_FORMAT_...), use mp_audio_set_format() to set
|
|
|
|
// Redundant fields, for convenience
|
2013-11-10 23:11:40 +01:00
|
|
|
int sstride; // distance between 2 samples in bytes on a plane
|
|
|
|
// interleaved: bps * nch
|
|
|
|
// planar: bps
|
|
|
|
int nch; // number of channels (redundant with chmap)
|
|
|
|
int spf; // sub-samples per sample on each plane
|
|
|
|
int num_planes; // number of planes
|
2015-06-26 23:06:37 +02:00
|
|
|
int bps; // size of sub-samples (af_fmt_to_bytes(format))
|
2013-11-12 22:26:59 +01:00
|
|
|
|
2015-11-08 17:22:56 +01:00
|
|
|
double pts; // currently invalid within the filter chain
|
|
|
|
|
2015-06-12 17:44:40 +02:00
|
|
|
// --- private
|
|
|
|
// These do not necessarily map directly to planes[]. They can have
|
|
|
|
// different order or count. There shouldn't be more buffers than planes.
|
|
|
|
// If allocated[n] is NULL, allocated[n+1] must also be NULL.
|
2014-11-10 10:43:15 +01:00
|
|
|
struct AVBufferRef *allocated[MP_NUM_CHANNELS];
|
2013-04-05 19:47:51 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
void mp_audio_set_format(struct mp_audio *mpa, int format);
|
|
|
|
void mp_audio_set_num_channels(struct mp_audio *mpa, int num_channels);
|
2013-04-05 20:39:52 +02:00
|
|
|
void mp_audio_set_channels(struct mp_audio *mpa, const struct mp_chmap *chmap);
|
2013-04-05 19:47:51 +02:00
|
|
|
void mp_audio_copy_config(struct mp_audio *dst, const struct mp_audio *src);
|
2013-05-09 12:09:23 +02:00
|
|
|
bool mp_audio_config_equals(const struct mp_audio *a, const struct mp_audio *b);
|
2013-11-27 00:11:35 +01:00
|
|
|
bool mp_audio_config_valid(const struct mp_audio *mpa);
|
2013-04-05 19:47:51 +02:00
|
|
|
|
2014-11-25 11:11:31 +01:00
|
|
|
char *mp_audio_config_to_str_buf(char *buf, size_t buf_sz, struct mp_audio *mpa);
|
|
|
|
#define mp_audio_config_to_str(m) mp_audio_config_to_str_buf((char[64]){0}, 64, (m))
|
2013-04-08 01:58:33 +02:00
|
|
|
|
2013-11-10 23:11:40 +01:00
|
|
|
void mp_audio_force_interleaved_format(struct mp_audio *mpa);
|
|
|
|
|
|
|
|
int mp_audio_psize(struct mp_audio *mpa);
|
|
|
|
|
|
|
|
void mp_audio_set_null_data(struct mp_audio *mpa);
|
|
|
|
|
|
|
|
void mp_audio_realloc(struct mp_audio *mpa, int samples);
|
|
|
|
void mp_audio_realloc_min(struct mp_audio *mpa, int samples);
|
|
|
|
int mp_audio_get_allocated_size(struct mp_audio *mpa);
|
|
|
|
|
|
|
|
void mp_audio_fill_silence(struct mp_audio *mpa, int start, int length);
|
|
|
|
|
|
|
|
void mp_audio_copy(struct mp_audio *dst, int dst_offset,
|
|
|
|
struct mp_audio *src, int src_offset, int length);
|
2015-01-13 20:14:25 +01:00
|
|
|
void mp_audio_copy_attributes(struct mp_audio *dst, struct mp_audio *src);
|
2013-11-10 23:11:40 +01:00
|
|
|
void mp_audio_skip_samples(struct mp_audio *data, int samples);
|
2016-02-21 18:16:41 +01:00
|
|
|
void mp_audio_clip_timestamps(struct mp_audio *f, double start, double end);
|
2016-06-27 15:02:41 +02:00
|
|
|
double mp_audio_end_pts(struct mp_audio *data);
|
2013-11-10 23:11:40 +01:00
|
|
|
|
2015-01-13 20:14:25 +01:00
|
|
|
bool mp_audio_is_writeable(struct mp_audio *data);
|
2014-11-10 20:52:30 +01:00
|
|
|
int mp_audio_make_writeable(struct mp_audio *data);
|
|
|
|
|
2014-11-10 18:45:24 +01:00
|
|
|
struct AVFrame;
|
|
|
|
struct mp_audio *mp_audio_from_avframe(struct AVFrame *avframe);
|
2016-01-29 22:43:00 +01:00
|
|
|
struct AVFrame *mp_audio_to_avframe_and_unref(struct mp_audio *frame);
|
2016-07-24 19:06:00 +02:00
|
|
|
int mp_audio_to_avframe(struct mp_audio *frame, struct AVFrame *avframe);
|
2014-11-10 18:45:24 +01:00
|
|
|
|
2015-01-14 22:15:00 +01:00
|
|
|
struct mp_audio_pool;
|
2014-11-10 18:15:22 +01:00
|
|
|
struct mp_audio_pool *mp_audio_pool_create(void *ta_parent);
|
|
|
|
struct mp_audio *mp_audio_pool_get(struct mp_audio_pool *pool,
|
|
|
|
const struct mp_audio *fmt, int samples);
|
2015-01-13 20:14:25 +01:00
|
|
|
struct mp_audio *mp_audio_pool_new_copy(struct mp_audio_pool *pool,
|
|
|
|
struct mp_audio *frame);
|
|
|
|
int mp_audio_pool_make_writeable(struct mp_audio_pool *pool,
|
|
|
|
struct mp_audio *frame);
|
2014-11-10 18:15:22 +01:00
|
|
|
|
2013-04-05 19:47:51 +02:00
|
|
|
#endif
|