* 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 */
vorbis_comment vc; /**< VorbisComment info */
ogg_packet op; /**< ogg packet */
double iblock; /**< impulse block bias option */
- VorbisParseContext vp; /**< parse context to get durations */
+ AVVorbisParseContext *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_encode_init(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;
- if (avctx->flags & CODEC_FLAG_QSCALE || !avctx->bit_rate) {
+ if (avctx->flags & AV_CODEC_FLAG_QSCALE || !avctx->bit_rate) {
/* variable bitrate
* NOTE: we use the oggenc range of -1 to 10 for global_quality for
* user convenience, but libvorbis uses -0.1 to 1.0.
*/
float q = avctx->global_quality / (float)FF_QP2LAMBDA;
/* default to 3 if the user did not set quality or bitrate */
- if (!(avctx->flags & CODEC_FLAG_QSCALE))
+ if (!(avctx->flags & AV_CODEC_FLAG_QSCALE))
q = 3.0;
if ((ret = vorbis_encode_setup_vbr(vi, avctx->channels,
avctx->sample_rate,
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)
ff_af_queue_close(&s->afq);
av_freep(&avctx->extradata);
+ av_vorbis_parse_free(&s->vp);
+
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_encode_init(&s->vi, avctx))) {
+ if ((ret = libvorbis_setup(&s->vi, avctx))) {
av_log(avctx, AV_LOG_ERROR, "encoder setup failed\n");
goto error;
}
xiph_len(header_comm.bytes) +
header_code.bytes;
p = avctx->extradata = av_malloc(avctx->extradata_size +
- FF_INPUT_BUFFER_PADDING_SIZE);
+ AV_INPUT_BUFFER_PADDING_SIZE);
if (!p) {
ret = AVERROR(ENOMEM);
goto error;
offset += header_code.bytes;
assert(offset == avctx->extradata_size);
- if ((ret = avpriv_vorbis_parse_extradata(avctx, &s->vp)) < 0) {
+ s->vp = av_vorbis_parse_init(avctx->extradata, avctx->extradata_size);
+ if (!s->vp) {
av_log(avctx, AV_LOG_ERROR, "invalid extradata\n");
return ret;
}
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);
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;
avpkt->pts = ff_samples_to_time_base(avctx, op.granulepos);
- duration = avpriv_vorbis_parse_frame(&s->vp, avpkt->data, avpkt->size);
+ duration = av_vorbis_parse_frame(s->vp, avpkt->data, avpkt->size);
if (duration > 0) {
/* we do not know encoder delay until we get the first packet from
* libvorbis, so we have to update the AudioFrameQueue counts */
- if (!avctx->delay) {
- avctx->delay = duration;
+ if (!avctx->initial_padding) {
+ avctx->initial_padding = duration;
s->afq.remaining_delay += duration;
s->afq.remaining_samples += duration;
}
.long_name = NULL_IF_CONFIG_SMALL("libvorbis Vorbis"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_VORBIS,
- .priv_data_size = sizeof(OggVorbisContext),
- .init = oggvorbis_encode_init,
- .encode2 = oggvorbis_encode_frame,
- .close = oggvorbis_encode_close,
- .capabilities = CODEC_CAP_DELAY,
+ .priv_data_size = sizeof(LibvorbisContext),
+ .init = libvorbis_encode_init,
+ .encode2 = libvorbis_encode_frame,
+ .close = libvorbis_encode_close,
+ .capabilities = AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
.priv_class = &class,