av{aud,vid}enc: Stop using deprecated AVFrame APIs

This commit is contained in:
Sebastian Dröge 2015-06-28 15:37:23 +02:00
parent 2a445cb5f2
commit d6b5fc4f34
3 changed files with 27 additions and 25 deletions

View file

@ -179,6 +179,7 @@ gst_ffmpegaudenc_init (GstFFMpegAudEnc * ffmpegaudenc)
/* ffmpeg objects */ /* ffmpeg objects */
ffmpegaudenc->context = avcodec_alloc_context3 (klass->in_plugin); ffmpegaudenc->context = avcodec_alloc_context3 (klass->in_plugin);
ffmpegaudenc->opened = FALSE; ffmpegaudenc->opened = FALSE;
ffmpegaudenc->frame = av_frame_alloc ();
ffmpegaudenc->compliance = FFMPEG_DEFAULT_COMPLIANCE; ffmpegaudenc->compliance = FFMPEG_DEFAULT_COMPLIANCE;
@ -191,6 +192,7 @@ gst_ffmpegaudenc_finalize (GObject * object)
GstFFMpegAudEnc *ffmpegaudenc = (GstFFMpegAudEnc *) object; GstFFMpegAudEnc *ffmpegaudenc = (GstFFMpegAudEnc *) object;
/* clean up remaining allocated data */ /* clean up remaining allocated data */
av_frame_free (&ffmpegaudenc->frame);
gst_ffmpeg_avcodec_close (ffmpegaudenc->context); gst_ffmpeg_avcodec_close (ffmpegaudenc->context);
av_free (ffmpegaudenc->context); av_free (ffmpegaudenc->context);
@ -423,7 +425,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
GstFlowReturn ret; GstFlowReturn ret;
GstAudioInfo *info; GstAudioInfo *info;
AVPacket *pkt; AVPacket *pkt;
AVFrame frame; AVFrame *frame = ffmpegaudenc->frame;
gboolean planar; gboolean planar;
enc = GST_AUDIO_ENCODER (ffmpegaudenc); enc = GST_AUDIO_ENCODER (ffmpegaudenc);
@ -436,9 +438,6 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
pkt = g_slice_new0 (AVPacket); pkt = g_slice_new0 (AVPacket);
if (audio_in != NULL) { if (audio_in != NULL) {
memset (&frame, 0, sizeof (frame));
avcodec_get_frame_defaults (&frame);
info = gst_audio_encoder_get_audio_info (enc); info = gst_audio_encoder_get_audio_info (enc);
planar = av_sample_fmt_is_planar (ffmpegaudenc->context->sample_fmt); planar = av_sample_fmt_is_planar (ffmpegaudenc->context->sample_fmt);
@ -446,19 +445,20 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
gint channels, nsamples; gint channels, nsamples;
gint i, j; gint i, j;
nsamples = frame.nb_samples = in_size / info->bpf; nsamples = frame->nb_samples = in_size / info->bpf;
channels = info->channels; channels = info->channels;
if (info->channels > AV_NUM_DATA_POINTERS) { if (info->channels > AV_NUM_DATA_POINTERS) {
frame.extended_data = g_new (uint8_t *, info->channels); frame->extended_data = g_new (uint8_t *, info->channels);
} else { } else {
frame.extended_data = frame.data; frame->extended_data = frame->data;
} }
frame.extended_data[0] = g_malloc (in_size); frame->extended_data[0] = g_malloc (in_size);
frame.linesize[0] = in_size / channels; frame->linesize[0] = in_size / channels;
for (i = 1; i < channels; i++) for (i = 1; i < channels; i++)
frame.extended_data[i] = frame.extended_data[i - 1] + frame.linesize[0]; frame->extended_data[i] =
frame->extended_data[i - 1] + frame->linesize[0];
switch (info->finfo->width) { switch (info->finfo->width) {
case 8:{ case 8:{
@ -466,7 +466,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
((guint8 *) frame.extended_data[j])[i] = idata[j]; ((guint8 *) frame->extended_data[j])[i] = idata[j];
} }
idata += channels; idata += channels;
} }
@ -477,7 +477,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
((guint16 *) frame.extended_data[j])[i] = idata[j]; ((guint16 *) frame->extended_data[j])[i] = idata[j];
} }
idata += channels; idata += channels;
} }
@ -488,7 +488,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
((guint32 *) frame.extended_data[j])[i] = idata[j]; ((guint32 *) frame->extended_data[j])[i] = idata[j];
} }
idata += channels; idata += channels;
} }
@ -500,7 +500,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
((guint64 *) frame.extended_data[j])[i] = idata[j]; ((guint64 *) frame->extended_data[j])[i] = idata[j];
} }
idata += channels; idata += channels;
} }
@ -513,19 +513,19 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
} }
} else { } else {
frame.data[0] = audio_in; frame->data[0] = audio_in;
frame.extended_data = frame.data; frame->extended_data = frame->data;
frame.linesize[0] = in_size; frame->linesize[0] = in_size;
frame.nb_samples = in_size / info->bpf; frame->nb_samples = in_size / info->bpf;
} }
/* we have a frame to feed the encoder */ /* we have a frame to feed the encoder */
res = avcodec_encode_audio2 (ctx, pkt, &frame, have_data); res = avcodec_encode_audio2 (ctx, pkt, frame, have_data);
if (planar && info->channels > 1) if (planar && info->channels > 1)
g_free (frame.data[0]); g_free (frame->data[0]);
if (frame.extended_data != frame.data) if (frame->extended_data != frame->data)
g_free (frame.extended_data); g_free (frame->extended_data);
} else { } else {
/* flushing the encoder */ /* flushing the encoder */
@ -559,7 +559,7 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc,
but we have no way to know AFAICT */ but we have no way to know AFAICT */
ret = gst_audio_encoder_finish_frame (enc, outbuf, -1); ret = gst_audio_encoder_finish_frame (enc, outbuf, -1);
} else { } else {
ret = gst_audio_encoder_finish_frame (enc, outbuf, frame.nb_samples); ret = gst_audio_encoder_finish_frame (enc, outbuf, frame->nb_samples);
} }
} else { } else {
GST_LOG_OBJECT (ffmpegaudenc, "no output produced"); GST_LOG_OBJECT (ffmpegaudenc, "no output produced");

View file

@ -48,6 +48,8 @@ struct _GstFFMpegAudEnc
* include a context here, rather than copy-and-past it from avcodec.h */ * include a context here, rather than copy-and-past it from avcodec.h */
AVCodecContext config; AVCodecContext config;
AVFrame *frame;
GstAudioChannelPosition ffmpeg_layout[64]; GstAudioChannelPosition ffmpeg_layout[64];
gboolean needs_reorder; gboolean needs_reorder;
}; };

