if (!proxy) {
if (status == GST_VAAPI_DECODER_STATUS_ERROR_NO_SURFACE) {
g_mutex_lock(&decode->decoder_mutex);
- if (decode->break_flag){
- goto handle_break_flag;
+ if (decode->escape_decoding){
+ goto handle_escape_decoding;
}
g_cond_wait(
&decode->decoder_ready,
&decode->decoder_mutex
);
- if (decode->break_flag){
- goto handle_break_flag;
+ if (decode->escape_decoding){
+ goto handle_escape_decoding;
}
g_mutex_unlock(&decode->decoder_mutex);
try_again = TRUE;
return GST_FLOW_OK;
/* ERRORS */
-handle_break_flag:
+handle_escape_decoding:
{
g_mutex_unlock(&decode->decoder_mutex);
- goto error_receive_event;
- }
-error_receive_event:
- {
+ GST_INFO("Escape decoding wait: flush event comes for seek etc.");
return GST_FLOW_UNEXPECTED;
}
error_decode:
G_OBJECT_CLASS(gst_vaapidecode_parent_class)->finalize(object);
}
+typedef struct {
+ int trans;
+ char *trans_name;
+} _GstStateChangeMap;
+_GstStateChangeMap gst_state_change_string_map[] = {
+ {GST_STATE_CHANGE_NULL_TO_READY, "GST_STATE_CHANGE_NULL_TO_READY"},
+ {GST_STATE_CHANGE_READY_TO_PAUSED, "GST_STATE_CHANGE_READY_TO_PAUSED",},
+ {GST_STATE_CHANGE_PAUSED_TO_PLAYING,"GST_STATE_CHANGE_PAUSED_TO_PLAYING"},
+ {GST_STATE_CHANGE_PLAYING_TO_PAUSED,"GST_STATE_CHANGE_PLAYING_TO_PAUSED"},
+ {GST_STATE_CHANGE_PAUSED_TO_READY, "GST_STATE_CHANGE_PAUSED_TO_READY"},
+ {GST_STATE_CHANGE_READY_TO_NULL, "GST_STATE_CHANGE_READY_TO_NULL"},
+ {-1, "UNDEFINED_STATE_CHANGE"}
+};
+
static GstStateChangeReturn
gst_vaapidecode_change_state(GstElement *element, GstStateChange transition)
{
GstVaapiDecode * const decode = GST_VAAPIDECODE(element);
GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ int i;
+ for (i=0; i<sizeof(gst_state_change_string_map)/sizeof(_GstStateChangeMap);i++) {
+ if (gst_state_change_string_map[i].trans == transition)
+ GST_INFO(gst_state_change_string_map[i].trans_name);
+ }
+
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
decode->is_ready = TRUE;
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
- g_mutex_lock(&decode->decoder_mutex);
- decode->break_flag = TRUE;
- g_cond_signal(&decode->decoder_ready);
- g_mutex_unlock(&decode->decoder_mutex);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
gst_vaapidecode_destroy(decode);
{
GstVaapiDecode * const decode = GST_VAAPIDECODE(GST_OBJECT_PARENT(pad));
- GST_DEBUG("handle sink event '%s'", GST_EVENT_TYPE_NAME(event));
+ GST_INFO("handle sink event '%s'", GST_EVENT_TYPE_NAME(event));
+
/* Propagate event downstream */
switch (GST_EVENT_TYPE(event)) {
+ case GST_EVENT_FLUSH_START:
+ g_mutex_lock(&decode->decoder_mutex);
+ decode->escape_decoding = TRUE;
+ g_cond_signal(&decode->decoder_ready);
+ g_mutex_unlock(&decode->decoder_mutex);
+ break;
case GST_EVENT_FLUSH_STOP:
+ g_mutex_lock(&decode->decoder_mutex);
+ decode->escape_decoding = FALSE;
+ g_mutex_unlock(&decode->decoder_mutex);
gst_segment_init(&decode->segment, GST_FORMAT_UNDEFINED);
if (decode->decoder)
gst_vaapi_decoder_clear_buffer(decode->decoder);
gst_vaapidecode_configure_segment(decode, event);
break;
case GST_EVENT_EOS:
- g_mutex_lock(&decode->decoder_mutex);
- decode->break_flag = TRUE;
- g_cond_signal(&decode->decoder_ready);
- g_mutex_unlock(&decode->decoder_mutex);
if (!gst_vaapidecode_flush(decode)) {
GST_WARNING("failed to flush buffers");
}
decode->render_time_base = 0;
decode->last_buffer_time = 0;
decode->is_ready = FALSE;
- decode->break_flag = FALSE;
+ decode->escape_decoding = FALSE;
g_mutex_init(&decode->decoder_mutex);
g_cond_init(&decode->decoder_ready);