#ifndef __TX_LIVE_SDK_TYPE_DEF_H__
#define __TX_LIVE_SDK_TYPE_DEF_H__

#include "TXLiveSDKEventDef.h"
#import <Foundation/Foundation.h>

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
typedef UIView TXView;
typedef UIImage TXImage;
typedef UIEdgeInsets TXEdgeInsets;
#elif TARGET_OS_MAC
#import <AppKit/AppKit.h>
typedef NSView TXView;
typedef NSImage TXImage;
typedef NSEdgeInsets TXEdgeInsets;
#endif



/////////////////////////////////////////////////////////////////////////////////
//
//                    【视频相关枚举值定义】
//                   
/////////////////////////////////////////////////////////////////////////////////

/**
 * 1.1 视频分辨率
 * 
 * 在普通模式下，TXLivePusher 只支持三种固定的分辨率，即：360 × 640、540 × 960 以及 720 × 1280。
 * 
 *【如何横屏推流】
 * 如果希望使用 640 × 360、960 × 540、1280 × 720 这样的横屏分辨率，需要设置 TXLivePushConfig 中的 homeOrientation 属性，
 * 并使用 TXLivePusher 中的 setRenderRotation 接口进行画面旋转。
 *
 *【自定义分辨率】
 * 如果希望使用其他分辨率，可以设置 TXLivePushConfig 中的 customModeType 为 CUSTOM_MODE_VIDEO_CAPTURE，
 * 自己采集 SampleBuffer 送给 TXLivePusher 的 sendVideoSampleBuffer 接口。
 *
 *【建议的分辨率】
 * 手机直播场景下最常用的分辨率为 9:16 的竖屏分辨率 540 × 960。
 * 从清晰的角度，540 × 960 比 360 × 640 要清晰，同时跟 720 × 1280 相当。
 * 从性能的角度，540 × 960 可以避免前置摄像头开启 720 × 1280 的采集分辨率，对于美颜开销很大的场景能节省不少的计算量。
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoResolution) {

    /// 竖屏分辨率，宽高比为 9:16
    VIDEO_RESOLUTION_TYPE_360_640      = 0,   ///< 建议码率 800kbps
    VIDEO_RESOLUTION_TYPE_540_960      = 1,   ///< 建议码率 1200kbps
    VIDEO_RESOLUTION_TYPE_720_1280     = 2,   ///< 建议码率 1800kbps
    VIDEO_RESOLUTION_TYPE_1080_1920    = 30,  ///< 建议码率 3000kbps


    /// 如下均为内建分辨率，为 SDK 内部使用，不支持通过接口进行设置
    VIDEO_RESOLUTION_TYPE_640_360      = 3,   
    VIDEO_RESOLUTION_TYPE_960_540      = 4,   
    VIDEO_RESOLUTION_TYPE_1280_720     = 5,   
    VIDEO_RESOLUTION_TYPE_1920_1080    = 31,

    VIDEO_RESOLUTION_TYPE_320_480      = 6,
    VIDEO_RESOLUTION_TYPE_180_320      = 7,
    VIDEO_RESOLUTION_TYPE_270_480      = 8,
    VIDEO_RESOLUTION_TYPE_320_180      = 9,
    VIDEO_RESOLUTION_TYPE_480_270      = 10,
    
    VIDEO_RESOLUTION_TYPE_240_320      = 11,
    VIDEO_RESOLUTION_TYPE_360_480      = 12,
    VIDEO_RESOLUTION_TYPE_480_640      = 13,
    VIDEO_RESOLUTION_TYPE_320_240      = 14,
    VIDEO_RESOLUTION_TYPE_480_360      = 15,
    VIDEO_RESOLUTION_TYPE_640_480      = 16,
    
    VIDEO_RESOLUTION_TYPE_480_480      = 17,
    VIDEO_RESOLUTION_TYPE_270_270      = 18,
    VIDEO_RESOLUTION_TYPE_160_160      = 19,
};

/**
 * 1.2 画面质量挡位
 *
 * 如果您希望调整直播的编码参数，建议您直接使用 TXLivePusher 提供的 setVideoQuality 接口。
 * 由于视频编码参数中的分辨率，码率和帧率对最终效果都有着复杂的影响，如果您之前没有相关操作经验，不建议直接修改这些编码参数。
 * 我们在 setVideoQuality 接口中提供了如下几个挡位供您选择：
 *
 *  1. 标清：采用 360 × 640 的分辨率，码率调控范围 300kbps - 800kbps，关闭网络自适应时的码率为 800kbps，适合网络较差的直播环境。
 *  2. 高清：采用 540 × 960 的分辨率，码率调控范围 600kbps - 1500kbps，关闭网络自适应时的码率为 1200kbps，常规手机直播的推荐挡位。
 *  3. 超清：采用 720 × 1280 的分辨率，码率调控范围 600kbps - 1800kbps，关闭网络自适应时的码率为 1800kbps，能耗高，但清晰度较标清提升并不明显。
 *  4. 连麦（大主播）：主播从原来的“推流状态”进入“连麦状态”后，可以通过 setVideoQuality 接口调整自 MAIN_PUBLISHER 挡位。
 *  5. 连麦（小主播）：观众从原来的“播放状态”进入“连麦状态”后，可以通过 setVideoQuality 接口调整自 SUB_PUBLISHER 挡位。
 *  6. 视频通话：该选项后续会逐步废弃，如果您希望实现纯视频通话而非直播功能，推荐使用腾讯云 [TRTC](https://cloud.tencent.com/product/trtc) 服务。
 *
 * 【推荐设置】如果您对整个平台的清晰度要求比较高，推荐使用 setVideoQuality(HIGH_DEFINITION, NO, NO) 的组合。
 *             如果您的主播有很多三四线城市的网络适配要求，推荐使用 setVideoQuality(HIGH_DEFINITION, YES, NO) 的组合。
 *  
 * @note 在开启硬件加速后，您可能会发现诸如 368 × 640 或者 544 × 960 这样的“不完美”分辨率。
 *       这是由于部分硬编码器要求像素能被 16 整除所致，属于正常现象，您可以通过播放端的填充模式解决“小黑边”问题。
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoQuality) {
    VIDEO_QUALITY_STANDARD_DEFINITION       = 1,    ///< 标清：采用 360 × 640 的分辨率   
    VIDEO_QUALITY_HIGH_DEFINITION           = 2,    ///< 高清：采用 540 × 960 的分辨率  
    VIDEO_QUALITY_SUPER_DEFINITION          = 3,    ///< 超清：采用 720 × 1280 的分辨率
    VIDEO_QUALITY_ULTRA_DEFINITION          = 7,    ///< 蓝光：采用 1080 × 1920 的分辨率
    VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER    = 4,    ///< 连麦场景下的大主播使用
    VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER     = 5,    ///< 连麦场景下的小主播（连麦的观众）使用
    VIDEO_QUALITY_REALTIME_VIDEOCHAT        = 6,    ///< 纯视频通话场景使用（已废弃）
};

/**
 * 1.3 画面旋转方向
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_HomeOrientation) {
    HOME_ORIENTATION_RIGHT     = 0,    ///< HOME 键在右边，横屏模式      
    HOME_ORIENTATION_DOWN      = 1,    ///< HOME 键在下面，手机直播中最常见的竖屏直播模式                  
    HOME_ORIENTATION_LEFT      = 2,    ///< HOME 键在左边，横屏模式                   
    HOME_ORIENTATION_UP        = 3,    ///< HOME 键在上边，竖屏直播（适合小米 MIX2）                     
};

/**
 * 1.4 画面填充模式
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_RenderMode) {
    
    RENDER_MODE_FILL_SCREEN    = 0,    ///< 图像铺满屏幕，不留黑边，如果图像宽高比不同于屏幕宽高比，部分画面内容会被裁剪掉。
    RENDER_MODE_FILL_EDGE      = 1,    ///< 图像适应屏幕，保持画面完整，但如果图像宽高比不同于屏幕宽高比，会有黑边的存在。
};

/**
 * 1.5 美颜风格
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyStyle) {
    BEAUTY_STYLE_SMOOTH        = 0,    ///< 光滑，磨皮程度较高，更适合秀场直播类场景下使用。
    BEAUTY_STYLE_NATURE        = 1,    ///< 自然，磨皮算法会最大限度保留皮肤细节。
    BEAUTY_STYLE_PITU          = 2,    ///< 由上海优图实验室提供的美颜算法，磨皮效果介于光滑和自然之间，比光滑保留更多皮肤细节，比自然磨皮程度更高。
};

/**
 * 1.6 美颜程度，取值范围1 - 9，该枚举值定义了关闭和最大值。
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyFilterDepth) {
    BEAUTY_FILTER_DEPTH_CLOSE   = 0,   ///< 关闭美颜
    BEAUTY_FILTER_DEPTH_MAX     = 9,   ///< 最大美颜强度
};


/**
 * 1.6 网络自适应算法，推荐选项：AUTO_ADJUST_LIVEPUSH_STRATEGY
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_AutoAdjustStrategy) {
    AUTO_ADJUST_NONE                                 = -1,    ///< 非法数值，用于 SDK 内部做合法性检查

    AUTO_ADJUST_LIVEPUSH_STRATEGY                    =  0,    ///< 最适合直播模式下的流控算法
    AUTO_ADJUST_LIVEPUSH_RESOLUTION_STRATEGY         =  1,    ///< 不推荐：SDK 内部会调整视频分辨率，如果有 H5 分享的需求请勿使用
    AUTO_ADJUST_REALTIME_VIDEOCHAT_STRATEGY          =  5,    ///< 待废弃，请使用腾讯云 TRTC 服务

    AUTO_ADJUST_BITRATE_STRATEGY_1                   =  0,    ///< 已经废弃  
    AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_1        =  1,    ///< 已经废弃  
    AUTO_ADJUST_BITRATE_STRATEGY_2                   =  2,    ///< 已经废弃  
    AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_2        =  3,    ///< 已经废弃  
    AUTO_ADJUST_REALTIME_BITRATE_STRATEGY            =  4,    ///< 已经废弃
    AUTO_ADJUST_REALTIME_BITRATE_RESOLUTION_STRATEGY =  5,    ///< 已经废弃 
};

/**
 * 1.7 视频帧的数据格式（未压缩前的）
 */
