mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-06 14:32:31 +00:00
ext/ffmpeg/gstffmpegdec.c: Add padding to input data before feeding it to ffmpeg. Also add option to disable this (al...
Original commit message from CVS: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_class_init), (gst_ffmpegdec_init), (get_output_buffer), (gst_ffmpegdec_chain), (gst_ffmpegdec_change_state), (gst_ffmpegdec_set_property), (gst_ffmpegdec_get_property): Add padding to input data before feeding it to ffmpeg. Also add option to disable this (although it does not seem to cause slowdown).
This commit is contained in:
parent
e57ac5b514
commit
2e73ff53f0
2 changed files with 49 additions and 4 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2008-01-23 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_class_init),
|
||||||
|
(gst_ffmpegdec_init), (get_output_buffer), (gst_ffmpegdec_chain),
|
||||||
|
(gst_ffmpegdec_change_state), (gst_ffmpegdec_set_property),
|
||||||
|
(gst_ffmpegdec_get_property):
|
||||||
|
Add padding to input data before feeding it to ffmpeg. Also add option
|
||||||
|
to disable this (although it does not seem to cause slowdown).
|
||||||
|
|
||||||
2008-01-23 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-01-23 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_setcaps),
|
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_setcaps),
|
||||||
|
|
|
@ -77,6 +77,8 @@ struct _GstFFMpegDec
|
||||||
/* parsing */
|
/* parsing */
|
||||||
AVCodecParserContext *pctx;
|
AVCodecParserContext *pctx;
|
||||||
GstBuffer *pcache;
|
GstBuffer *pcache;
|
||||||
|
guint8 *padded;
|
||||||
|
guint padded_size;
|
||||||
|
|
||||||
GValue *par; /* pixel aspect ratio of incoming data */
|
GValue *par; /* pixel aspect ratio of incoming data */
|
||||||
gboolean current_dr; /* if direct rendering is enabled */
|
gboolean current_dr; /* if direct rendering is enabled */
|
||||||
|
@ -86,6 +88,7 @@ struct _GstFFMpegDec
|
||||||
gint hurry_up;
|
gint hurry_up;
|
||||||
gint lowres;
|
gint lowres;
|
||||||
gboolean direct_rendering;
|
gboolean direct_rendering;
|
||||||
|
gboolean do_padding;
|
||||||
|
|
||||||
/* QoS stuff *//* with LOCK */
|
/* QoS stuff *//* with LOCK */
|
||||||
gdouble proportion;
|
gdouble proportion;
|
||||||
|
@ -132,13 +135,15 @@ struct _GstFFMpegDecClassParams
|
||||||
#define DEFAULT_LOWRES 0
|
#define DEFAULT_LOWRES 0
|
||||||
#define DEFAULT_SKIPFRAME 0
|
#define DEFAULT_SKIPFRAME 0
|
||||||
#define DEFAULT_DIRECT_RENDERING FALSE
|
#define DEFAULT_DIRECT_RENDERING FALSE
|
||||||
|
#define DEFAULT_DO_PADDING TRUE
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_LOWRES,
|
PROP_LOWRES,
|
||||||
PROP_SKIPFRAME,
|
PROP_SKIPFRAME,
|
||||||
PROP_DIRECT_RENDERING
|
PROP_DIRECT_RENDERING,
|
||||||
|
PROP_DO_PADDING
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A number of function prototypes are given so we can refer to them later. */
|
/* A number of function prototypes are given so we can refer to them later. */
|
||||||
|
@ -285,6 +290,10 @@ gst_ffmpegdec_class_init (GstFFMpegDecClass * klass)
|
||||||
g_param_spec_boolean ("direct-rendering", "Direct Rendering",
|
g_param_spec_boolean ("direct-rendering", "Direct Rendering",
|
||||||
"Enable direct rendering",
|
"Enable direct rendering",
|
||||||
DEFAULT_DIRECT_RENDERING, G_PARAM_READWRITE));
|
DEFAULT_DIRECT_RENDERING, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_DO_PADDING,
|
||||||
|
g_param_spec_boolean ("do-padding", "Do Padding",
|
||||||
|
"Add 0 padding before decoding data",
|
||||||
|
DEFAULT_DO_PADDING, G_PARAM_READWRITE));
|
||||||
}
|
}
|
||||||
|
|
||||||
gstelement_class->change_state = gst_ffmpegdec_change_state;
|
gstelement_class->change_state = gst_ffmpegdec_change_state;
|
||||||
|
@ -325,6 +334,7 @@ gst_ffmpegdec_init (GstFFMpegDec * ffmpegdec)
|
||||||
ffmpegdec->waiting_for_key = TRUE;
|
ffmpegdec->waiting_for_key = TRUE;
|
||||||
ffmpegdec->hurry_up = ffmpegdec->lowres = 0;
|
ffmpegdec->hurry_up = ffmpegdec->lowres = 0;
|
||||||
ffmpegdec->direct_rendering = DEFAULT_DIRECT_RENDERING;
|
ffmpegdec->direct_rendering = DEFAULT_DIRECT_RENDERING;
|
||||||
|
ffmpegdec->do_padding = DEFAULT_DO_PADDING;
|
||||||
|
|
||||||
ffmpegdec->format.video.fps_n = -1;
|
ffmpegdec->format.video.fps_n = -1;
|
||||||
ffmpegdec->format.video.old_fps_n = -1;
|
ffmpegdec->format.video.old_fps_n = -1;
|
||||||
|
@ -1268,8 +1278,8 @@ get_output_buffer (GstFFMpegDec * ffmpegdec, GstBuffer ** outbuf)
|
||||||
if (ffmpegdec->picture->opaque != NULL) {
|
if (ffmpegdec->picture->opaque != NULL) {
|
||||||
/* we allocated a picture already for ffmpeg to decode into, let's pick it
|
/* we allocated a picture already for ffmpeg to decode into, let's pick it
|
||||||
* up and use it now. */
|
* up and use it now. */
|
||||||
GST_LOG_OBJECT (ffmpegdec, "using opaque buffer");
|
|
||||||
*outbuf = (GstBuffer *) ffmpegdec->picture->opaque;
|
*outbuf = (GstBuffer *) ffmpegdec->picture->opaque;
|
||||||
|
GST_LOG_OBJECT (ffmpegdec, "using opaque buffer %p", *outbuf);
|
||||||
#ifndef EXTRA_REF
|
#ifndef EXTRA_REF
|
||||||
gst_buffer_ref (*outbuf);
|
gst_buffer_ref (*outbuf);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1986,7 +1996,7 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
|
||||||
{
|
{
|
||||||
GstFFMpegDec *ffmpegdec;
|
GstFFMpegDec *ffmpegdec;
|
||||||
GstFFMpegDecClass *oclass;
|
GstFFMpegDecClass *oclass;
|
||||||
guint8 *data, *bdata;
|
guint8 *data, *bdata, *pdata;
|
||||||
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, in_duration;
|
GstClockTime in_timestamp, in_duration;
|
||||||
|
@ -2108,9 +2118,26 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
|
||||||
ffmpegdec->in_ts = in_timestamp;
|
ffmpegdec->in_ts = in_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ffmpegdec->do_padding) {
|
||||||
|
/* add padding */
|
||||||
|
if (ffmpegdec->padded_size <= size + FF_INPUT_BUFFER_PADDING_SIZE) {
|
||||||
|
ffmpegdec->padded_size = size + FF_INPUT_BUFFER_PADDING_SIZE;
|
||||||
|
ffmpegdec->padded = g_realloc (ffmpegdec->padded, ffmpegdec->padded_size);
|
||||||
|
GST_LOG_OBJECT (ffmpegdec, "resized padding buffer to %d",
|
||||||
|
ffmpegdec->padded_size);
|
||||||
|
}
|
||||||
|
memcpy (ffmpegdec->padded, data, size);
|
||||||
|
memset (ffmpegdec->padded + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
|
|
||||||
|
pdata = ffmpegdec->padded;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdata = data;
|
||||||
|
}
|
||||||
|
|
||||||
/* decode a frame of audio/video now */
|
/* decode a frame of audio/video now */
|
||||||
len =
|
len =
|
||||||
gst_ffmpegdec_frame (ffmpegdec, data, size, &have_data, in_timestamp,
|
gst_ffmpegdec_frame (ffmpegdec, pdata, size, &have_data, in_timestamp,
|
||||||
in_duration, &ret);
|
in_duration, &ret);
|
||||||
|
|
||||||
if (ret != GST_FLOW_OK) {
|
if (ret != GST_FLOW_OK) {
|
||||||
|
@ -2214,6 +2241,9 @@ gst_ffmpegdec_change_state (GstElement * element, GstStateChange transition)
|
||||||
gst_ffmpegdec_close (ffmpegdec);
|
gst_ffmpegdec_close (ffmpegdec);
|
||||||
GST_OBJECT_UNLOCK (ffmpegdec);
|
GST_OBJECT_UNLOCK (ffmpegdec);
|
||||||
clear_queued (ffmpegdec);
|
clear_queued (ffmpegdec);
|
||||||
|
g_free (ffmpegdec->padded);
|
||||||
|
ffmpegdec->padded = NULL;
|
||||||
|
ffmpegdec->padded_size = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2239,6 +2269,9 @@ gst_ffmpegdec_set_property (GObject * object,
|
||||||
case PROP_DIRECT_RENDERING:
|
case PROP_DIRECT_RENDERING:
|
||||||
ffmpegdec->direct_rendering = g_value_get_boolean (value);
|
ffmpegdec->direct_rendering = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DO_PADDING:
|
||||||
|
ffmpegdec->do_padding = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -2261,6 +2294,9 @@ gst_ffmpegdec_get_property (GObject * object,
|
||||||
case PROP_DIRECT_RENDERING:
|
case PROP_DIRECT_RENDERING:
|
||||||
g_value_set_boolean (value, ffmpegdec->direct_rendering);
|
g_value_set_boolean (value, ffmpegdec->direct_rendering);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DO_PADDING:
|
||||||
|
g_value_set_boolean (value, ffmpegdec->do_padding);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue