* an output packet will always start at the same point as one of the input
* packets.
*/
-#define OGGVORBIS_FRAME_SIZE 64
+#define LIBVORBIS_FRAME_SIZE 64
#define BUFFER_SIZE (1024 * 64)
-typedef struct OggVorbisContext {
+typedef struct LibvorbisContext {
AVClass *av_class; /**< class for AVOptions */
vorbis_info vi; /**< vorbis_info used during init */
vorbis_dsp_state vd; /**< DSP state used for analysis */
double iblock; /**< impulse block bias option */
VorbisParseContext vp; /**< parse context to get durations */
AudioFrameQueue afq; /**< frame queue for timestamps */
-} OggVorbisContext;
+} LibvorbisContext;
static const AVOption options[] = {
- { "iblock", "Sets the impulse block bias", offsetof(OggVorbisContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
+ { "iblock", "Sets the impulse block bias", offsetof(LibvorbisContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ NULL }
};
}
}
-static av_cold int oggvorbis_init_encoder(vorbis_info *vi,
- AVCodecContext *avctx)
+static av_cold int libvorbis_setup(vorbis_info *vi, AVCodecContext *avctx)
{
- OggVorbisContext *s = avctx->priv_data;
+ LibvorbisContext *s = avctx->priv_data;
double cfreq;
int ret;
return 1 + l / 255 + l;
}
-static av_cold int oggvorbis_encode_close(AVCodecContext *avctx)
+static av_cold int libvorbis_encode_close(AVCodecContext *avctx)
{
- OggVorbisContext *s = avctx->priv_data;
+ LibvorbisContext *s = avctx->priv_data;
/* notify vorbisenc this is EOF */
if (s->dsp_initialized)
av_fifo_free(s->pkt_fifo);
ff_af_queue_close(&s->afq);
-#if FF_API_OLD_ENCODE_AUDIO
- av_freep(&avctx->coded_frame);
-#endif
av_freep(&avctx->extradata);
return 0;
}
-static av_cold int oggvorbis_encode_init(AVCodecContext *avctx)
+static av_cold int libvorbis_encode_init(AVCodecContext *avctx)
{
- OggVorbisContext *s = avctx->priv_data;
+ LibvorbisContext *s = avctx->priv_data;
ogg_packet header, header_comm, header_code;
uint8_t *p;
unsigned int offset;
int ret;
vorbis_info_init(&s->vi);
- if ((ret = oggvorbis_init_encoder(&s->vi, avctx))) {
+ if ((ret = libvorbis_setup(&s->vi, avctx))) {
av_log(avctx, AV_LOG_ERROR, "encoder setup failed\n");
goto error;
}
vorbis_comment_clear(&s->vc);
- avctx->frame_size = OGGVORBIS_FRAME_SIZE;
+ avctx->frame_size = LIBVORBIS_FRAME_SIZE;
ff_af_queue_init(avctx, &s->afq);
s->pkt_fifo = av_fifo_alloc(BUFFER_SIZE);
goto error;
}
-#if FF_API_OLD_ENCODE_AUDIO
- avctx->coded_frame = avcodec_alloc_frame();
- if (!avctx->coded_frame) {
- ret = AVERROR(ENOMEM);
- goto error;
- }
-#endif
-
return 0;
error:
- oggvorbis_encode_close(avctx);
+ libvorbis_encode_close(avctx);
return ret;
}
-static int oggvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+static int libvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr)
{
- OggVorbisContext *s = avctx->priv_data;
+ LibvorbisContext *s = avctx->priv_data;
ogg_packet op;
int ret, duration;
/* send samples to libvorbis */
if (frame) {
- const float *audio = (const float *)frame->data[0];
const int samples = frame->nb_samples;
float **buffer;
int c, channels = s->vi.channels;
buffer = vorbis_analysis_buffer(&s->vd, samples);
for (c = 0; c < channels; c++) {
- int i;
int co = (channels > 8) ? c :
ff_vorbis_encoding_channel_layout_offsets[channels - 1][c];
- for (i = 0; i < samples; i++)
- buffer[c][i] = audio[i * channels + co];
+ memcpy(buffer[c], frame->extended_data[co],
+ samples * sizeof(*buffer[c]));
}
if ((ret = vorbis_analysis_wrote(&s->vd, samples)) < 0) {
av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n");
return vorbis_error_to_averror(ret);
}
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
} else {
if (!s->eof)
AVCodec ff_libvorbis_encoder = {
.name = "libvorbis",
+ .long_name = NULL_IF_CONFIG_SMALL("libvorbis Vorbis"),
.type = AVMEDIA_TYPE_AUDIO,
- .id = CODEC_ID_VORBIS,
- .priv_data_size = sizeof(OggVorbisContext),
- .init = oggvorbis_encode_init,
- .encode2 = oggvorbis_encode_frame,
- .close = oggvorbis_encode_close,
+ .id = AV_CODEC_ID_VORBIS,
+ .priv_data_size = sizeof(LibvorbisContext),
+ .init = libvorbis_encode_init,
+ .encode2 = libvorbis_encode_frame,
+ .close = libvorbis_encode_close,
.capabilities = CODEC_CAP_DELAY,
- .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT,
+ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
- .long_name = NULL_IF_CONFIG_SMALL("libvorbis Vorbis"),
.priv_class = &class,
.defaults = defaults,
};