/// <summary> /// Cria o Output Node(Nó de saída), node responsável pelo codificador de audio ou video para o fluxo no arquivo carregado. /// </summary> /// <param name="Param_Sink">Uma interface de ativação para um Media Sink(Dissipador/Decoder) que representa o SAR(Áudio) ou o EVR(Vídeo).</param> /// <param name="Param_OutNode">Retorna uma interface para o nó de saída.</param> /// <returns></returns> public CarenResult CreateOutputNodeToTopology(ICarenMFActivate Param_Sink, out ICarenMFTopologyNode Param_OutNode) { //Variavel a ser retornada. CarenResult Resultado = ResultCode.SS_OK; //Cria o nó de destino. Param_OutNode = new CarenMFTopologyNode(CA_MF_TOPOLOGY_TYPE.MF_TOPOLOGY_OUTPUT_NODE); //Adiciona o Sink ao nó Resultado = Param_OutNode.SetObject(Param_Sink); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar adicionar o Sink ao nó de saida!", true); //Sai do método. goto Done; } //Adiciona o nó a topologia. Resultado = myMediaSession.Topologia.AddNode(Param_OutNode); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar adicionar o nó de saida a topologia.", true); //Sai do método. goto Done; } //Informa um atributo que indica que a Media Session para não desligar o objeto que pertence a este nó de topologia. Resultado = Param_OutNode.SetUINT32(GUIDs_MFAttributes_TopologyNode.MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, 1); // 1 - TRUE | 0 - FALSE Done :; //Retorna o resultado. return(Resultado); }
/// <summary> /// Cria um Ativador para o Media Sink apropriado com base no descritor de fluxo. O ativador pode ser um (SAR - Streaming Audio Render) ou o EVR(Enhanced Video Renderer) /// </summary> /// <param name="Param_StreamDesc">O descritor do fluxo a ter o ativador de midia criado.</param> /// <param name="OutAtivador">Retorna o ativador de midia apropriado para o descritor de midia informado.</param> /// <returns></returns> public CarenResult CreateMediaSinkByStream(ICarenMFStreamDescriptor Param_StreamDesc, out ICarenMFActivate Param_OutAtivador) { //Variavel a ser retornada. CarenResult Resultado = ResultCode.SS_OK; //Variaveis utilizadas. ICarenMFMediaTypeHandler MediaTypeHandler = null; Param_OutAtivador = null; //Recupera o type handler para o descritor de fluxo. Resultado = Param_StreamDesc.GetMediaTypeHandler(out MediaTypeHandler); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar recuperar o Type Handler para o descritor de fluxo informado.", true); //Sai do método. goto Done; } //Obtém o tipo principal da midia Resultado = MediaTypeHandler.GetMajorType(out _, out CA_MAJOR_MEDIA_TYPES OutTipoPrincipal); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar recupera o tipo principal da midia no desctitor de fluxo.", true); //Sai do método. goto Done; } //Verifica o tipo principal da midia e cria o ativador com base no valor. if (OutTipoPrincipal == CA_MAJOR_MEDIA_TYPES.TP_Audio) { //Cria um ativador para o media sink do SAR. Resultado = MFTFuncs._MFCreateAudioRendererActivate(Param_OutAtivador = new CarenMFActivate()); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar criar o SAR.", true); //Sai do método. goto Done; } } else if (OutTipoPrincipal == CA_MAJOR_MEDIA_TYPES.TP_Video) { //Cria um ativador para o media sink do EVR. Resultado = MFTFuncs._MFCreateVideoRendererActivate(myMediaSession.HandleVideoPlayback, Param_OutAtivador = new CarenMFActivate()); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar criar o EVR.", true); //Sai do método. goto Done; } } else { //Chama uma mensagem de erro. ShowMensagem("O tipo do fluxo principal não é suportado!!", true); //Sai do método. goto Done; } Done :; //Libera as interfaces. SafeReleaseInterface(MediaTypeHandler); //Retorna o resultado. return(Resultado); }
/// <summary> /// Método responsável por configurar o Media Sink(Dissipador/Decoder) para o fluxo selecionado e conectar o nó de entra ao de saída. /// </summary> /// <param name="Param_Id">O ID do fluxo a ser criado o Media Sink adequado.</param> /// <returns></returns> public CarenResult Configurar_Nodes_Topologia(uint Param_Id) { //Variavel que vai retornar o resultado da operação. CarenResult Resultado = ResultCode.SS_OK; //Variaveis utilizadas. ICarenMFStreamDescriptor OutStreamIdDescriptor = null; ICarenMFActivate OutSinkActivator = null; ICarenMFTopologyNode OutSourceNode = null; ICarenMFTopologyNode OutOutputNode = null; //Recupera a interface para o descritor do fluxo no id. Resultado = myMediaSession.DescritorMidia.GetStreamDescriptorByIndex(Param_Id, out bool OutSelecionado, out OutStreamIdDescriptor); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar obter o descritor de fluxo para a midia carregada!", true); //Sai do método. goto Done; } //Verifica se está selecionado e configura. if (!OutSelecionado) { //Não está selecionado.. //Sai do método goto Done; } //Cria um ativador para o media sink CreateMediaSinkByStream(OutStreamIdDescriptor, out OutSinkActivator); //Cria e adiciona o nó de entrada. CreateSourceNodeToTopology(OutStreamIdDescriptor, out OutSourceNode); //Cria e adiciona o nó de saida. CreateOutputNodeToTopology(OutSinkActivator, out OutOutputNode); //Conecta o nó de entrada ao nó de saida. Resultado = OutSourceNode.ConnectOutput(0, OutOutputNode, 0); //Verifica se não houve erro if (Resultado.StatusCode != ResultCode.SS_OK) { //Falhou ao realizar a operação. //Chama uma mensagem de erro. ShowMensagem("Ocorreu uma falha ao tentar conectar o nó de entrada ao nó de saida!", true); //Sai do método. goto Done; } Done :; //Retorna o resultado. return(Resultado); }