typedef NS_ENUM(NSInteger, TXVideoType) {
    
    VIDEO_TYPE_420SP          = 1,   ///< Android 视频采集格式，PixelFormat.YCbCr_420_SP 17  
    VIDEO_TYPE_420YpCbCr      = 2,   ///< iOS 视频采集格式，kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange  
    VIDEO_TYPE_420P           = 3,   ///< yuv420p格式 
    VIDEO_TYPE_BGRA8888       = 4,   ///< BGRA8888
    VIDEO_TYPE_RGBA8888       = 5,   ///< RGBA8888  
    VIDEO_TYPE_NV12           = 6,   ///< NV12(iOS) 
};

/**
 * 1.8 本地视频预览镜像类型
 *
 * iOS 的本地画面提供三种设置模式
 */
typedef NS_ENUM(NSUInteger, TXLocalVideoMirrorType) {
    LocalVideoMirrorType_Auto       = 0,       ///< 前置摄像头镜像，后置摄像头不镜像
    LocalVideoMirrorType_Enable     = 1,       ///< 前后置摄像头画面均镜像
    LocalVideoMirrorType_Disable    = 2,       ///< 前后置摄像头画面均不镜像
};

/////////////////////////////////////////////////////////////////////////////////
//
//                    【音频相关枚举值定义】
//                   
/////////////////////////////////////////////////////////////////////////////////