View file

@ -246,7 +246,7 @@ gst_ffmpegvidenc_init (GstFFMpegVidEnc * ffmpegenc)
/* ffmpeg objects */ /* ffmpeg objects */
ffmpegenc->context = avcodec_alloc_context3 (klass->in_plugin); ffmpegenc->context = avcodec_alloc_context3 (klass->in_plugin);
ffmpegenc->picture = avcodec_alloc_frame (); ffmpegenc->picture = av_frame_alloc ();
ffmpegenc->opened = FALSE; ffmpegenc->opened = FALSE;
ffmpegenc->file = NULL; ffmpegenc->file = NULL;
@ -274,9 +274,9 @@ gst_ffmpegvidenc_finalize (GObject * object)
gst_ffmpeg_cfg_finalize (ffmpegenc); gst_ffmpeg_cfg_finalize (ffmpegenc);
/* clean up remaining allocated data */ /* clean up remaining allocated data */
av_frame_free (&ffmpegenc->picture);
gst_ffmpeg_avcodec_close (ffmpegenc->context); gst_ffmpeg_avcodec_close (ffmpegenc->context);
av_free (ffmpegenc->context); av_free (ffmpegenc->context);
avcodec_free_frame (&ffmpegenc->picture);
g_free (ffmpegenc->filename); g_free (ffmpegenc->filename);