static GstStateChangeReturn theora_enc_change_state (GstElement * element, GstStateChange transition) { GstTheoraEnc *enc; GstStateChangeReturn ret; enc = GST_THEORA_ENC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_DEBUG_OBJECT (enc, "READY->PAUSED Initing theora state"); theora_info_init (&enc->info); theora_comment_init (&enc->comment); enc->packetno = 0; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_DEBUG_OBJECT (enc, "PAUSED->READY Clearing theora state"); theora_clear (&enc->state); theora_comment_clear (&enc->comment); theora_info_clear (&enc->info); theora_enc_clear (enc); enc->initialised = FALSE; break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static GstStateChangeReturn theora_enc_change_state (GstElement * element, GstStateChange transition) { GstTheoraEnc *enc; GstStateChangeReturn ret; enc = GST_THEORA_ENC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_DEBUG_OBJECT (enc, "READY->PAUSED Initing theora state"); th_info_init (&enc->info); th_comment_init (&enc->comment); enc->packetno = 0; enc->force_keyframe = FALSE; if (enc->multipass_mode >= MULTIPASS_MODE_FIRST_PASS) { GError *err = NULL; if (!enc->multipass_cache_file) { ret = GST_STATE_CHANGE_FAILURE; GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), (NULL)); return ret; } enc->multipass_cache_fd = g_io_channel_new_file (enc->multipass_cache_file, (enc->multipass_mode == MULTIPASS_MODE_FIRST_PASS ? "w" : "r"), &err); if (enc->multipass_mode == MULTIPASS_MODE_SECOND_PASS) enc->multipass_cache_adapter = gst_adapter_new (); if (!enc->multipass_cache_fd) { ret = GST_STATE_CHANGE_FAILURE; GST_ELEMENT_ERROR (enc, RESOURCE, OPEN_READ, (NULL), ("Failed to open multipass cache file: %s", err->message)); g_error_free (err); return ret; } g_io_channel_set_encoding (enc->multipass_cache_fd, NULL, NULL); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_DEBUG_OBJECT (enc, "PAUSED->READY Clearing theora state"); if (enc->encoder) { th_encode_free (enc->encoder); enc->encoder = NULL; } th_comment_clear (&enc->comment); th_info_clear (&enc->info); theora_enc_clear (enc); enc->initialised = FALSE; break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }