/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under GNU LESSER GENERAL PUBLIC LICENSE Version 3. */ package com.ttProject.flazr.test.publish; import java.util.concurrent.TimeUnit; import org.jboss.netty.channel.Channel; import org.jboss.netty.util.HashedWheelTimer; import org.jboss.netty.util.Timeout; import org.jboss.netty.util.Timer; import org.jboss.netty.util.TimerTask; import com.flazr.rtmp.RtmpMessage; import com.flazr.rtmp.RtmpPublisher; import com.flazr.rtmp.RtmpReader; import com.flazr.rtmp.message.Command; /** * 配信用のpublisher設定 * とりあえず実体はjcasterのmyRtmpPublisherコピー * @author taktod */ public class SendRtmpPublisher extends RtmpPublisher { /** netty用のtimer */ private Timer timer = new HashedWheelTimer(10, TimeUnit.MILLISECONDS); /** 動作時のstreamId */ private int streamId; /** thread解放のタイミングコントロール */ private int counter = 0; /** * コンストラクタ * @param reader * @param streamId * @param bufferDuration * @param useSharedTimer * @param aggregateModeEnabled */ public SendRtmpPublisher(RtmpReader reader, int streamId, int bufferDuration, boolean useSharedTimer, boolean aggregateModeEnabled) { super(reader, streamId, bufferDuration, useSharedTimer, aggregateModeEnabled); this.streamId = streamId; } /** * 停止時の転送メッセージ */ @Override protected RtmpMessage[] getStopMessages(long paramLong) { // とりあえず閉じるときにunpublishの命令をなげておく。 return new RtmpMessage[]{Command.unpublish(streamId)}; } /** * 次の処理に進める(hookしてthreadを解放してやることで転送が止まる問題に対処したい。) */ public void fireNext(final Channel channel, final long delay) { if(counter > 2) { timer.newTimeout(new TimerTask() { /** * 実行処理 */ @Override public void run(Timeout timeout) throws Exception { fireNext2(channel, delay); } }, 10, TimeUnit.MILLISECONDS); } else { counter ++; super.fireNext(channel, delay); } } /** * 次の処理にすすめるための中間処理(timeTaskでそのままsuper.fireNextが呼び出せないため) * @param channel * @param delay */ private void fireNext2(final Channel channel, final long delay) { super.fireNext(channel, delay); } }