mimic: Initialize encoder/decoders in state change and setcaps where possible
This commit is contained in:
parent
2eee0091f3
commit
fe7fe29221
@ -216,7 +216,7 @@ gst_mim_dec_chain (GstPad * pad, GstBuffer * in)
|
|||||||
frame_body =
|
frame_body =
|
||||||
(guchar *) gst_adapter_peek (mimdec->adapter, mimdec->payload_size);
|
(guchar *) gst_adapter_peek (mimdec->adapter, mimdec->payload_size);
|
||||||
|
|
||||||
if (mimdec->dec == NULL) {
|
if (mimdec->buffer_size < 0) {
|
||||||
/* Check if its a keyframe, otherwise skip it */
|
/* Check if its a keyframe, otherwise skip it */
|
||||||
if (GUINT32_FROM_LE (*((guint32 *) (frame_body + 12))) != 0) {
|
if (GUINT32_FROM_LE (*((guint32 *) (frame_body + 12))) != 0) {
|
||||||
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
||||||
@ -225,20 +225,7 @@ gst_mim_dec_chain (GstPad * pad, GstBuffer * in)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mimdec->dec = mimic_open ();
|
|
||||||
if (mimdec->dec == NULL) {
|
|
||||||
|
|
||||||
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
|
||||||
mimdec->have_header = FALSE;
|
|
||||||
GST_ELEMENT_ERROR (mimdec, LIBRARY, INIT, (NULL), ("mimic_open error"));
|
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mimic_decoder_init (mimdec->dec, frame_body)) {
|
if (!mimic_decoder_init (mimdec->dec, frame_body)) {
|
||||||
mimic_close (mimdec->dec);
|
|
||||||
mimdec->dec = NULL;
|
|
||||||
|
|
||||||
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
||||||
mimdec->have_header = FALSE;
|
mimdec->have_header = FALSE;
|
||||||
GST_ELEMENT_ERROR (mimdec, LIBRARY, INIT, (NULL),
|
GST_ELEMENT_ERROR (mimdec, LIBRARY, INIT, (NULL),
|
||||||
@ -249,9 +236,6 @@ gst_mim_dec_chain (GstPad * pad, GstBuffer * in)
|
|||||||
|
|
||||||
if (!mimic_get_property (mimdec->dec, "buffer_size",
|
if (!mimic_get_property (mimdec->dec, "buffer_size",
|
||||||
&mimdec->buffer_size)) {
|
&mimdec->buffer_size)) {
|
||||||
mimic_close (mimdec->dec);
|
|
||||||
mimdec->dec = NULL;
|
|
||||||
|
|
||||||
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
gst_adapter_flush (mimdec->adapter, mimdec->payload_size);
|
||||||
mimdec->have_header = FALSE;
|
mimdec->have_header = FALSE;
|
||||||
GST_ELEMENT_ERROR (mimdec, LIBRARY, INIT, (NULL),
|
GST_ELEMENT_ERROR (mimdec, LIBRARY, INIT, (NULL),
|
||||||
@ -340,9 +324,34 @@ static GstStateChangeReturn
|
|||||||
gst_mim_dec_change_state (GstElement * element, GstStateChange transition)
|
gst_mim_dec_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstMimDec *mimdec;
|
GstMimDec *mimdec;
|
||||||
|
GstStateChangeReturn ret;
|
||||||
|
|
||||||
mimdec = GST_MIM_DEC (element);
|
mimdec = GST_MIM_DEC (element);
|
||||||
|
|
||||||
|
switch (transition) {
|
||||||
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
|
mimdec->dec = mimic_open ();
|
||||||
|
if (!mimdec) {
|
||||||
|
GST_ERROR_OBJECT (mimdec, "mimic_open failed");
|
||||||
|
return GST_STATE_CHANGE_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
|
GST_OBJECT_LOCK (element);
|
||||||
|
mimdec->need_newsegment = TRUE;
|
||||||
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||||
|
|
||||||
|
if (ret == GST_STATE_CHANGE_FAILURE)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
GST_OBJECT_LOCK (element);
|
GST_OBJECT_LOCK (element);
|
||||||
@ -356,16 +365,11 @@ gst_mim_dec_change_state (GstElement * element, GstStateChange transition)
|
|||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (element);
|
GST_OBJECT_UNLOCK (element);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
|
||||||
GST_OBJECT_LOCK (element);
|
|
||||||
mimdec->need_newsegment = TRUE;
|
|
||||||
GST_OBJECT_UNLOCK (element);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -209,48 +209,60 @@ gst_mim_enc_get_property (GObject * object, guint prop_id,
|
|||||||
static gboolean
|
static gboolean
|
||||||
gst_mim_enc_setcaps (GstPad * pad, GstCaps * caps)
|
gst_mim_enc_setcaps (GstPad * pad, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstMimEnc *filter;
|
GstMimEnc *mimenc;
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
int ret = TRUE, height, width;
|
int ret = TRUE, height, width;
|
||||||
|
|
||||||
filter = GST_MIM_ENC (gst_pad_get_parent (pad));
|
mimenc = GST_MIM_ENC (gst_pad_get_parent (pad));
|
||||||
g_return_val_if_fail (filter != NULL, FALSE);
|
g_return_val_if_fail (mimenc != NULL, FALSE);
|
||||||
g_return_val_if_fail (GST_IS_MIM_ENC (filter), FALSE);
|
g_return_val_if_fail (GST_IS_MIM_ENC (mimenc), FALSE);
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
ret = gst_structure_get_int (structure, "width", &width);
|
ret = gst_structure_get_int (structure, "width", &width);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
GST_DEBUG_OBJECT (filter, "No width set");
|
GST_DEBUG_OBJECT (mimenc, "No width set");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = gst_structure_get_int (structure, "height", &height);
|
ret = gst_structure_get_int (structure, "height", &height);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
GST_DEBUG_OBJECT (filter, "No height set");
|
GST_DEBUG_OBJECT (mimenc, "No height set");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_OBJECT_LOCK (filter);
|
GST_OBJECT_LOCK (mimenc);
|
||||||
|
|
||||||
if (width == 320 && height == 240)
|
if (width == 320 && height == 240)
|
||||||
filter->res = MIMIC_RES_HIGH;
|
mimenc->res = MIMIC_RES_HIGH;
|
||||||
else if (width == 160 && height == 120)
|
else if (width == 160 && height == 120)
|
||||||
filter->res = MIMIC_RES_LOW;
|
mimenc->res = MIMIC_RES_LOW;
|
||||||
else {
|
else {
|
||||||
GST_WARNING_OBJECT (filter, "Invalid resolution %dx%d", width, height);
|
GST_WARNING_OBJECT (mimenc, "Invalid resolution %dx%d", width, height);
|
||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
GST_OBJECT_UNLOCK (filter);
|
GST_OBJECT_UNLOCK (mimenc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
filter->width = (guint16) width;
|
mimenc->width = (guint16) width;
|
||||||
filter->height = (guint16) height;
|
mimenc->height = (guint16) height;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (filter, "Got info from caps w : %d, h : %d",
|
GST_DEBUG_OBJECT (mimenc, "Got info from caps w : %d, h : %d",
|
||||||
filter->width, filter->height);
|
mimenc->width, mimenc->height);
|
||||||
|
|
||||||
GST_OBJECT_UNLOCK (filter);
|
if (!mimic_encoder_init (mimenc->enc, mimenc->res)) {
|
||||||
|
GST_ERROR_OBJECT (mimenc, "mimic_encoder_init error");
|
||||||
|
ret = FALSE;
|
||||||
|
GST_OBJECT_UNLOCK (mimenc);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mimic_get_property (mimenc->enc, "buffer_size", &mimenc->buffer_size)) {
|
||||||
|
GST_ERROR_OBJECT (mimenc, "mimic_get_property(buffer_size) error");
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_OBJECT_UNLOCK (mimenc);
|
||||||
out:
|
out:
|
||||||
gst_object_unref (filter);
|
gst_object_unref (mimenc);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,30 +293,6 @@ gst_mim_enc_chain (GstPad * pad, GstBuffer * in)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mimenc->enc == NULL) {
|
if (mimenc->enc == NULL) {
|
||||||
mimenc->enc = mimic_open ();
|
|
||||||
if (mimenc->enc == NULL) {
|
|
||||||
GST_ELEMENT_ERROR (mimenc, LIBRARY, INIT, (NULL), ("mimic_open error"));
|
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mimic_encoder_init (mimenc->enc, mimenc->res)) {
|
|
||||||
mimic_close (mimenc->enc);
|
|
||||||
mimenc->enc = NULL;
|
|
||||||
GST_ELEMENT_ERROR (mimenc, LIBRARY, INIT, (NULL),
|
|
||||||
("mimic_encoder_init error"));
|
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mimic_get_property (mimenc->enc, "buffer_size", &mimenc->buffer_size)) {
|
|
||||||
mimic_close (mimenc->enc);
|
|
||||||
mimenc->enc = NULL;
|
|
||||||
GST_ELEMENT_ERROR (mimenc, LIBRARY, INIT, (NULL),
|
|
||||||
("mimic_get_property(buffer_size) error"));
|
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = in;
|
buf = in;
|
||||||
@ -546,15 +534,12 @@ gst_mim_enc_change_state (GstElement * element, GstStateChange transition)
|
|||||||
gboolean paused_mode;
|
gboolean paused_mode;
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
GST_OBJECT_LOCK (element);
|
mimenc->enc = mimic_open ();
|
||||||
if (mimenc->enc != NULL) {
|
if (!mimenc) {
|
||||||
mimic_close (mimenc->enc);
|
GST_ERROR_OBJECT (mimenc, "mimic_open failed");
|
||||||
mimenc->enc = NULL;
|
return GST_STATE_CHANGE_FAILURE;
|
||||||
mimenc->buffer_size = -1;
|
|
||||||
mimenc->frames = 0;
|
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (element);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
@ -608,6 +593,17 @@ gst_mim_enc_change_state (GstElement * element, GstStateChange transition)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
|
GST_OBJECT_LOCK (element);
|
||||||
|
if (mimenc->enc != NULL) {
|
||||||
|
mimic_close (mimenc->enc);
|
||||||
|
mimenc->enc = NULL;
|
||||||
|
mimenc->buffer_size = -1;
|
||||||
|
mimenc->frames = 0;
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user