WIP: porting to 0.11

This commit is contained in:
Wim Taymans 2011-04-04 12:23:05 +02:00
parent 739b439f02
commit 4345d10577
5 changed files with 51 additions and 42 deletions

View file

@ -42,17 +42,17 @@ gst_ffmpeg_get_palette (const GstCaps * caps, AVCodecContext * context)
{ {
GstStructure *str = gst_caps_get_structure (caps, 0); GstStructure *str = gst_caps_get_structure (caps, 0);
const GValue *palette_v; const GValue *palette_v;
const GstBuffer *palette; GstBuffer *palette;
/* do we have a palette? */ /* do we have a palette? */
if ((palette_v = gst_structure_get_value (str, "palette_data")) && context) { if ((palette_v = gst_structure_get_value (str, "palette_data")) && context) {
palette = gst_value_get_buffer (palette_v); palette = gst_value_get_buffer (palette_v);
if (GST_BUFFER_SIZE (palette) >= AVPALETTE_SIZE) { if (gst_buffer_get_size (palette) >= AVPALETTE_SIZE) {
if (context->palctrl) if (context->palctrl)
av_free (context->palctrl); av_free (context->palctrl);
context->palctrl = av_malloc (sizeof (AVPaletteControl)); context->palctrl = av_malloc (sizeof (AVPaletteControl));
context->palctrl->palette_changed = 1; context->palctrl->palette_changed = 1;
memcpy (context->palctrl->palette, GST_BUFFER_DATA (palette), gst_buffer_extract (palette, 0, context->palctrl->palette,
AVPALETTE_SIZE); AVPALETTE_SIZE);
} }
} }
@ -64,8 +64,7 @@ gst_ffmpeg_set_palette (GstCaps * caps, AVCodecContext * context)
if (context->palctrl) { if (context->palctrl) {
GstBuffer *palette = gst_buffer_new_and_alloc (AVPALETTE_SIZE); GstBuffer *palette = gst_buffer_new_and_alloc (AVPALETTE_SIZE);
memcpy (GST_BUFFER_DATA (palette), context->palctrl->palette, gst_buffer_fill (palette, 0, context->palctrl->palette, AVPALETTE_SIZE);
AVPALETTE_SIZE);
gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, palette, NULL); gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, palette, NULL);
} }
} }
@ -1623,8 +1622,7 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
if (context && context->extradata_size > 0) { if (context && context->extradata_size > 0) {
GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size); GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size);
memcpy (GST_BUFFER_DATA (data), context->extradata, gst_buffer_fill (data, 0, context->extradata, context->extradata_size);
context->extradata_size);
gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, data, NULL); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, data, NULL);
gst_buffer_unref (data); gst_buffer_unref (data);
} }
@ -2278,7 +2276,7 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
{ {
GstStructure *str; GstStructure *str;
const GValue *value; const GValue *value;
const GstBuffer *buf; GstBuffer *buf;
GST_LOG ("codec_id:%d, codec_type:%d, caps:%" GST_PTR_FORMAT " context:%p", GST_LOG ("codec_id:%d, codec_type:%d, caps:%" GST_PTR_FORMAT " context:%p",
codec_id, codec_type, caps, context); codec_id, codec_type, caps, context);
@ -2290,12 +2288,11 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
/* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */ /* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */
if ((value = gst_structure_get_value (str, "codec_data"))) { if ((value = gst_structure_get_value (str, "codec_data"))) {
guint size; gsize size;
guint8 *data; guint8 *data;
buf = gst_value_get_buffer (value); buf = gst_value_get_buffer (value);
size = GST_BUFFER_SIZE (buf); data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
data = GST_BUFFER_DATA (buf);
/* free the old one if it is there */ /* free the old one if it is there */
if (context->extradata) if (context->extradata)
@ -2336,6 +2333,8 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
} }
GST_DEBUG ("have codec data of size %d", size); GST_DEBUG ("have codec data of size %d", size);
gst_buffer_unmap (buf, data, size);
} else if (context->extradata == NULL) { } else if (context->extradata == NULL) {
/* no extradata, alloc dummy with 0 sized, some codecs insist on reading /* no extradata, alloc dummy with 0 sized, some codecs insist on reading
* extradata anyway which makes then segfault. */ * extradata anyway which makes then segfault. */

View file

@ -2240,7 +2240,7 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
ffmpegdec->discont = FALSE; ffmpegdec->discont = FALSE;
} }
/* set caps */ /* set caps */
outbuf = gst_buffer_make_metadata_writable (outbuf); outbuf = gst_buffer_make_writable (outbuf);
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (ffmpegdec->srcpad)); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (ffmpegdec->srcpad));
if (ffmpegdec->segment.rate > 0.0) { if (ffmpegdec->segment.rate > 0.0) {
@ -2451,6 +2451,8 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
GstFFMpegDec *ffmpegdec; GstFFMpegDec *ffmpegdec;
GstFFMpegDecClass *oclass; GstFFMpegDecClass *oclass;
guint8 *data, *bdata, *pdata; guint8 *data, *bdata, *pdata;
guint8 *odata;
gsize osize;
gint size, bsize, len, have_data; gint size, bsize, len, have_data;
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
GstClockTime in_timestamp; GstClockTime in_timestamp;
@ -2539,12 +2541,6 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
} }
ffmpegdec->last_frames = 0; ffmpegdec->last_frames = 0;
GST_LOG_OBJECT (ffmpegdec,
"Received new data of size %u, offset:%" G_GUINT64_FORMAT ", ts:%"
GST_TIME_FORMAT ", dur:%" GST_TIME_FORMAT ", info %d",
GST_BUFFER_SIZE (inbuf), GST_BUFFER_OFFSET (inbuf),
GST_TIME_ARGS (in_timestamp), GST_TIME_ARGS (in_duration), in_info->idx);
/* workarounds, functions write to buffers: /* workarounds, functions write to buffers:
* libavcodec/svq1.c:svq1_decode_frame writes to the given buffer. * libavcodec/svq1.c:svq1_decode_frame writes to the given buffer.
* libavcodec/svq3.c:svq3_decode_slice_header too. * libavcodec/svq3.c:svq3_decode_slice_header too.
@ -2554,8 +2550,16 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
inbuf = gst_buffer_make_writable (inbuf); inbuf = gst_buffer_make_writable (inbuf);
} }
bdata = GST_BUFFER_DATA (inbuf); odata = gst_buffer_map (inbuf, &osize, NULL, GST_MAP_READ);
bsize = GST_BUFFER_SIZE (inbuf);
bdata = odata;
bsize = osize;
GST_LOG_OBJECT (ffmpegdec,
"Received new data of size %u, offset:%" G_GUINT64_FORMAT ", ts:%"
GST_TIME_FORMAT ", dur:%" GST_TIME_FORMAT ", info %d",
bsize, in_offset, GST_TIME_ARGS (in_timestamp),
GST_TIME_ARGS (in_duration), in_info->idx);
do { do {
/* parse, if at all possible */ /* parse, if at all possible */
@ -2691,6 +2695,8 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
bsize, bdata); bsize, bdata);
} while (bsize > 0); } while (bsize > 0);
gst_buffer_unmap (inbuf, odata, osize);
/* keep left-over */ /* keep left-over */
if (ffmpegdec->pctx && bsize > 0) { if (ffmpegdec->pctx && bsize > 0) {
in_timestamp = GST_BUFFER_TIMESTAMP (inbuf); in_timestamp = GST_BUFFER_TIMESTAMP (inbuf);
@ -2700,8 +2706,8 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
"Keeping %d bytes of data with offset %" G_GINT64_FORMAT ", timestamp %" "Keeping %d bytes of data with offset %" G_GINT64_FORMAT ", timestamp %"
GST_TIME_FORMAT, bsize, in_offset, GST_TIME_ARGS (in_timestamp)); GST_TIME_FORMAT, bsize, in_offset, GST_TIME_ARGS (in_timestamp));
ffmpegdec->pcache = gst_buffer_create_sub (inbuf, ffmpegdec->pcache = gst_buffer_copy_region (inbuf, GST_BUFFER_COPY_ALL,
GST_BUFFER_SIZE (inbuf) - bsize, bsize); gst_buffer_get_size (inbuf) - bsize, bsize);
/* we keep timestamp, even though all we really know is that the correct /* we keep timestamp, even though all we really know is that the correct
* timestamp is not below the one from inbuf */ * timestamp is not below the one from inbuf */
GST_BUFFER_TIMESTAMP (ffmpegdec->pcache) = in_timestamp; GST_BUFFER_TIMESTAMP (ffmpegdec->pcache) = in_timestamp;

