GstStateChangeReturn gst_kvs_plugin_change_state()

in gst/gst-kvs-plugin/src/GstPlugin.c [1218:1300]


GstStateChangeReturn gst_kvs_plugin_change_state(GstElement* element, GstStateChange transition)
{
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
    PGstKvsPlugin pGstKvsPlugin = GST_KVS_PLUGIN(element);
    STATUS status = STATUS_SUCCESS;

    switch (transition) {
        case GST_STATE_CHANGE_NULL_TO_READY:
            if (STATUS_FAILED(status = initKinesisVideoStructs(pGstKvsPlugin))) {
                DLOGE("Failed to initialize KVS structures with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }

            if (STATUS_FAILED(status = initKinesisVideoProducer(pGstKvsPlugin))) {
                DLOGE("Failed to initialize KVS producer with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }
            if (STATUS_FAILED(status = initTrackData(pGstKvsPlugin))) {
                DLOGE("Failed to initialize track with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }

            pGstKvsPlugin->firstPts = GST_CLOCK_TIME_NONE;
            pGstKvsPlugin->producerStartTime = GST_CLOCK_TIME_NONE;

            if (STATUS_FAILED(status = initKinesisVideoStream(pGstKvsPlugin))) {
                DLOGE("Failed to initialize KVS stream with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }

            ATOMIC_STORE_BOOL(&pGstKvsPlugin->streamStopped, FALSE);
            pGstKvsPlugin->streamStatus = STATUS_SUCCESS;
            pGstKvsPlugin->lastDts = 0;
            pGstKvsPlugin->basePts = 0;
            pGstKvsPlugin->frameCount = 0;

            pGstKvsPlugin->detectedCpdFormat = ELEMENTARY_STREAM_NAL_FORMAT_UNKNOWN;

            // This needs to happen after we've read in ALL of the properties
            if (!pGstKvsPlugin->gstParams.disableBufferClipping) {
                gst_collect_pads_set_clip_function(pGstKvsPlugin->collect, GST_DEBUG_FUNCPTR(gst_collect_pads_clip_running_time), pGstKvsPlugin);
            }

            if (STATUS_FAILED(status = initKinesisVideoWebRtc(pGstKvsPlugin))) {
                DLOGE("Failed to initialize KVS signaling client with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }

            // Schedule the WebRTC master session servicing periodic routine
            if (STATUS_FAILED(status = timerQueueAddTimer(pGstKvsPlugin->kvsContext.timerQueueHandle, GST_PLUGIN_SERVICE_ROUTINE_START,
                                                          GST_PLUGIN_SERVICE_ROUTINE_PERIOD, sessionServiceHandler, (UINT64) pGstKvsPlugin,
                                                          &pGstKvsPlugin->serviceRoutineTimerId))) {
                DLOGE("Failed to schedule WebRTC service routine with 0x%08x", status);
                ret = GST_STATE_CHANGE_FAILURE;
                goto CleanUp;
            }

            break;
        case GST_STATE_CHANGE_READY_TO_PAUSED:
            gst_collect_pads_start(pGstKvsPlugin->collect);
            break;
        case GST_STATE_CHANGE_PAUSED_TO_READY:
            gst_collect_pads_stop(pGstKvsPlugin->collect);
            break;
        default:
            break;
    }

    ret = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);

CleanUp:

    if (ret != GST_STATE_CHANGE_SUCCESS) {
        GST_ELEMENT_ERROR(pGstKvsPlugin, LIBRARY, INIT, (NULL), ("Failed to initialize with 0x%08x", status));
    }

    return ret;
}