|
|
|
@ -1813,95 +1813,6 @@ end: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if FF_API_OLD_ENCODE_AUDIO |
|
|
|
|
int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, |
|
|
|
|
uint8_t *buf, int buf_size, |
|
|
|
|
const short *samples) |
|
|
|
|
{ |
|
|
|
|
AVPacket pkt; |
|
|
|
|
AVFrame *frame; |
|
|
|
|
int ret, samples_size, got_packet; |
|
|
|
|
|
|
|
|
|
av_init_packet(&pkt); |
|
|
|
|
pkt.data = buf; |
|
|
|
|
pkt.size = buf_size; |
|
|
|
|
|
|
|
|
|
if (samples) { |
|
|
|
|
frame = av_frame_alloc(); |
|
|
|
|
if (!frame) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
|
|
if (avctx->frame_size) { |
|
|
|
|
frame->nb_samples = avctx->frame_size; |
|
|
|
|
} else { |
|
|
|
|
/* if frame_size is not set, the number of samples must be
|
|
|
|
|
* calculated from the buffer size */ |
|
|
|
|
int64_t nb_samples; |
|
|
|
|
if (!av_get_bits_per_sample(avctx->codec_id)) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "avcodec_encode_audio() does not " |
|
|
|
|
"support this codec\n"); |
|
|
|
|
av_frame_free(&frame); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
nb_samples = (int64_t)buf_size * 8 / |
|
|
|
|
(av_get_bits_per_sample(avctx->codec_id) * |
|
|
|
|
avctx->channels); |
|
|
|
|
if (nb_samples >= INT_MAX) { |
|
|
|
|
av_frame_free(&frame); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
frame->nb_samples = nb_samples; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* it is assumed that the samples buffer is large enough based on the
|
|
|
|
|
* relevant parameters */ |
|
|
|
|
samples_size = av_samples_get_buffer_size(NULL, avctx->channels, |
|
|
|
|
frame->nb_samples, |
|
|
|
|
avctx->sample_fmt, 1); |
|
|
|
|
if ((ret = avcodec_fill_audio_frame(frame, avctx->channels, |
|
|
|
|
avctx->sample_fmt, |
|
|
|
|
(const uint8_t *)samples, |
|
|
|
|
samples_size, 1)) < 0) { |
|
|
|
|
av_frame_free(&frame); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* fabricate frame pts from sample count.
|
|
|
|
|
* this is needed because the avcodec_encode_audio() API does not have |
|
|
|
|
* a way for the user to provide pts */ |
|
|
|
|
if (avctx->sample_rate && avctx->time_base.num) |
|
|
|
|
frame->pts = ff_samples_to_time_base(avctx, |
|
|
|
|
avctx->internal->sample_count); |
|
|
|
|
else |
|
|
|
|
frame->pts = AV_NOPTS_VALUE; |
|
|
|
|
avctx->internal->sample_count += frame->nb_samples; |
|
|
|
|
} else { |
|
|
|
|
frame = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
got_packet = 0; |
|
|
|
|
ret = avcodec_encode_audio2(avctx, &pkt, frame, &got_packet); |
|
|
|
|
#if FF_API_CODED_FRAME |
|
|
|
|
FF_DISABLE_DEPRECATION_WARNINGS |
|
|
|
|
if (!ret && got_packet && avctx->coded_frame) { |
|
|
|
|
avctx->coded_frame->pts = pkt.pts; |
|
|
|
|
avctx->coded_frame->key_frame = !!(pkt.flags & AV_PKT_FLAG_KEY); |
|
|
|
|
} |
|
|
|
|
FF_ENABLE_DEPRECATION_WARNINGS |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* free any side data since we cannot return it */ |
|
|
|
|
av_packet_free_side_data(&pkt); |
|
|
|
|
|
|
|
|
|
if (frame && frame->extended_data != frame->data) |
|
|
|
|
av_freep(&frame->extended_data); |
|
|
|
|
|
|
|
|
|
av_frame_free(&frame); |
|
|
|
|
return ret ? ret : pkt.size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if FF_API_OLD_ENCODE_VIDEO |
|
|
|
|
int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
|
|
|
|
const AVFrame *pict) |
|
|
|
|