+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):
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);
+ }
}
}
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);
+ }
}
}
}
guint32 total, request;
guint8 *data;
GstProtocolInfo *info;
+ gboolean have_event;
info = (GstProtocolInfo *) h->priv_data;
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));
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);
case GST_EVENT_EOS:
g_warning ("Unexpected/unwanted eos in data function");
info->eos = TRUE;
+ have_event = FALSE;
gst_event_unref (event);
break;
default:
break;
}
}
- } while (!info->eos && total != request);
+ } while ((!info->eos && total != request) || have_event);
memcpy (buf, data, total);
gst_bytestream_flush_fast (bs, total);