コード例 #1
0
ファイル: PacketStream.cs プロジェクト: vinaosb/JuvoPlayer
        public void OnDRMFound(DRMInitData data)
        {
            Logger.Info($"{streamType}");

            if (!forceDrmChange && drmSession != null)
            {
                return;
            }

            IDrmSession newSession = drmManager.CreateDRMSession(data);

            // Do not reset wait for DRM event. If there is no valid session
            // do not want to append new data
            //
            if (newSession == null)
            {
                return;
            }

            Logger.Info($"{streamType}: New DRM session found");
            forceDrmChange = false;

            // Decrement use counter for packet stream on old DRM Session
            drmSession?.Release();

            // Add reference count for new session
            newSession.Share();

            // Set new session as current & let data submitters run wild.
            // There is no need to store sessions. They live in player queue
            drmSession = newSession;
        }
コード例 #2
0
        private static IDrmManager CreateDrmManagerFake(IDrmSession drmSessionStub)
        {
            var drmManagerStub = Substitute.For <IDrmManager>();

            drmManagerStub.CreateDRMSession(Arg.Any <DRMInitData>()).Returns(drmSessionStub);
            return(drmManagerStub);
        }
コード例 #3
0
ファイル: CdmInstance.cs プロジェクト: hjhgitw/JuvoPlayer
        private void InstallLicence(IDrmSession session, string responseText)
        {
            var sessionId = session.GetSessionId();

            SessionUpdate(sessionId, responseText);
            session.SetLicenceInstalled();
        }
コード例 #4
0
        public async Task OnDRMFound(DrmInitData data)
        {
            using (await packetStreamLock.LockAsync())
            {
                Logger.Info($"{streamType}");

                if (!forceDrmChange && currentCdmInstance != null)
                {
                    return;
                }

                IDrmSession newSession = await drmManager.GetDrmSession(data);

                // Do not reset wait for DRM event. If there is no valid session
                // do not want to append new data
                //
                if (newSession == null)
                {
                    return;
                }

                Logger.Info($"{streamType}: New DRM session found");
                forceDrmChange = false;

                // Set new session as current & let data submitters run wild.
                // There is no need to store sessions. They live in player queue
                currentCdmInstance = newSession.CdmInstance;
            }
        }
コード例 #5
0
ファイル: DrmSessionCache.cs プロジェクト: vinaosb/JuvoPlayer
        public bool TryAddSession(IEnumerable <byte[]> keys, IDrmSession session)
        {
            var addCount = 0;

            addCount += keys.Count(key => _cache.TryAdd(key, session));

            // Duplicate keys are possible. Check if any were added.
            return(addCount > 0);
        }
コード例 #6
0
ファイル: PacketStream.cs プロジェクト: vinaosb/JuvoPlayer
        public void OnClearStream()
        {
            Logger.Info($"{streamType}");

            // Remove reference count held by Packet Stream.
            // Player may still have packets and process them. Don't force remove
            //
            drmSession?.Release();

            drmSession = null;
            config     = null;
        }
コード例 #7
0
ファイル: DrmSessionCache.cs プロジェクト: vinaosb/JuvoPlayer
        public bool TryGetSession(IEnumerable <byte[]> keys, out IDrmSession session)
        {
            session = null;
            foreach (byte[] key in keys)
            {
                if (_cache.TryGetValue(key, out session))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #8
0
ファイル: CdmInstance.cs プロジェクト: hjhgitw/JuvoPlayer
        private async Task <string> AcquireLicenceFromServer(IDrmSession session, byte[] requestData)
        {
            var        drmDescription = session.GetDrmDescription();
            var        licenceUrl     = new Uri(drmDescription.LicenceUrl);
            HttpClient httpClient     = new HttpClient(new RetryHandler(new HttpClientHandler()));

            httpClient.BaseAddress = licenceUrl;
            Logger.Info(licenceUrl.AbsoluteUri);
            HttpContent content = new ByteArrayContent(requestData);

            content.Headers.ContentLength = requestData.Length;
            if (drmDescription.KeyRequestProperties != null)
            {
                foreach (var property in drmDescription.KeyRequestProperties)
                {
                    if (!property.Key.ToLowerInvariant().Equals("content-type"))
                    {
                        httpClient.DefaultRequestHeaders.Add(property.Key, property.Value);
                    }
                    else if (MediaTypeHeaderValue.TryParse(property.Value, out var mediaType))
                    {
                        content.Headers.ContentType = mediaType;
                    }
                }
            }
            var responseTask = await httpClient.PostAsync(licenceUrl, content);

            var receiveStream = responseTask.Content.ReadAsStreamAsync();
            var readStream    = new StreamReader(await receiveStream, Encoding.GetEncoding(437));
            var responseText  = await readStream.ReadToEndAsync();

            if (!responseText.StartsWith("GLS/1.0 0 OK"))
            {
                return(responseText);
            }
            const string headerMark      = "\r\n\r\n";
            var          headerMarkIndex = responseText.IndexOf(headerMark, StringComparison.Ordinal);

            return(headerMarkIndex == -1 ? responseText : responseText.Substring(headerMarkIndex + headerMark.Length));
        }