avauddec: Use undeprecated AVFrame API

This commit is contained in:
Sebastian Dröge 2015-06-27 20:25:36 +02:00
parent 3d9816ce7f
commit 4240ff2bfc
2 changed files with 26 additions and 17 deletions

View file

@ -142,6 +142,8 @@ gst_ffmpegauddec_init (GstFFMpegAudDec * ffmpegdec)
ffmpegdec->context->opaque = ffmpegdec; ffmpegdec->context->opaque = ffmpegdec;
ffmpegdec->opened = FALSE; ffmpegdec->opened = FALSE;
ffmpegdec->frame = av_frame_alloc ();
gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (ffmpegdec), TRUE); gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (ffmpegdec), TRUE);
gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (ffmpegdec), TRUE); gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (ffmpegdec), TRUE);
} }
@ -151,6 +153,8 @@ gst_ffmpegauddec_finalize (GObject * object)
{ {
GstFFMpegAudDec *ffmpegdec = (GstFFMpegAudDec *) object; GstFFMpegAudDec *ffmpegdec = (GstFFMpegAudDec *) object;
av_frame_free (&ffmpegdec->frame);
if (ffmpegdec->context != NULL) { if (ffmpegdec->context != NULL) {
gst_ffmpeg_avcodec_close (ffmpegdec->context); gst_ffmpeg_avcodec_close (ffmpegdec->context);
av_free (ffmpegdec->context); av_free (ffmpegdec->context);
@ -483,25 +487,24 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
{ {
gint len = -1; gint len = -1;
AVPacket packet; AVPacket packet;
AVFrame frame;
GST_DEBUG_OBJECT (ffmpegdec, "size: %d", size); GST_DEBUG_OBJECT (ffmpegdec, "size: %d", size);
gst_avpacket_init (&packet, data, size); gst_avpacket_init (&packet, data, size);
memset (&frame, 0, sizeof (frame)); len =
avcodec_get_frame_defaults (&frame); avcodec_decode_audio4 (ffmpegdec->context, ffmpegdec->frame, have_data,
len = avcodec_decode_audio4 (ffmpegdec->context, &frame, have_data, &packet); &packet);
GST_DEBUG_OBJECT (ffmpegdec, GST_DEBUG_OBJECT (ffmpegdec,
"Decode audio: len=%d, have_data=%d", len, *have_data); "Decode audio: len=%d, have_data=%d", len, *have_data);
if (len >= 0 && *have_data) { if (len >= 0 && *have_data) {
BufferInfo *buffer_info = frame.opaque; BufferInfo *buffer_info = ffmpegdec->frame->opaque;
gint nsamples, channels, byte_per_sample; gint nsamples, channels, byte_per_sample;
gsize output_size; gsize output_size;
if (!gst_ffmpegauddec_negotiate (ffmpegdec, ffmpegdec->context, &frame, if (!gst_ffmpegauddec_negotiate (ffmpegdec, ffmpegdec->context,
FALSE)) { ffmpegdec->frame, FALSE)) {
*outbuf = NULL; *outbuf = NULL;
*ret = GST_FLOW_NOT_NEGOTIATED; *ret = GST_FLOW_NOT_NEGOTIATED;
len = -1; len = -1;
@ -509,10 +512,10 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
} }
channels = ffmpegdec->info.channels; channels = ffmpegdec->info.channels;
nsamples = frame.nb_samples; nsamples = ffmpegdec->frame->nb_samples;
byte_per_sample = ffmpegdec->info.finfo->width / 8; byte_per_sample = ffmpegdec->info.finfo->width / 8;
/* frame.linesize[0] might contain padding, allocate only what's needed */ /* ffmpegdec->frame->linesize[0] might contain padding, allocate only what's needed */
output_size = nsamples * byte_per_sample * channels; output_size = nsamples * byte_per_sample * channels;
GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer"); GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer");
@ -520,7 +523,7 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
*outbuf = buffer_info->buffer; *outbuf = buffer_info->buffer;
gst_buffer_unmap (buffer_info->buffer, &buffer_info->map); gst_buffer_unmap (buffer_info->buffer, &buffer_info->map);
g_slice_free (BufferInfo, buffer_info); g_slice_free (BufferInfo, buffer_info);
frame.opaque = NULL; ffmpegdec->frame->opaque = NULL;
} else if (av_sample_fmt_is_planar (ffmpegdec->context->sample_fmt) } else if (av_sample_fmt_is_planar (ffmpegdec->context->sample_fmt)
&& channels > 1) { && channels > 1) {
gint i, j; gint i, j;
@ -539,7 +542,8 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
odata[j] = ((const guint8 *) frame.extended_data[j])[i]; odata[j] =
((const guint8 *) ffmpegdec->frame->extended_data[j])[i];
} }
odata += channels; odata += channels;
} }
@ -550,7 +554,8 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
odata[j] = ((const guint16 *) frame.extended_data[j])[i]; odata[j] =
((const guint16 *) ffmpegdec->frame->extended_data[j])[i];
} }
odata += channels; odata += channels;
} }
@ -561,7 +566,8 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
odata[j] = ((const guint32 *) frame.extended_data[j])[i]; odata[j] =
((const guint32 *) ffmpegdec->frame->extended_data[j])[i];
} }
odata += channels; odata += channels;
} }
@ -572,7 +578,8 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
for (i = 0; i < nsamples; i++) { for (i = 0; i < nsamples; i++) {
for (j = 0; j < channels; j++) { for (j = 0; j < channels; j++) {
odata[j] = ((const guint64 *) frame.extended_data[j])[i]; odata[j] =
((const guint64 *) ffmpegdec->frame->extended_data[j])[i];
} }
odata += channels; odata += channels;
} }
@ -587,7 +594,7 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
*outbuf = *outbuf =
gst_audio_decoder_allocate_output_buffer (GST_AUDIO_DECODER gst_audio_decoder_allocate_output_buffer (GST_AUDIO_DECODER
(ffmpegdec), output_size); (ffmpegdec), output_size);
gst_buffer_fill (*outbuf, 0, frame.data[0], output_size); gst_buffer_fill (*outbuf, 0, ffmpegdec->frame->data[0], output_size);
} }
GST_DEBUG_OBJECT (ffmpegdec, "Buffer created. Size: %" G_GSIZE_FORMAT, GST_DEBUG_OBJECT (ffmpegdec, "Buffer created. Size: %" G_GSIZE_FORMAT,
@ -602,14 +609,14 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
} }
/* Mark corrupted frames as corrupted */ /* Mark corrupted frames as corrupted */
if (frame.flags & AV_FRAME_FLAG_CORRUPT) if (ffmpegdec->frame->flags & AV_FRAME_FLAG_CORRUPT)
GST_BUFFER_FLAG_SET (*outbuf, GST_BUFFER_FLAG_CORRUPTED); GST_BUFFER_FLAG_SET (*outbuf, GST_BUFFER_FLAG_CORRUPTED);
} else { } else {
*outbuf = NULL; *outbuf = NULL;
} }
beach: beach:
av_frame_unref (&frame); av_frame_unref (ffmpegdec->frame);
GST_DEBUG_OBJECT (ffmpegdec, "return flow %d, out %p, len %d", GST_DEBUG_OBJECT (ffmpegdec, "return flow %d, out %p, len %d",
*ret, *outbuf, len); *ret, *outbuf, len);
return len; return len;

View file

@ -35,6 +35,8 @@ struct _GstFFMpegAudDec
AVCodecContext *context; AVCodecContext *context;
gboolean opened; gboolean opened;
AVFrame *frame;
/* prevent reopening the decoder on GST_EVENT_CAPS when caps are same as last time. */ /* prevent reopening the decoder on GST_EVENT_CAPS when caps are same as last time. */
GstCaps *last_caps; GstCaps *last_caps;