package com.jcumulus.server.rtmfp.application; /** * jCumulus is a Java port of Cumulus OpenRTMP * * Copyright 2011 OpenRTMFP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License received along this program for more * details (or else see http://www.gnu.org/licenses/). * * * This file is a part of jCumulus. */ import com.jcumulus.server.rtmfp.packet.*; import com.jcumulus.server.rtmfp.publisher.FlowWriter; import com.jcumulus.server.rtmfp.flow.F; import com.jcumulus.server.rtmfp.stream.BinaryWriter; import org.apache.log4j.Logger; public class Listener { private static final Logger E = Logger.getLogger(Listener.class); private Publication K; private int B; private boolean A; private int D; private boolean F; private int G; private int H; private int L; private FlowWriter J; private AudioWriter C; private com.jcumulus.server.rtmfp.application.VideoWriter I; public Listener(int i, Publication b, FlowWriter h, boolean flag) { B = i; K = b; J = h; A = flag; } public Publication getPublication() { return K; } public void C() { if(C == null) C = J.B(); else E.warn((new StringBuilder()).append("Listener ").append(B).append(" audio track has already been initialized").toString()); if(I == null) I = J.K(); else E.warn((new StringBuilder()).append("Listener ").append(B).append(" video track has already been initialized").toString()); A(); } private void A() { if(I != null) A(((FlowWriter) (I))); if(C != null) A(((FlowWriter) (C))); A(J); D++; } private int A(int i) { if(i == 0) i = 1; if(G == 0 && H == 0) { G = i; E.debug((new StringBuilder()).append("Deltatime assignment : ").append(G).toString()); } if(G > i) { E.warn((new StringBuilder()).append("Time infererior to deltaTime on listener ").append(B).append(", certainly a non increasing time").toString()); G = i; } L = (i - G) + H; return L; } private void A(FlowWriter h) { E.debug((new StringBuilder()).append("Writing bound ").append(D).append(" on flow writer ").append(h.E()).toString()); BinaryWriter a = h.A(false); a.A((short)34); a.A(D); a.A(3); } public void A(String s) { J.A("Play.PublishNotify", (new StringBuilder()).append(s).append(" is now published").toString()); F = false; } public void B(String s) { J.A("Play.UnpublishNotify", (new StringBuilder()).append(s).append(" is now unpublished").toString()); G = 0; H = L; C.M().E(); I.M().E(); } public void B() { if(C != null) C.A(); if(I != null) I.A(); J.B(true); } public void A(String s, Packet a) { if(A) { int i = s.length() + 9; if(a.H() >= i) { a.E(a.H() - i); J.A(a.G(), a.I()); return; } E.warn((new StringBuilder()).append("Written unbuffered impossible, it requires ").append(i).append(" head bytes available on PacketReader given").toString()); } J.B(s).E().B(a.G()); } public void B(int i, Packet a) { if(C == null) { E.error((new StringBuilder()).append("Listener ").append(B).append(" must be initialized before to be used").toString()); return; } if(C.L()) { C.C(false); A(); } C.A(A(i), a, A); } public void A(int i, Packet a) { if(I == null) { E.error((new StringBuilder()).append("Listener ").append(B).append(" must be initialized before to be used").toString()); return; } if((a.K() & 0xf0) == 16) F = true; if(!F) { E.debug((new StringBuilder()).append("Video frame dropped for listener ").append(B).append(" to wait first key frame").toString()); I.M().G(); return; } if(I.L()) { I.C(false); A(); } I.A(A(i), a, A); } }