View file

@ -757,6 +757,8 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
{ {
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) (GST_PAD_PARENT (pad)); GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) (GST_PAD_PARENT (pad));
GstBuffer *outbuf; GstBuffer *outbuf;
guint8 *data;
gsize size;
gint ret_size = 0, frame_size; gint ret_size = 0, frame_size;
gboolean force_keyframe; gboolean force_keyframe;
@ -772,11 +774,12 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
if (force_keyframe) if (force_keyframe)
ffmpegenc->picture->pict_type = FF_I_TYPE; ffmpegenc->picture->pict_type = FF_I_TYPE;
data = gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
frame_size = gst_ffmpeg_avpicture_fill ((AVPicture *) ffmpegenc->picture, frame_size = gst_ffmpeg_avpicture_fill ((AVPicture *) ffmpegenc->picture,
GST_BUFFER_DATA (inbuf), data,
ffmpegenc->context->pix_fmt, ffmpegenc->context->pix_fmt,
ffmpegenc->context->width, ffmpegenc->context->height); ffmpegenc->context->width, ffmpegenc->context->height);
g_return_val_if_fail (frame_size == GST_BUFFER_SIZE (inbuf), GST_FLOW_ERROR); g_return_val_if_fail (frame_size == size, GST_FLOW_ERROR);
ffmpegenc->picture->pts = ffmpegenc->picture->pts =
gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (inbuf) / gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (inbuf) /
@ -787,6 +790,8 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
ret_size = avcodec_encode_video (ffmpegenc->context, ret_size = avcodec_encode_video (ffmpegenc->context,
ffmpegenc->working_buf, ffmpegenc->working_buf_size, ffmpegenc->picture); ffmpegenc->working_buf, ffmpegenc->working_buf_size, ffmpegenc->picture);
gst_buffer_unmap (inbuf, data, size);
if (ret_size < 0) { if (ret_size < 0) {
#ifndef GST_DISABLE_GST_DEBUG #ifndef GST_DISABLE_GST_DEBUG
GstFFMpegEncClass *oclass = GstFFMpegEncClass *oclass =
@ -815,7 +820,7 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
GST_ERROR_SYSTEM); GST_ERROR_SYSTEM);
outbuf = gst_buffer_new_and_alloc (ret_size); outbuf = gst_buffer_new_and_alloc (ret_size);
memcpy (GST_BUFFER_DATA (outbuf), ffmpegenc->working_buf, ret_size); gst_buffer_fill (outbuf, 0, ffmpegenc->working_buf, ret_size);
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf);
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf);
/* buggy codec may not set coded_frame */ /* buggy codec may not set coded_frame */
@ -858,7 +863,7 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in,
/* We need to provide at least ffmpegs minimal buffer size */ /* We need to provide at least ffmpegs minimal buffer size */
outbuf = gst_buffer_new_and_alloc (max_size + FF_MIN_BUFFER_SIZE); outbuf = gst_buffer_new_and_alloc (max_size + FF_MIN_BUFFER_SIZE);
audio_out = GST_BUFFER_DATA (outbuf); audio_out = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE);
GST_LOG_OBJECT (ffmpegenc, "encoding buffer of max size %d", max_size); GST_LOG_OBJECT (ffmpegenc, "encoding buffer of max size %d", max_size);
if (ffmpegenc->buffer_size != max_size) if (ffmpegenc->buffer_size != max_size)
@ -867,13 +872,14 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in,
res = avcodec_encode_audio (ctx, audio_out, in_size, (short *) audio_in); res = avcodec_encode_audio (ctx, audio_out, in_size, (short *) audio_in);
if (res < 0) { if (res < 0) {
gst_buffer_unmap (outbuf, audio_out, 0);
GST_ERROR_OBJECT (ffmpegenc, "Failed to encode buffer: %d", res); GST_ERROR_OBJECT (ffmpegenc, "Failed to encode buffer: %d", res);
gst_buffer_unref (outbuf); gst_buffer_unref (outbuf);
return GST_FLOW_OK; return GST_FLOW_OK;
} }
GST_LOG_OBJECT (ffmpegenc, "got output size %d", res); GST_LOG_OBJECT (ffmpegenc, "got output size %d", res);
GST_BUFFER_SIZE (outbuf) = res; gst_buffer_unmap (outbuf, audio_out, res);
GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
GST_BUFFER_DURATION (outbuf) = duration; GST_BUFFER_DURATION (outbuf) = duration;
if (discont) if (discont)
@ -895,7 +901,7 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstBuffer * inbuf)
GstFFMpegEncClass *oclass; GstFFMpegEncClass *oclass;
AVCodecContext *ctx; AVCodecContext *ctx;
GstClockTime timestamp, duration; GstClockTime timestamp, duration;
guint size, frame_size; gsize size, frame_size;
gint osize; gint osize;
GstFlowReturn ret; GstFlowReturn ret;
gint out_size; gint out_size;
@ -907,7 +913,7 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstBuffer * inbuf)
ctx = ffmpegenc->context; ctx = ffmpegenc->context;
size = GST_BUFFER_SIZE (inbuf); size = gst_buffer_get_size (inbuf);
timestamp = GST_BUFFER_TIMESTAMP (inbuf); timestamp = GST_BUFFER_TIMESTAMP (inbuf);
duration = GST_BUFFER_DURATION (inbuf); duration = GST_BUFFER_DURATION (inbuf);
discont = GST_BUFFER_IS_DISCONT (inbuf); discont = GST_BUFFER_IS_DISCONT (inbuf);
@ -996,7 +1002,7 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstBuffer * inbuf)
* or samplesize to divide by the samplerate */ * or samplesize to divide by the samplerate */
/* take an audio buffer out of the adapter */ /* take an audio buffer out of the adapter */
in_data = (guint8 *) gst_adapter_peek (ffmpegenc->adapter, frame_bytes); in_data = (guint8 *) gst_adapter_map (ffmpegenc->adapter, frame_bytes);
ffmpegenc->adapter_consumed += frame_size; ffmpegenc->adapter_consumed += frame_size;
/* calculate timestamp and duration relative to start of adapter and to /* calculate timestamp and duration relative to start of adapter and to
@ -1013,7 +1019,7 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstBuffer * inbuf)
gst_ffmpegenc_encode_audio (ffmpegenc, in_data, frame_bytes, out_size, gst_ffmpegenc_encode_audio (ffmpegenc, in_data, frame_bytes, out_size,
timestamp, duration, ffmpegenc->discont); timestamp, duration, ffmpegenc->discont);
gst_adapter_flush (ffmpegenc->adapter, frame_bytes); gst_adapter_unmap (ffmpegenc->adapter, frame_bytes);
if (ret != GST_FLOW_OK) if (ret != GST_FLOW_OK)
goto push_failed; goto push_failed;
@ -1036,9 +1042,10 @@ gst_ffmpegenc_chain_audio (GstPad * pad, GstBuffer * inbuf)
if (coded_bps) if (coded_bps)
out_size = (out_size * coded_bps) / 8; out_size = (out_size * coded_bps) / 8;
in_data = (guint8 *) GST_BUFFER_DATA (inbuf); in_data = (guint8 *) gst_buffer_map (inbuf, &size, NULL, GST_MAP_READ);
ret = gst_ffmpegenc_encode_audio (ffmpegenc, in_data, size, out_size, ret = gst_ffmpegenc_encode_audio (ffmpegenc, in_data, size, out_size,
timestamp, duration, discont); timestamp, duration, discont);
gst_buffer_unmap (inbuf, in_data, size);
gst_buffer_unref (inbuf); gst_buffer_unref (inbuf);
if (ret != GST_FLOW_OK) if (ret != GST_FLOW_OK)
@ -1096,7 +1103,7 @@ gst_ffmpegenc_flush_buffers (GstFFMpegEnc * ffmpegenc, gboolean send)
inbuf = g_queue_pop_head (ffmpegenc->delay); inbuf = g_queue_pop_head (ffmpegenc->delay);
outbuf = gst_buffer_new_and_alloc (ret_size); outbuf = gst_buffer_new_and_alloc (ret_size);
memcpy (GST_BUFFER_DATA (outbuf), ffmpegenc->working_buf, ret_size); gst_buffer_fill (outbuf, 0, ffmpegenc->working_buf, ret_size);
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf);
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf);

View file

@ -111,8 +111,8 @@ gst_ffmpegdata_peek (URLContext * h, unsigned char *buf, int size)
switch (ret) { switch (ret) {
case GST_FLOW_OK: case GST_FLOW_OK:
total = (gint) GST_BUFFER_SIZE (inbuf); total = (gint) gst_buffer_get_size (inbuf);
memcpy (buf, GST_BUFFER_DATA (inbuf), total); gst_buffer_extract (inbuf, 0, buf, total);
gst_buffer_unref (inbuf); gst_buffer_unref (inbuf);
break; break;
case GST_FLOW_UNEXPECTED: case GST_FLOW_UNEXPECTED:
@ -169,7 +169,7 @@ gst_ffmpegdata_write (URLContext * h, const unsigned char *buf, int size)
info->offset, size, GST_PAD_CAPS (info->pad), &outbuf) != GST_FLOW_OK) info->offset, size, GST_PAD_CAPS (info->pad), &outbuf) != GST_FLOW_OK)
return 0; return 0;
memcpy (GST_BUFFER_DATA (outbuf), buf, size); gst_buffer_fill (outbuf, 0, buf, size);
if (gst_pad_push (info->pad, outbuf) != GST_FLOW_OK) if (gst_pad_push (info->pad, outbuf) != GST_FLOW_OK)
return 0; return 0;
@ -333,7 +333,6 @@ static int
gst_ffmpeg_pipe_read (URLContext * h, unsigned char *buf, int size) gst_ffmpeg_pipe_read (URLContext * h, unsigned char *buf, int size)
{ {
GstFFMpegPipe *ffpipe; GstFFMpegPipe *ffpipe;
const guint8 *data;
guint available; guint available;
ffpipe = (GstFFMpegPipe *) h->priv_data; ffpipe = (GstFFMpegPipe *) h->priv_data;
@ -355,8 +354,7 @@ gst_ffmpeg_pipe_read (URLContext * h, unsigned char *buf, int size)
size = MIN (available, size); size = MIN (available, size);
if (size) { if (size) {
GST_LOG ("Getting %d bytes", size); GST_LOG ("Getting %d bytes", size);
data = gst_adapter_peek (ffpipe->adapter, size); gst_adapter_copy (ffpipe->adapter, buf, 0, size);
memcpy (buf, data, size);
gst_adapter_flush (ffpipe->adapter, size); gst_adapter_flush (ffpipe->adapter, size);
GST_LOG ("%d bytes left in adapter", GST_LOG ("%d bytes left in adapter",
gst_adapter_available (ffpipe->adapter)); gst_adapter_available (ffpipe->adapter));

View file

@ -435,9 +435,8 @@ new_aligned_buffer (gint size, GstCaps * caps)
GstBuffer *buf; GstBuffer *buf;
buf = gst_buffer_new (); buf = gst_buffer_new ();
GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = av_malloc (size); gst_buffer_take_memory (buf,
GST_BUFFER_SIZE (buf) = size; gst_memory_new_wrapped (0, av_malloc (size), av_free, size, 0, size));
GST_BUFFER_FREE_FUNC (buf) = av_free;
if (caps) if (caps)
gst_buffer_set_caps (buf, caps); gst_buffer_set_caps (buf, caps);