/**
 * 2.1 音频采样率
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_AudioSampleRate) {
    
    AUDIO_SAMPLE_RATE_8000       = 0,     ///< 8k采样率
    AUDIO_SAMPLE_RATE_16000      = 1,     ///< 16k采样率
    AUDIO_SAMPLE_RATE_32000      = 2,     ///< 32k采样率
    AUDIO_SAMPLE_RATE_44100      = 3,     ///< 44.1k采样率
    AUDIO_SAMPLE_RATE_48000      = 4,     ///< 48k采样率
};

/**
 * 2.2 混响类型
 */
typedef NS_ENUM(NSInteger, TXReverbType) {
    REVERB_TYPE_0                = 0,     ///< 关闭混响 
    REVERB_TYPE_1                = 1,     ///< KTV
    REVERB_TYPE_2                = 2,     ///< 小房间 
    REVERB_TYPE_3                = 3,     ///< 大会堂    
    REVERB_TYPE_4                = 4,     ///< 低沉     
    REVERB_TYPE_5                = 5,     ///< 洪亮    
    REVERB_TYPE_6                = 6,     ///< 金属声    
    REVERB_TYPE_7                = 7,     ///< 磁性    
};

/**
 * 2.3 变声选项
 */
typedef NS_ENUM(NSInteger, TXVoiceChangerType) {
    
    VOICECHANGER_TYPE_0          = 0,     ///< 关闭变声 
    VOICECHANGER_TYPE_1          = 1,     ///< 熊孩子 
    VOICECHANGER_TYPE_2          = 2,     ///< 萝莉 
    VOICECHANGER_TYPE_3          = 3,     ///< 大叔 
    VOICECHANGER_TYPE_4          = 4,     ///< 重金属 
    VOICECHANGER_TYPE_5          = 5,     ///< 感冒 
    VOICECHANGER_TYPE_6          = 6,     ///< 外国人 
    VOICECHANGER_TYPE_7          = 7,     ///< 困兽 
    VOICECHANGER_TYPE_8          = 8,     ///< 死肥仔 
    VOICECHANGER_TYPE_9          = 9,     ///< 强电流 
    VOICECHANGER_TYPE_10         = 10,    ///< 重机械 
    VOICECHANGER_TYPE_11         = 11,    ///< 空灵 
};

