示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }