/**
 * Copyright (c) 2006 - 2012 Smaxe Ltd (www.smaxe.com).
 * All rights reserved.
 */
import com.smaxe.logger.ILogger;
import com.smaxe.logger.support.Loggers;
import com.smaxe.uv.media.core.VideoFrame;
import com.smaxe.uv.media.java.audio.JavaAudioPlayback;
import com.smaxe.uv.media.java.swing.JVideoScreen;
import com.smaxe.uv.media.player.IMediaPlayerModel;
import com.smaxe.uv.media.player.JMediaPlayer;
import com.smaxe.uv.media.sdk.IMediaPlayerModelSdk;
import com.smaxe.uv.media.sdk.IMediaSdk;
import com.smaxe.uv.media.sdk.MediaSdkFactory;
import com.smaxe.uv.media.sdk.codec.AacJaadAudioCodecSdk;
import com.smaxe.uv.media.sdk.codec.Mp3JavazoomAudioCodecSdk;
import com.smaxe.uv.media.sdk.codec.SpeexAudioCodecSdk;

import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/**
 * <code>ExMediaSdkMediaPlayer</code> - {@link IMediaSdk} example to play media file, rtmp or rtsp resource.
 * 
 * @author Andrei Sochirca
 * @see <a href="http://www.smaxe.com/product.jsf?id=juv-media-sdk" target="_blank">JUV Media SDK</a>
 */
public final class ExMediaSdkMediaPlayer extends Object
{
    /**
     * Entry point.
     * 
     * @param args
     * @throws Exception
     */
    public static void main(final String[] args) throws Exception
    {
        // NOTE:
        // Evaluation version has some limitations:
        // - video decoder watermarks frames (and blacks it sometimes)
        
        final String file = "d:/ratatouille.mp4";
        
        IMediaSdk mediaSdk = MediaSdkFactory.getMediaSdk();
        
        playMedia(mediaSdk, createMediaPlayerModel(mediaSdk, file));
    }
    
    /**
     * Creates {@link IMediaPlayerModel} instance for the <code>url</code>.
     * 
     * @param sdk
     * @param url
     * @return media player model
     * @throws IOException if an I/O exception occurred
     */
    private static IMediaPlayerModel createMediaPlayerModel(final IMediaSdk sdk, final String url) throws IOException
    {
        IMediaPlayerModelSdk mediaPlayerModelSdk = sdk.createMediaPlayerModelSdk();
        
        mediaPlayerModelSdk.setMediaCodecSdk(MediaSdkFactory.createCompositeMediaCodecSdk(new AacJaadAudioCodecSdk(), new Mp3JavazoomAudioCodecSdk(), new SpeexAudioCodecSdk()));
        
        if (url.startsWith("rtmp"))
        {
            int ndx = url.indexOf("/mp4:");
            
            if (ndx < 0) ndx = url.lastIndexOf('/');
            
            final String stream = url.substring(ndx + 1);
            final String path = url.substring(0, ndx);
            
            final ExMediaSdkMediaPlayerPlayRtmpStream.RtmpMediaStreamReader reader = new ExMediaSdkMediaPlayerPlayRtmpStream.RtmpMediaStreamReader(path, stream);
            
            reader.setLogger(Loggers.createSoLogger(ILogger.DEBUG, reader.id()));
            
            return mediaPlayerModelSdk.create(reader);
        }
        else
        if (url.startsWith("rtsp"))
        {
            final ExMediaSdkMediaPlayerPlayRtspStream.RtspMediaStreamReader reader = new ExMediaSdkMediaPlayerPlayRtspStream.RtspMediaStreamReader(url, 12444);
            
            reader.setLogger(Loggers.createSoLogger(ILogger.DEBUG, reader.id()));
            
            return mediaPlayerModelSdk.create(reader);
        }
        else
        {
            return mediaPlayerModelSdk.create(url);
        }
    }
    
    /**
     * Plays the media.
     * 
     * @param mediaSdk
     * @param model media player model
     * @throws Exception if an exception occurred
     */
    public static void playMedia(final IMediaSdk mediaSdk, final IMediaPlayerModel model) throws Exception
    {
        final JVideoScreen videoScreen = new JVideoScreen();
        
        final JMediaPlayer mediaPlayer = JMediaPlayer.create(model);
        
        mediaPlayer.setAudioPlayback(new JavaAudioPlayback());
        
        mediaPlayer.setListener(new JMediaPlayer.ListenerAdapter()
        {
            @Override
            public void onVideoFrame(final VideoFrame frame, final int[] frameCropOffset)
            {
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        videoScreen.setFrameCropOffset(frameCropOffset == null ?
                                null : new Insets(frameCropOffset[0], frameCropOffset[1], frameCropOffset[2], frameCropOffset[3]));
                        
                        videoScreen.setFrame(frame);
                    }
                });
            }
        });
        
        JButton start = new JButton(new AbstractAction("Play")
        {
            private final static long serialVersionUID = -3538347901572402162L;
            
            public void actionPerformed(final ActionEvent e)
            {
                mediaPlayer.startPlayback();
            }
        });
        
        final JFrame frame = new JFrame();
        
        frame.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                mediaPlayer.stopPlayback();
                
                System.exit(0);
            }
        });
        
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(videoScreen, BorderLayout.CENTER);
        frame.getContentPane().add(start, BorderLayout.SOUTH);
        frame.pack();
        
        frame.setVisible(true);
    }
    
    /**
     * Constructor.
     */
    private ExMediaSdkMediaPlayer()
    {
    }
}