/**
 * 2.4 声音播放模式（音频路由）
 *
 * 一般手机都有两个扬声器，设置音频路由的作用就是要决定声音从哪个扬声器播放出来。
 * - Speakerphone：扬声器，位于手机底部，声音偏大，适合外放音乐。
 * - Earpiece：听筒，位于手机顶部，声音偏小，适合通话。
 */
typedef NS_ENUM(NSInteger, TXAudioRouteType) {
    AUDIO_ROUTE_SPEAKER          = 0,      ///< 扬声器，位于手机底部，声音偏大，适合外放音乐。 
    AUDIO_ROUTE_RECEIVER         = 1,      ///< 听筒，位于手机顶部，声音偏小，适合通话。
};

/**
 * 2.5 系统音量类型
 *
 * 该枚举值用于控制推流过程中使用何种系统音量类型
 */
typedef NS_ENUM(NSInteger, TXSystemAudioVolumeType) {
    SYSTEM_AUDIO_VOLUME_TYPE_AUTO             = 0,    ///< 默认类型，SDK会自动选择合适的音量类型
    SYSTEM_AUDIO_VOLUME_TYPE_MEDIA            = 1,    ///< 仅使用媒体音量，SDK不再使用通话音量
    SYSTEM_AUDIO_VOLUME_TYPE_VOIP             = 2,    ///< 仅使用通话音量，SDK一直使用通话音量
};

/**
 * 2.6 推流用网络通道（待废弃）
 */
typedef NS_ENUM(NSInteger, TX_Enum_Type_RTMPChannel) {
    
    RTMP_CHANNEL_TYPE_AUTO       = 0,      ///< 自动：推腾讯云使用加速协议，推友商云使用标准 RTMP 协议。
    RTMP_CHANNEL_TYPE_STANDARD   = 1,      ///< 标准 RTMP 协议  
    RTMP_CHANNEL_TYPE_PRIVATE    = 2,      ///< 腾讯云专属加速协议 
};


/**
 * 2.7 屏幕采集源（用于录屏推流）
 */
#if TARGET_OS_OSX
typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) {
    TXCaptureVideoInputSourceCamera,
    TXCaptureVideoInputSourceScreen,
    TXCaptureVideoInputSourceWindow
};
#endif




/////////////////////////////////////////////////////////////////////////////////
//
//                    【状态通知字段名 onNetStatus】
//                   
/////////////////////////////////////////////////////////////////////////////////

/**
 * TXLivePushListener 和 TXLivePlayListener 的 onNetStatus() 会以 2s 一次的时间间隔，定时通知网络状态和内部指标，
 * 这些数值采用 key-value 的组织格式，其中 key 值的定义如下：
 */

#define NET_STATUS_CPU_USAGE             @"CPU_USAGE"              ///> 进程 CPU 占用率
#define NET_STATUS_CPU_USAGE_D           @"CPU_USAGE_DEVICE"       ///> 系统 CPU 占用率

#define NET_STATUS_VIDEO_WIDTH           @"VIDEO_WIDTH"            ///> 视频分辨率宽度
#define NET_STATUS_VIDEO_HEIGHT          @"VIDEO_HEIGHT"           ///> 视频分辨率高度
#define NET_STATUS_VIDEO_FPS             @"VIDEO_FPS"              ///> 视频帧率：也就是视频编码器每秒生产了多少帧画面。
#define NET_STATUS_VIDEO_GOP             @"VIDEO_GOP"              ///> 关键帧间隔：即每两个关键帧(I帧)间隔时长，单位：秒。
#define NET_STATUS_VIDEO_BITRATE         @"VIDEO_BITRATE"          ///> 视频码率：即视频编码器每秒生产了多少视频数据，单位：kbps。
#define NET_STATUS_AUDIO_BITRATE         @"AUDIO_BITRATE"          ///> 音频码率：即音频编码器每秒生产了多少音频数据，单位：kbps。
#define NET_STATUS_NET_SPEED             @"NET_SPEED"              ///> 传输速度：即每秒钟发送或接收了多少字节的数据。

