avformat/audiointerleave: disallow using a samples_per_frame array
Only MXF used an actual sample array, and that is unneeded there because simple rounding rules can be used instead. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
abbb466368
commit
aef2016bb0
@ -39,14 +39,11 @@ void ff_audio_interleave_close(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ff_audio_interleave_init(AVFormatContext *s,
|
int ff_audio_interleave_init(AVFormatContext *s,
|
||||||
const int *samples_per_frame,
|
const int samples_per_frame,
|
||||||
AVRational time_base)
|
AVRational time_base)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!samples_per_frame)
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
|
|
||||||
if (!time_base.num) {
|
if (!time_base.num) {
|
||||||
av_log(s, AV_LOG_ERROR, "timebase not set for audio interleave\n");
|
av_log(s, AV_LOG_ERROR, "timebase not set for audio interleave\n");
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
@ -56,6 +53,8 @@ int ff_audio_interleave_init(AVFormatContext *s,
|
|||||||
AudioInterleaveContext *aic = st->priv_data;
|
AudioInterleaveContext *aic = st->priv_data;
|
||||||
|
|
||||||
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||||
|
int max_samples = samples_per_frame ? samples_per_frame :
|
||||||
|
av_rescale_rnd(st->codecpar->sample_rate, time_base.num, time_base.den, AV_ROUND_UP);
|
||||||
aic->sample_size = (st->codecpar->channels *
|
aic->sample_size = (st->codecpar->channels *
|
||||||
av_get_bits_per_sample(st->codecpar->codec_id)) / 8;
|
av_get_bits_per_sample(st->codecpar->codec_id)) / 8;
|
||||||
if (!aic->sample_size) {
|
if (!aic->sample_size) {
|
||||||
@ -63,12 +62,11 @@ int ff_audio_interleave_init(AVFormatContext *s,
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
aic->samples_per_frame = samples_per_frame;
|
aic->samples_per_frame = samples_per_frame;
|
||||||
aic->samples = aic->samples_per_frame;
|
|
||||||
aic->time_base = time_base;
|
aic->time_base = time_base;
|
||||||
|
|
||||||
aic->fifo_size = 100* *aic->samples;
|
if (!(aic->fifo = av_fifo_alloc_array(100, max_samples)))
|
||||||
if (!(aic->fifo= av_fifo_alloc_array(100, *aic->samples)))
|
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
aic->fifo_size = 100 * max_samples;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +79,9 @@ static int interleave_new_audio_packet(AVFormatContext *s, AVPacket *pkt,
|
|||||||
AVStream *st = s->streams[stream_index];
|
AVStream *st = s->streams[stream_index];
|
||||||
AudioInterleaveContext *aic = st->priv_data;
|
AudioInterleaveContext *aic = st->priv_data;
|
||||||
int ret;
|
int ret;
|
||||||
int frame_size = *aic->samples * aic->sample_size;
|
int nb_samples = aic->samples_per_frame ? aic->samples_per_frame :
|
||||||
|
(av_rescale_q(aic->n + 1, av_make_q(st->codecpar->sample_rate, 1), av_inv_q(aic->time_base)) - aic->nb_samples);
|
||||||
|
int frame_size = nb_samples * aic->sample_size;
|
||||||
int size = FFMIN(av_fifo_size(aic->fifo), frame_size);
|
int size = FFMIN(av_fifo_size(aic->fifo), frame_size);
|
||||||
if (!size || (!flush && size == av_fifo_size(aic->fifo)))
|
if (!size || (!flush && size == av_fifo_size(aic->fifo)))
|
||||||
return 0;
|
return 0;
|
||||||
@ -95,13 +95,11 @@ static int interleave_new_audio_packet(AVFormatContext *s, AVPacket *pkt,
|
|||||||
memset(pkt->data + size, 0, pkt->size - size);
|
memset(pkt->data + size, 0, pkt->size - size);
|
||||||
|
|
||||||
pkt->dts = pkt->pts = aic->dts;
|
pkt->dts = pkt->pts = aic->dts;
|
||||||
pkt->duration = av_rescale_q(*aic->samples, st->time_base, aic->time_base);
|
pkt->duration = av_rescale_q(nb_samples, st->time_base, aic->time_base);
|
||||||
pkt->stream_index = stream_index;
|
pkt->stream_index = stream_index;
|
||||||
aic->dts += pkt->duration;
|
aic->dts += pkt->duration;
|
||||||
|
aic->nb_samples += nb_samples;
|
||||||
aic->samples++;
|
aic->n++;
|
||||||
if (!*aic->samples)
|
|
||||||
aic->samples = aic->samples_per_frame;
|
|
||||||
|
|
||||||
return pkt->size;
|
return pkt->size;
|
||||||
}
|
}
|
||||||
|
@ -29,14 +29,15 @@
|
|||||||
typedef struct AudioInterleaveContext {
|
typedef struct AudioInterleaveContext {
|
||||||
AVFifoBuffer *fifo;
|
AVFifoBuffer *fifo;
|
||||||
unsigned fifo_size; ///< size of currently allocated FIFO
|
unsigned fifo_size; ///< size of currently allocated FIFO
|
||||||
|
int64_t n; ///< number of generated packets
|
||||||
|
int64_t nb_samples; ///< number of generated samples
|
||||||
uint64_t dts; ///< current dts
|
uint64_t dts; ///< current dts
|
||||||
int sample_size; ///< size of one sample all channels included
|
int sample_size; ///< size of one sample all channels included
|
||||||
const int *samples_per_frame; ///< must be 0-terminated
|
int samples_per_frame; ///< samples per frame if fixed, 0 otherwise
|
||||||
const int *samples; ///< current samples per frame, pointer to samples_per_frame
|
|
||||||
AVRational time_base; ///< time base of output audio packets
|
AVRational time_base; ///< time base of output audio packets
|
||||||
} AudioInterleaveContext;
|
} AudioInterleaveContext;
|
||||||
|
|
||||||
int ff_audio_interleave_init(AVFormatContext *s, const int *samples_per_frame, AVRational time_base);
|
int ff_audio_interleave_init(AVFormatContext *s, const int samples_per_frame, AVRational time_base);
|
||||||
void ff_audio_interleave_close(AVFormatContext *s);
|
void ff_audio_interleave_close(AVFormatContext *s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -663,7 +663,7 @@ static int gxf_write_umf_packet(AVFormatContext *s)
|
|||||||
return updatePacketSize(pb, pos);
|
return updatePacketSize(pb, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int GXF_samples_per_frame[] = { 32768, 0 };
|
static const int GXF_samples_per_frame = 32768;
|
||||||
|
|
||||||
static void gxf_init_timecode_track(GXFStreamContext *sc, GXFStreamContext *vsc)
|
static void gxf_init_timecode_track(GXFStreamContext *sc, GXFStreamContext *vsc)
|
||||||
{
|
{
|
||||||
|
@ -1747,7 +1747,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s)
|
|||||||
avio_wb32(pb, KAG_SIZE); // system item size including klv fill
|
avio_wb32(pb, KAG_SIZE); // system item size including klv fill
|
||||||
} else { // audio or data track
|
} else { // audio or data track
|
||||||
if (!audio_frame_size) {
|
if (!audio_frame_size) {
|
||||||
audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
|
audio_frame_size = sc->frame_size;
|
||||||
audio_frame_size += klv_fill_size(audio_frame_size);
|
audio_frame_size += klv_fill_size(audio_frame_size);
|
||||||
}
|
}
|
||||||
avio_w8(pb, 1);
|
avio_w8(pb, 1);
|
||||||
@ -2650,10 +2650,7 @@ static int mxf_write_header(AVFormatContext *s)
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
mxf->timecode_track->index = -1;
|
mxf->timecode_track->index = -1;
|
||||||
|
|
||||||
if (!spf)
|
if (ff_audio_interleave_init(s, 0, av_inv_q(mxf->tc.rate)) < 0)
|
||||||
spf = ff_mxf_get_samples_per_frame(s, (AVRational){ 1, 25 });
|
|
||||||
|
|
||||||
if (ff_audio_interleave_init(s, spf->samples_per_frame, mxf->time_base) < 0)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user