ffmpeg: port to new memory API

This commit is contained in:
Wim Taymans 2012-01-24 14:40:37 +01:00
parent a011fdbb95
commit cf3d3fe00d
6 changed files with 56 additions and 54 deletions

View file

@ -2203,11 +2203,10 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
/* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */
if ((value = gst_structure_get_value (str, "codec_data"))) {
gsize size;
guint8 *data;
GstMapInfo map;
buf = gst_value_get_buffer (value);
data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
gst_buffer_map (buf, &map, GST_MAP_READ);
/* free the old one if it is there */
if (context->extradata)
@ -2237,19 +2236,20 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
/* allocate with enough padding */
GST_DEBUG ("copy codec_data");
context->extradata =
av_mallocz (GST_ROUND_UP_16 (size + FF_INPUT_BUFFER_PADDING_SIZE));
memcpy (context->extradata, data, size);
context->extradata_size = size;
av_mallocz (GST_ROUND_UP_16 (map.size +
FF_INPUT_BUFFER_PADDING_SIZE));
memcpy (context->extradata, map.data, map.size);
context->extradata_size = map.size;
}
/* Hack for VC1. Sometimes the first (length) byte is 0 for some files */
if (codec_id == CODEC_ID_VC1 && size > 0 && data[0] == 0) {
context->extradata[0] = (guint8) size;
if (codec_id == CODEC_ID_VC1 && map.size > 0 && map.data[0] == 0) {
context->extradata[0] = (guint8) map.size;
}
GST_DEBUG ("have codec data of size %d", size);
GST_DEBUG ("have codec data of size %d", map.size);
gst_buffer_unmap (buf, data, size);
gst_buffer_unmap (buf, &map);
} else if (context->extradata == NULL && codec_id != CODEC_ID_AAC_LATM &&
codec_id != CODEC_ID_FLAC) {
/* no extradata, alloc dummy with 0 sized, some codecs insist on reading

View file

@ -2243,6 +2243,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
gint len = -1;
gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE;
GstClockTime out_timestamp, out_duration;
GstMapInfo map;
gint64 out_offset;
int16_t *odata;
AVPacket packet;
@ -2255,7 +2256,8 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
*outbuf = new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE);
odata = gst_buffer_map (*outbuf, NULL, NULL, GST_MAP_WRITE);
gst_buffer_map (*outbuf, &map, GST_MAP_WRITE);
odata = (int16_t *) map.data;
gst_avpacket_init (&packet, data, size);
len = avcodec_decode_audio3 (ffmpegdec->context, odata, &have_data, &packet);
@ -2267,7 +2269,8 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
GstAudioFormat fmt;
/* Buffer size */
gst_buffer_unmap (*outbuf, odata, have_data);
gst_buffer_unmap (*outbuf, &map);
gst_buffer_resize (*outbuf, 0, have_data);
GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer");
if (!gst_ffmpegdec_audio_negotiate (ffmpegdec, FALSE)) {
@ -2335,7 +2338,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
ffmpegdec->format.audio.ffmpeg_layout,
ffmpegdec->format.audio.gst_layout);
} else {
gst_buffer_unmap (*outbuf, odata, 0);
gst_buffer_unmap (*outbuf, &map);
gst_buffer_unref (*outbuf);
*outbuf = NULL;
}
@ -2665,8 +2668,7 @@ gst_ffmpegdec_chain (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
GstFFMpegDec *ffmpegdec;
GstFFMpegDecClass *oclass;
guint8 *data, *bdata;
guint8 *odata;
gsize osize;
GstMapInfo map;
gint size, bsize, len, have_data;
GstFlowReturn ret = GST_FLOW_OK;
GstClockTime in_timestamp;
@ -2764,10 +2766,10 @@ gst_ffmpegdec_chain (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
inbuf = gst_buffer_make_writable (inbuf);
}
odata = gst_buffer_map (inbuf, &osize, NULL, GST_MAP_READ);
gst_buffer_map (inbuf, &map, GST_MAP_READ);
bdata = odata;
bsize = osize;
bdata = map.data;
bsize = map.size;
GST_LOG_OBJECT (ffmpegdec,
"Received new data of size %u, offset:%" G_GUINT64_FORMAT ", ts:%"
@ -2917,7 +2919,7 @@ gst_ffmpegdec_chain (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
bsize, bdata);
} while (bsize > 0);
gst_buffer_unmap (inbuf, odata, osize);
gst_buffer_unmap (inbuf, &map);
/* keep left-over */
if (ffmpegdec->pctx && bsize > 0) {

View file

@ -284,8 +284,7 @@ gst_ffmpegdeinterlace_chain (GstPad * pad, GstObject * parent,
GstFFMpegDeinterlace *deinterlace = GST_FFMPEGDEINTERLACE (parent);
GstBuffer *outbuf = NULL;
GstFlowReturn result;
guint8 *from_data, *to_data;
gsize from_size, to_size;
GstMapInfo from_map, to_map;
GST_OBJECT_LOCK (deinterlace);
if (deinterlace->reconfigure) {
@ -311,18 +310,18 @@ gst_ffmpegdeinterlace_chain (GstPad * pad, GstObject * parent,
outbuf = gst_buffer_new_and_alloc (deinterlace->to_size);
from_data = gst_buffer_map (inbuf, &from_size, NULL, GST_MAP_READ);
gst_ffmpeg_avpicture_fill (&deinterlace->from_frame, from_data,
gst_buffer_map (inbuf, &from_map, GST_MAP_READ);
gst_ffmpeg_avpicture_fill (&deinterlace->from_frame, from_map.data,
deinterlace->pixfmt, deinterlace->width, deinterlace->height);
to_data = gst_buffer_map (outbuf, &to_size, NULL, GST_MAP_WRITE);
gst_ffmpeg_avpicture_fill (&deinterlace->to_frame, to_data,
gst_buffer_map (outbuf, &to_map, GST_MAP_WRITE);
gst_ffmpeg_avpicture_fill (&deinterlace->to_frame, to_map.data,
deinterlace->pixfmt, deinterlace->width, deinterlace->height);
avpicture_deinterlace (&deinterlace->to_frame, &deinterlace->from_frame,
deinterlace->pixfmt, deinterlace->width, deinterlace->height);
gst_buffer_unmap (outbuf, to_data, to_size);
gst_buffer_unmap (inbuf, from_data, from_size);
gst_buffer_unmap (outbuf, &to_map);
gst_buffer_unmap (inbuf, &from_map);
gst_buffer_copy_into (outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);

View file

@ -1393,8 +1393,7 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux)
AVPicture src, dst;
const gchar *plugin_name =
((GstFFMpegDemuxClass *) (G_OBJECT_GET_CLASS (demux)))->in_plugin->name;
guint8 *data;
gsize size;
GstMapInfo map;
if (strcmp (plugin_name, "gif") == 0) {
src.data[0] = pkt.data;
@ -1408,14 +1407,14 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux)
avstream->codec->height);
}
data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_WRITE);
gst_ffmpeg_avpicture_fill (&dst, data,
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
gst_ffmpeg_avpicture_fill (&dst, map.data,
avstream->codec->pix_fmt, avstream->codec->width,
avstream->codec->height);
av_picture_copy (&dst, &src, avstream->codec->pix_fmt,
avstream->codec->width, avstream->codec->height);
gst_buffer_unmap (outbuf, data, size);
gst_buffer_unmap (outbuf, &map);
} else {
gst_buffer_fill (outbuf, 0, pkt.data, outsize);
}

View file

@ -777,8 +777,7 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
{
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) parent;
GstBuffer *outbuf;
guint8 *data;
gsize size;
GstMapInfo map;
gint ret_size = 0, frame_size;
gboolean force_keyframe;
@ -797,13 +796,12 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
if (force_keyframe)
ffmpegenc->picture->pict_type = FF_I_TYPE;
data = gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
gst_buffer_map (inbuf, &map, GST_MAP_READ);
frame_size = gst_ffmpeg_avpicture_fill ((AVPicture *) ffmpegenc->picture,
data,
map.data,
ffmpegenc->context->pix_fmt,
ffmpegenc->context->width, ffmpegenc->context->height);
g_return_val_if_fail (frame_size == size, GST_FLOW_ERROR);
g_return_val_if_fail (frame_size == map.size, GST_FLOW_ERROR);
ffmpegenc->picture->pts =
gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (inbuf) /
ffmpegenc->context->ticks_per_frame, ffmpegenc->context->time_base);
@ -813,7 +811,7 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
ret_size = avcodec_encode_video (ffmpegenc->context,
ffmpegenc->working_buf, ffmpegenc->working_buf_size, ffmpegenc->picture);
gst_buffer_unmap (inbuf, data, size);
gst_buffer_unmap (inbuf, &map);
if (ret_size < 0) {
#ifndef GST_DISABLE_GST_DEBUG
@ -886,7 +884,7 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in,
{
GstBuffer *outbuf;
AVCodecContext *ctx;
guint8 *audio_out;
GstMapInfo map;
gint res;
GstFlowReturn ret;
@ -894,23 +892,24 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in,
/* We need to provide at least ffmpegs minimal buffer size */
outbuf = gst_buffer_new_and_alloc (max_size + FF_MIN_BUFFER_SIZE);
audio_out = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE);
gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
GST_LOG_OBJECT (ffmpegenc, "encoding buffer of max size %d", max_size);
if (ffmpegenc->buffer_size != max_size)
ffmpegenc->buffer_size = max_size;
res = avcodec_encode_audio (ctx, audio_out, max_size, (short *) audio_in);
res = avcodec_encode_audio (ctx, map.data, max_size, (short *) audio_in);
if (res < 0) {
gst_buffer_unmap (outbuf, audio_out, 0);
gst_buffer_unmap (outbuf, &map);
GST_ERROR_OBJECT (ffmpegenc, "Failed to encode buffer: %d", res);
gst_buffer_unref (outbuf);
return GST_FLOW_OK;
}
GST_LOG_OBJECT (ffmpegenc, "got output size %d", res);
gst_buffer_unmap (outbuf, &map);
gst_buffer_resize (outbuf, 0, res);
gst_buffer_unmap (outbuf, audio_out, res);
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
GST_BUFFER_DURATION (outbuf) = duration;
if (discont)
@ -1066,6 +1065,7 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
}
GST_LOG_OBJECT (ffmpegenc, "%u bytes left in the adapter", avail);
} else {
GstMapInfo map;
/* we have no frame_size, feed the encoder all the data and expect a fixed
* output size */
int coded_bps = av_get_bits_per_sample (oclass->in_plugin->id);
@ -1076,10 +1076,12 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstObject * parent, GstBuffer * inbuf)
if (coded_bps)
out_size = (out_size * coded_bps) / 8;
in_data = (guint8 *) gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
gst_buffer_map (inbuf, &map, GST_MAP_READ);
in_data = map.data;
size = map.size;
ret = gst_ffmpegenc_encode_audio (ffmpegenc, in_data, size, out_size,
timestamp, duration, discont);
gst_buffer_unmap (inbuf, in_data, size);
gst_buffer_unmap (inbuf, &map);
gst_buffer_unref (inbuf);
if (ret != GST_FLOW_OK)

View file

@ -721,7 +721,7 @@ gst_ffmpegmux_collected (GstCollectPads2 * pads, gpointer user_data)
GstBuffer *buf;
AVPacket pkt;
gboolean need_free = FALSE;
gsize size;
GstMapInfo map;
/* push out current buffer */
buf = gst_collect_pads2_pop (ffmpegmux->collect,
@ -737,7 +737,6 @@ gst_ffmpegmux_collected (GstCollectPads2 * pads, gpointer user_data)
if (strcmp (ffmpegmux->context->oformat->name, "gif") == 0) {
AVStream *st = ffmpegmux->context->streams[best_pad->padnum];
AVPicture src, dst;
guint8 *data;
need_free = TRUE;
pkt.size = st->codec->width * st->codec->height * 3;
@ -748,16 +747,17 @@ gst_ffmpegmux_collected (GstCollectPads2 * pads, gpointer user_data)
dst.data[2] = NULL;
dst.linesize[0] = st->codec->width * 3;
data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
gst_ffmpeg_avpicture_fill (&src, data,
gst_buffer_map (buf, &map, GST_MAP_READ);
gst_ffmpeg_avpicture_fill (&src, map.data,
PIX_FMT_RGB24, st->codec->width, st->codec->height);
av_picture_copy (&dst, &src, PIX_FMT_RGB24,
st->codec->width, st->codec->height);
gst_buffer_unmap (buf, data, size);
gst_buffer_unmap (buf, &map);
} else {
pkt.data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
pkt.size = size;
gst_buffer_map (buf, &map, GST_MAP_READ);
pkt.data = map.data;
pkt.size = map.size;
}
pkt.stream_index = best_pad->padnum;
@ -776,7 +776,7 @@ gst_ffmpegmux_collected (GstCollectPads2 * pads, gpointer user_data)
if (need_free) {
g_free (pkt.data);
} else {
gst_buffer_unmap (buf, pkt.data, pkt.size);
gst_buffer_unmap (buf, &map);
}
gst_buffer_unref (buf);
} else {