#define NET_STATUS_VIDEO_CACHE           @"VIDEO_CACHE"            ///> TXLivePusher：主播端堆积的视频帧数；TXLivePlayer：播放端缓冲的视频总时长。
#define NET_STATUS_AUDIO_CACHE           @"AUDIO_CACHE"            ///> TXLivePusher：主播端堆积的音频帧数；TXLivePlayer：播放端缓冲的音频总时长。
#define NET_STATUS_VIDEO_DROP            @"VIDEO_DROP"             ///> TXLivePusher：主播端主动丢弃的视频帧数；TXLivePlayer: N/A。
#define NET_STATUS_AUDIO_DROP            @"AUDIO_DROP"             ///> 暂未使用

#define NET_STATUS_V_DEC_CACHE_SIZE      @"V_DEC_CACHE_SIZE"       ///> TXLivePlayer：播放端解码器中缓存的视频帧数（Android 端硬解码时存在）。
#define NET_STATUS_V_SUM_CACHE_SIZE      @"V_SUM_CACHE_SIZE"       ///> TXLivePlayer：播放端缓冲的总视频帧数，该数值越大，播放延迟越高。
#define NET_STATUS_AV_PLAY_INTERVAL      @"AV_PLAY_INTERVAL"       ///> TXLivePlayer：音画同步错位时间（播放），单位 ms，此数值越小，音画同步越好。
#define NET_STATUS_AV_RECV_INTERVAL      @"AV_RECV_INTERVAL"       ///> TXLivePlayer：音画同步错位时间（网络），单位 ms，此数值越小，音画同步越好。
#define NET_STATUS_AUDIO_CACHE_THRESHOLD @"AUDIO_CACHE_THRESHOLD"  ///> TXLivePlayer：音频缓冲时长阈值，缓冲超过该阈值后，播放器会开始调控延时。

#define NET_STATUS_AUDIO_INFO            @"AUDIO_INFO"             ///> 音频信息：包括采样率信息和声道数信息
#define NET_STATUS_NET_JITTER            @"NET_JITTER"             ///> 网络抖动：数值越大表示抖动越大，网络越不稳定
#define NET_STATUS_QUALITY_LEVEL         @"NET_QUALITY_LEVEL"      ///> 网络质量：0：未定义 1：最好 2：好 3：一般 4：差 5：很差 6：不可用
#define NET_STATUS_SERVER_IP             @"SERVER_IP"              ///> 连接的Server IP地址


/////////////////////////////////////////////////////////////////////////////////
//
//                    【事件通知字段名 onPushEvent onPlayEvent】
//                   
/////////////////////////////////////////////////////////////////////////////////


/**
 * 腾讯云 LiteAVSDK 通过 TXLivePushListener 中的 onPushEvent()，TXLivePlayListener 中的 onPlayEvent() 向您通知内部错误、警告和事件：
 * - 错误：严重且不可恢复的错误，会中断 SDK 的正常逻辑。
 * - 警告：非致命性的提醒和警告，可以不理会。
 * - 事件：SDK 的流程和状态通知，比如开始推流，开始播放，等等。
 *  
 * 这些数值采用 key-value 的组织格式，其中 key 值的定义如下：
 */
#define EVT_MSG                          @"EVT_MSG"                 ///> 事件ID
#define EVT_TIME                         @"EVT_TIME"                ///> 事件发生的UTC毫秒时间戳
#define EVT_UTC_TIME                     @"EVT_UTC_TIME"            ///> 事件发生的UTC毫秒时间戳(兼容性)
#define EVT_BLOCK_DURATION               @"EVT_BLOCK_DURATION"      ///> 卡顿时间（毫秒）
#define EVT_PARAM1                       @"EVT_PARAM1"              ///> 事件参数1
#define EVT_PARAM2                       @"EVT_PARAM2"              ///> 事件参数2
#define EVT_GET_MSG                      @"EVT_GET_MSG"             ///> 消息内容，收到PLAY_EVT_GET_MESSAGE事件时，通过该字段获取消息内容
#define EVT_PLAY_PROGRESS                @"EVT_PLAY_PROGRESS"       ///> 点播：视频播放进度
#define EVT_PLAY_DURATION                @"EVT_PLAY_DURATION"       ///> 点播：视频总时长
#define EVT_PLAYABLE_DURATION            @"PLAYABLE_DURATION"       ///> 点播：视频可播放时长
#define EVT_PLAY_COVER_URL               @"EVT_PLAY_COVER_URL"      ///> 点播：视频封面
#define EVT_PLAY_URL                     @"EVT_PLAY_URL"            ///> 点播：视频播放地址
#define EVT_PLAY_NAME                    @"EVT_PLAY_NAME"           ///> 点播：视频名称
#define EVT_PLAY_DESCRIPTION             @"EVT_PLAY_DESCRIPTION"    ///> 点播：视频简介

#define STREAM_ID                        @"STREAM_ID"

#endif 
