|
|
|
@ -236,15 +236,15 @@ static int ready_residue(vorbis_enc_residue *rc, vorbis_enc_context *venc) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int create_vorbis_context(vorbis_enc_context *venc, |
|
|
|
|
AVCodecContext *avccontext) |
|
|
|
|
AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
vorbis_enc_floor *fc; |
|
|
|
|
vorbis_enc_residue *rc; |
|
|
|
|
vorbis_enc_mapping *mc; |
|
|
|
|
int i, book, ret; |
|
|
|
|
|
|
|
|
|
venc->channels = avccontext->channels; |
|
|
|
|
venc->sample_rate = avccontext->sample_rate; |
|
|
|
|
venc->channels = avctx->channels; |
|
|
|
|
venc->sample_rate = avctx->sample_rate; |
|
|
|
|
venc->log2_blocksize[0] = venc->log2_blocksize[1] = 11; |
|
|
|
|
|
|
|
|
|
venc->ncodebooks = FF_ARRAY_ELEMS(cvectors); |
|
|
|
@ -340,7 +340,7 @@ static int create_vorbis_context(vorbis_enc_context *venc, |
|
|
|
|
}; |
|
|
|
|
fc->list[i].x = a[i - 2]; |
|
|
|
|
} |
|
|
|
|
if (ff_vorbis_ready_floor1_list(avccontext, fc->list, fc->values)) |
|
|
|
|
if (ff_vorbis_ready_floor1_list(avctx, fc->list, fc->values)) |
|
|
|
|
return AVERROR_BUG; |
|
|
|
|
|
|
|
|
|
venc->nresidues = 1; |
|
|
|
@ -1015,10 +1015,10 @@ static int apply_window_and_mdct(vorbis_enc_context *venc, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, |
|
|
|
|
static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, |
|
|
|
|
const AVFrame *frame, int *got_packet_ptr) |
|
|
|
|
{ |
|
|
|
|
vorbis_enc_context *venc = avccontext->priv_data; |
|
|
|
|
vorbis_enc_context *venc = avctx->priv_data; |
|
|
|
|
float **audio = frame ? (float **)frame->extended_data : NULL; |
|
|
|
|
int samples = frame ? frame->nb_samples : 0; |
|
|
|
|
vorbis_enc_mode *mode; |
|
|
|
@ -1031,14 +1031,14 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, |
|
|
|
|
samples = 1 << (venc->log2_blocksize[0] - 1); |
|
|
|
|
|
|
|
|
|
if ((ret = ff_alloc_packet(avpkt, 8192))) { |
|
|
|
|
av_log(avccontext, AV_LOG_ERROR, "Error getting output packet\n"); |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
init_put_bits(&pb, avpkt->data, avpkt->size); |
|
|
|
|
|
|
|
|
|
if (pb.size_in_bits - put_bits_count(&pb) < 1 + ilog(venc->nmodes - 1)) { |
|
|
|
|
av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1058,7 +1058,7 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, |
|
|
|
|
uint16_t posts[MAX_FLOOR_VALUES]; |
|
|
|
|
floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples); |
|
|
|
|
if (floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples], samples)) { |
|
|
|
|
av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1082,17 +1082,17 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, |
|
|
|
|
|
|
|
|
|
if (residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]], |
|
|
|
|
&pb, venc->coeffs, samples, venc->channels)) { |
|
|
|
|
av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
flush_put_bits(&pb); |
|
|
|
|
avpkt->size = put_bits_count(&pb) >> 3; |
|
|
|
|
|
|
|
|
|
avpkt->duration = ff_samples_to_time_base(avccontext, avccontext->frame_size); |
|
|
|
|
avpkt->duration = ff_samples_to_time_base(avctx, avctx->frame_size); |
|
|
|
|
if (frame) |
|
|
|
|
if (frame->pts != AV_NOPTS_VALUE) |
|
|
|
|
avpkt->pts = ff_samples_to_time_base(avccontext, frame->pts); |
|
|
|
|
avpkt->pts = ff_samples_to_time_base(avctx, frame->pts); |
|
|
|
|
else |
|
|
|
|
avpkt->pts = venc->next_pts; |
|
|
|
|
if (avpkt->pts != AV_NOPTS_VALUE) |
|
|
|
@ -1103,9 +1103,9 @@ static int vorbis_encode_frame(AVCodecContext *avccontext, AVPacket *avpkt, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static av_cold int vorbis_encode_close(AVCodecContext *avccontext) |
|
|
|
|
static av_cold int vorbis_encode_close(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
vorbis_enc_context *venc = avccontext->priv_data; |
|
|
|
|
vorbis_enc_context *venc = avctx->priv_data; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (venc->codebooks) |
|
|
|
@ -1158,42 +1158,42 @@ static av_cold int vorbis_encode_close(AVCodecContext *avccontext) |
|
|
|
|
ff_mdct_end(&venc->mdct[1]); |
|
|
|
|
|
|
|
|
|
#if FF_API_OLD_ENCODE_AUDIO |
|
|
|
|
av_freep(&avccontext->coded_frame); |
|
|
|
|
av_freep(&avctx->coded_frame); |
|
|
|
|
#endif |
|
|
|
|
av_freep(&avccontext->extradata); |
|
|
|
|
av_freep(&avctx->extradata); |
|
|
|
|
|
|
|
|
|
return 0 ; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int vorbis_encode_init(AVCodecContext *avccontext) |
|
|
|
|
static av_cold int vorbis_encode_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
vorbis_enc_context *venc = avccontext->priv_data; |
|
|
|
|
vorbis_enc_context *venc = avctx->priv_data; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (avccontext->channels != 2) { |
|
|
|
|
av_log(avccontext, AV_LOG_ERROR, "Current Libav Vorbis encoder only supports 2 channels.\n"); |
|
|
|
|
if (avctx->channels != 2) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Current Libav Vorbis encoder only supports 2 channels.\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((ret = create_vorbis_context(venc, avccontext)) < 0) |
|
|
|
|
if ((ret = create_vorbis_context(venc, avctx)) < 0) |
|
|
|
|
goto error; |
|
|
|
|
|
|
|
|
|
avccontext->bit_rate = 0; |
|
|
|
|
if (avccontext->flags & CODEC_FLAG_QSCALE) |
|
|
|
|
venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA; |
|
|
|
|
avctx->bit_rate = 0; |
|
|
|
|
if (avctx->flags & CODEC_FLAG_QSCALE) |
|
|
|
|
venc->quality = avctx->global_quality / (float)FF_QP2LAMBDA; |
|
|
|
|
else |
|
|
|
|
venc->quality = 3.0; |
|
|
|
|
venc->quality *= venc->quality; |
|
|
|
|
|
|
|
|
|
if ((ret = put_main_header(venc, (uint8_t**)&avccontext->extradata)) < 0) |
|
|
|
|
if ((ret = put_main_header(venc, (uint8_t**)&avctx->extradata)) < 0) |
|
|
|
|
goto error; |
|
|
|
|
avccontext->extradata_size = ret; |
|
|
|
|
avctx->extradata_size = ret; |
|
|
|
|
|
|
|
|
|
avccontext->frame_size = 1 << (venc->log2_blocksize[0] - 1); |
|
|
|
|
avctx->frame_size = 1 << (venc->log2_blocksize[0] - 1); |
|
|
|
|
|
|
|
|
|
#if FF_API_OLD_ENCODE_AUDIO |
|
|
|
|
avccontext->coded_frame = avcodec_alloc_frame(); |
|
|
|
|
if (!avccontext->coded_frame) { |
|
|
|
|
avctx->coded_frame = avcodec_alloc_frame(); |
|
|
|
|
if (!avctx->coded_frame) { |
|
|
|
|
ret = AVERROR(ENOMEM); |
|
|
|
|
goto error; |
|
|
|
|
} |
|
|
|
@ -1201,7 +1201,7 @@ static av_cold int vorbis_encode_init(AVCodecContext *avccontext) |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
error: |
|
|
|
|
vorbis_encode_close(avccontext); |
|
|
|
|
vorbis_encode_close(avctx); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|