/*
 * LitePlayer.h
 *
 *  Created on: 2015年1月9日
 *      Author: zhengchuanjiang
 */

#ifndef LITEPLAYER_H_
#define LITEPLAYER_H_

#include "MediaFrameSink.h"
#include "MediaPacketSink.h"
#include "MediaEventSink.h"
#include "OsdStruct.h"
#include "PlayerControl.h"


class LitePlayer
{
public:

    virtual ~LitePlayer() {}

    /**
    * 打开媒体流
    * @param url 媒体流URL
    * @return 0 表示成功
    */
    virtual int open(const char* url) =0;

    /**
    * 关闭媒体流
    */
    virtual void close() =0;

    /**
    * 媒体流是否打开
    * @return true 表示媒体流已经打开就绪
    */
    virtual bool isOpen() =0;

    /**
    * 获取媒体URL
    * @return URL
    */
    virtual const char* getURL() =0;

    /**
    * 获取媒体流格式
    * @param fmt
    * @return true 表示成功
    */
    virtual bool getFormat(MediaFormat& fmt) =0;

    /**
    * 获取媒体流时长,单位为毫秒
    * @return 媒体流时长,如果是实时流,返回0
    */
    virtual int getDuration() =0;

    /**
    * 播放
    * return 0 表示成功
    */
    virtual int play() =0;

    virtual int pause() =0;

    virtual void stop() =0;

    /**
    * 获取播放状态
    * @return 播放状态,@see StreamState
    */
    virtual int getState() =0;


    /**
    * 判断是否可定位
    * @return true 表示可定位
    */
    virtual bool seekable() =0;

    /**
    * 定位到指定时间点
    * @param offset    时间点,单位为毫秒,不应超过 duration
    * @return 0 表示成功
    */
    virtual int seek(int64_t offset) =0;

    /**
    * 获取当前已播放时长
    * @return 播放时间,单位为毫秒
    */
    virtual int64_t getTime() =0;

    /**
    * get percent position
    * @return [0.0, 1.0]
    */
    virtual double getPosition() =0;

    /**
    * set position
    * @param pos must be in [0.0, 1.0]
    * @return
    */
    virtual int setPosition(double pos) =0;


    /**
    * 设置播放速度,正常播放速度为 1.0
    * @param scale 播放速度,取值范围: [1/8, 8]
    * @return 0 表示成功
    */
    virtual int setScale(double scale) =0;

    /**
    * 获取播放速度
    * @return 播放速度
    */
    virtual double getScale() =0;


    /**
    * get current volume
    * @return [0.0, 1.0]
    */
    virtual double getVolume() =0;

    /**
    * 设置音量
    * @param vol 音量,取值范围为:[0, 1.0]
    * @return
    */
    virtual int setVolume(double vol) =0;

    virtual bool isMute() =0;

    /**
    * 设置静音
    * @param muted true表示静音, false表示打开声音
    * @return 0 表示成功
    */
    virtual int setMute(bool muted) =0;

    virtual bool isFullscreen() =0;

    /**
    * 设置全屏
    * @param full 表示全屏
    * @return 0 表示成功
    */
    virtual int setFullscreen(bool full) =0;

    /**
    * 设置视频显示窗口
    * @param hwnd
    * @return
    */
    virtual void setVideoWnd(HWND hwnd) =0;

    /**
    * 设置视频宽高比率
    * 如果width,height = 0, 保持视频的原始比率
    * @param width
    * @param height
    * @return 0 on success
    */
    virtual int setRatio(int width, int height) =0;

    virtual void getRatio(int& width, int& height) =0;

    /**
    * 设置播放器logo
    * @param filepath
    * @return
    */
    virtual int setImage(const char* filepath) =0;


    /**
    * 抓图
    * @param filepath 图片路径
    * @return 0 表示成功
    */
    virtual int snap(const char* filepath) =0;


    /**
    * 设置过滤器, 参考avfilter设置
    * @param filterString
    * @return 0 表示成功
    */
    virtual int setVideoFilter(const char* filterString) =0;

    /**
    * 设置OSD叠加
    * @param num   序号, 取值范围为[0,4]
    * @param pOverlay OSD,为NULL表示删除
    */
    virtual int setOverlay(int num, OsdOverlay* pOverlay) =0;

    /**
    * 清理OSD叠加
    */
    virtual void resetOverlay() =0;

    /**
    * 设置解码回调
    * @param pSink 接收解码后的媒体帧
    */
    virtual void setFrameSink(MediaFrameSink* pSink) =0;

    /**
    * 设置媒体流回调
    * @param pSink 接收未解码媒体包
    */
    virtual void setPacketSink(MediaPacketSink* pSink) =0;


    virtual void setEventSink(MediaEventSink* pSink) =0;


    /**
    * 允许控制条显示
    * @param enabled
    * @return
    */
    virtual void enableControl(bool enabled) =0;

    virtual bool isControlEnabled() =0;

    virtual void setControl(PlayerControl* control) =0;

    /**
    * 获取属性
    * @param name 属性名
    * @return 属性值
    */
    virtual const char* getProp(const char* name) =0;

    /**
    * 设置属性
    * @param name 属性名称
    * @param value 属性值
    * @return 0 表示成功
    */
    virtual int setProp(const char* name, const char* value) =0;


    virtual int togglePlay() =0;

    virtual int toggleMute() =0;

    virtual int toggleFull() =0;

    /**
    * 减速播放
    * @return
    */
    virtual int slow() =0;

    /**
    * 快速播放
    * @return
    */
    virtual int fast() =0;

};


/**
 * 播放器工厂
 */
class DLLEXPORT  LitePlayerFactory
{
public:
    static bool startup();

    static void cleanup();

    /**
     * 创建播放器
     * @param hwnd
     * @return NULL if failed
     */
    static LitePlayer* create(HWND hwnd);

    /**
     * 销毁播放器
     * @param pPlayer
     */
    static void destroy(LitePlayer* pPlayer);

    //static const char* getProp(const char* name);

    //static int setProp(const char* name, const char* value);

};



#endif /* LITEPLAYER_H_ */