ext/ffmpeg/: Do some more random property setting. Fix for if there's less than ffmpeg-default-buffersize (32kB) data...

Original commit message from CVS:
* ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps),
(gst_ffmpeg_caps_to_codecid):
* ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read):
Do some more random property setting. Fix for if there's less than
ffmpeg-default-buffersize (32kB) data in a file _and_ there's an
event pending. Partially fixes #142320.
This commit is contained in:
Ronald S. Bultje 2004-06-14 01:21:01 +00:00
parent bc0e141ee7
commit 03cbef5cc1
4 changed files with 44 additions and 3 deletions

View file

@ -1,3 +1,12 @@
2004-06-13 Ronald Bultje <rbultje@ronald.bitfreak.net>
* ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps),
(gst_ffmpeg_caps_to_codecid):
* ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read):
Do some more random property setting. Fix for if there's less than
ffmpeg-default-buffersize (32kB) data in a file _and_ there's an
event pending. Partially fixes #142320.
2004-06-06 Ronald Bultje <rbultje@ronald.bitfreak.net>
* ext/ffmpeg/gstffmpeg.c: (plugin_init):

2
common

@ -1 +1 @@
Subproject commit cf0828313f7cea4d5840c0959e9113f13309a56f
Subproject commit 1af22afdec71295108f882c828e08f10d8a3e94b

View file

@ -681,11 +681,24 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
case CODEC_TYPE_AUDIO:
mime = g_strdup_printf ("audio/x-gst_ff-%s", codec->name);
caps = GST_FF_AUD_CAPS_NEW (mime, NULL);
if (context)
gst_caps_set (caps, "block_align", context->block_align,
"bitrate", context->bit_rate, NULL);
g_free (mime);
break;
default:
break;
}
/* set private data */
if (context && context->extradata_size > 0) {
GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size);
memcpy (GST_BUFFER_DATA (data), context->extradata,
context->extradata_size);
gst_caps_set_simple (caps,
"gst_ff_extradata", GST_TYPE_BUFFER, data, NULL);
}
}
}
@ -1614,11 +1627,26 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
sscanf (mimetype, "%*s/x-gst_ff-%s", ext) == 1) {
if ((codec = avcodec_find_decoder_by_name (ext)) ||
(codec = avcodec_find_encoder_by_name (ext))) {
const GValue *data_v;
const GstBuffer *data;
id = codec->id;
if (mimetype[0] == 'v')
video = TRUE;
else if (mimetype[0] == 'a')
audio = TRUE;
/* extradata */
if ((data_v = gst_structure_get_value (structure,
"gst_ff_extradata")) && context) {
data = g_value_get_boxed (data_v);
if (context->extradata)
av_free (context->extradata);
context->extradata = av_malloc (GST_BUFFER_SIZE (data));
memcpy (context->extradata, GST_BUFFER_DATA (data),
GST_BUFFER_SIZE (data));
context->extradata_size = GST_BUFFER_SIZE (data);
}
}
}
}

View file

@ -95,6 +95,7 @@ gst_ffmpegdata_read (URLContext * h, unsigned char *buf, int size)
guint32 total, request;
guint8 *data;
GstProtocolInfo *info;
gboolean have_event;
info = (GstProtocolInfo *) h->priv_data;
@ -106,6 +107,8 @@ gst_ffmpegdata_read (URLContext * h, unsigned char *buf, int size)
return 0;
do {
have_event = FALSE;
/* prevent EOS */
if (gst_bytestream_tell (bs) + size > gst_bytestream_length (bs)) {
request = (int) (gst_bytestream_length (bs) - gst_bytestream_tell (bs));
@ -130,7 +133,7 @@ gst_ffmpegdata_read (URLContext * h, unsigned char *buf, int size)
g_warning ("gstffmpegprotocol: no bytestream event");
return total;
}
have_event = TRUE;
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_DISCONTINUOUS:
gst_bytestream_flush_fast (bs, remaining);
@ -139,6 +142,7 @@ gst_ffmpegdata_read (URLContext * h, unsigned char *buf, int size)
case GST_EVENT_EOS:
g_warning ("Unexpected/unwanted eos in data function");
info->eos = TRUE;
have_event = FALSE;
gst_event_unref (event);
break;
default:
@ -146,7 +150,7 @@ gst_ffmpegdata_read (URLContext * h, unsigned char *buf, int size)
break;
}
}
} while (!info->eos && total != request);
} while ((!info->eos && total != request) || have_event);
memcpy (buf, data, total);
gst_bytestream_flush_fast (bs, total);