try{
PluginInterface av_pi = plugin_interface.getPluginManager().getPluginInterfaceByID( "azupnpav" );
if ( av_pi == null ){
throw( new TranscodeException( "Media Server plugin not found" ));
}
final TranscodeProviderJob[] xcode_job = { null };
URL source_url = null;
TranscodePipe pipe = null;
if ( direct_input ){
if ( input.getDownloaded() == input.getLength()){
File file = input.getFile();
if ( file.exists() && file.length() == input.getLength()){
source_url = file.toURI().toURL();
}
}
if ( source_url == null ){
manager.log( "Failed to use direct input as source file doesn't exist/incomplete" );
}
}
if ( source_url == null ){
IPCInterface av_ipc = av_pi.getIPC();
String url_str = (String)av_ipc.invoke( "getContentURL", new Object[]{ input });
if ( url_str == null || url_str.length() == 0 ){
// see if we can use the file directly
File source_file = input.getFile();
if ( source_file.exists()){
pipe =
new TranscodePipeFileSource(
source_file,
new TranscodePipe.errorListener()
{
public void
error(
Throwable e )
{
_adapter.failed(
new TranscodeException( "File access error", e ));
if ( xcode_job[0] != null ){
xcode_job[0].cancel();
}
}
});
source_url = new URL( "http://127.0.0.1:" + pipe.getPort() + "/" );
}else{
throw( new TranscodeException( "Source file doesn't exist" ));
}
}else{
source_url = new URL( url_str );
pipe = new TranscodePipeStreamSource( source_url.getHost(), source_url.getPort());
source_url = UrlUtils.setHost( source_url, "127.0.0.1" );
source_url = UrlUtils.setPort( source_url, pipe.getPort());
}
}
final TranscodePipe f_pipe = pipe;
try{
final IPCInterface ipc = plugin_interface.getIPC();
final Object context;
final TranscodeProviderAdapter adapter;
if ( output.getProtocol().equals( "tcp" )){
adapter = _adapter;
context =
ipc.invoke(
"transcodeToTCP",
new Object[]{
((TranscodeProviderAnalysisImpl)analysis).getResult(),
source_url,
profile.getName(),
output.getPort() });
}else{
final File file = new File( output.toURI());
adapter =
new TranscodeProviderAdapter()
{
public void
updateProgress(
int percent,
int eta_secs,
int width,
int height )
{
_adapter.updateProgress( percent, eta_secs, width, height );
}
public void
streamStats(
long connect_rate,
long write_speed )
{
_adapter.streamStats(connect_rate, write_speed);
}
public void
failed(
TranscodeException error )
{
try{
file.delete();
}finally{
_adapter.failed( error );
}
}
public void
complete()
{
_adapter.complete();
}
};
context =
ipc.invoke(
"transcodeToFile",
new Object[]{
((TranscodeProviderAnalysisImpl)analysis).getResult(),
source_url,
profile.getName(),
file });
}
new AEThread2( "xcodeStatus", true )
{
public void
run()
{
try{
boolean in_progress = true;
while( in_progress ){
in_progress = false;
if ( f_pipe != null ){
adapter.streamStats( f_pipe.getConnectionRate(), f_pipe.getWriteSpeed());
}
try{
Map status = (Map)ipc.invoke( "getTranscodeStatus", new Object[]{ context });
long state = (Long)status.get( "state" );
if ( state == 0 ){
int percent = (Integer)status.get( "percent" );
Integer i_eta = (Integer)status.get( "eta_secs" );
int eta = i_eta==null?-1:i_eta;
Integer i_width = (Integer)status.get( "new_width" );
int width = i_width==null?0:i_width;
Integer i_height = (Integer)status.get( "new_height" );
int height = i_height==null?0:i_height;
adapter.updateProgress( percent, eta, width, height );
if ( percent == 100 ){
adapter.complete();
}else{
in_progress = true;
Thread.sleep(1000);
}
}else if ( state == 1 ){
adapter.failed( new TranscodeException( "Transcode cancelled" ));
}else{
adapter.failed( new TranscodeException( "Transcode failed", (Throwable)status.get( "error" )));
}
}catch( Throwable e ){
adapter.failed( new TranscodeException( "Failed to get status", e ));
}
}
}finally{
if ( f_pipe != null ){
f_pipe.destroy();
}
}
}
}.start();
xcode_job[0] =
new TranscodeProviderJob()
{
public void
pause()
{
if ( f_pipe != null ){
f_pipe.pause();
}
}
public void
resume()
{
if ( f_pipe != null ){
f_pipe.resume();
}
}
public void
cancel()
{
try{
ipc.invoke( "cancelTranscode", new Object[]{ context });
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
public void
setMaxBytesPerSecond(
int max )
{
if ( f_pipe != null ){
f_pipe.setMaxBytesPerSecond( max );
}
}
};
return( xcode_job[0] );
}catch( Throwable e ){
if ( pipe != null ){
pipe.destroy();
}
throw( e );
}
}catch( TranscodeException e ){
throw( e );
}catch( Throwable e ){
throw( new TranscodeException( "transcode failed", e ));
}
}