//
//  RecordPlayViewController.m
//  lechangeDemo
//
//  Created by mac318340418 on 16/7/12.
//  Copyright © 2016年 dh-Test. All rights reserved.
//

#import "RecordPlayViewController.h"
#import "LCOpenSDK_Prefix.h"
#import "UIDevice+Lechange.h"
#import <LCOpenSDKDynamic.h>

#define RECORD_BAR_HEIGHT 40.0
#define TIME_LAB_WIDTH 60.0
typedef NS_ENUM(NSInteger, PlayState) {
    Play = 0,
    Pause = 1,
    Stop = 2
};

@interface RecordPlayViewController () {
    LCOpenSDK_Utils* m_Utils;

    CGRect m_screenFrame;
    LCOpenSDK_PlayWindow* m_play;

    PlayState m_playState;
    BOOL m_isSeeking;
    NSTimeInterval m_deltaTime;
    NSString* m_streamPath;
}

@end

@implementation RecordPlayViewController

- (void)viewDidLoad
{

    [super viewDidLoad];
    [self initWindowView];
    [self.view bringSubviewToFront:m_playBarView];

    dispatch_queue_t playRecord = dispatch_queue_create("playRecord", nil);
    dispatch_async(playRecord, ^{
        [self onPlay];
    });

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(onResignActive:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(onActive:)
                                                 name:UIApplicationDidBecomeActiveNotification
                                               object:nil];
    signal(SIGPIPE, SIG_IGN);
}

- (void)initWindowView
{
    m_screenFrame = [UIScreen mainScreen].bounds;

    UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(RECORD_PLAY_TITLE_TXT, nil)];

    UIButton* left = [UIButton buttonWithType:UIButtonTypeCustom];
    [left setFrame:CGRectMake(0, 0, 50, 30)];
    UIImage* img = [UIImage leChangeImageNamed:Back_Btn_Png];

    [left setBackgroundImage:img forState:UIControlStateNormal];
    [left addTarget:self action:@selector(onBack) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithCustomView:left];
    [item setLeftBarButtonItem:leftBtn animated:NO];
    [super.m_navigationBar pushNavigationItem:item animated:NO];

    [self.view addSubview:super.m_navigationBar];

    m_playImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16)];
    [m_playImg setImage:m_imgPicSelected];
    [self.view addSubview:m_playImg];
    [self layOutBar];

    m_tipLab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, m_screenFrame.size.width - 20, 20)];
    m_tipLab.center = CGPointMake(m_playImg.center.x, m_playImg.center.y + CGRectGetHeight(m_playImg.frame) / 2 + 50);
    [m_tipLab setBackgroundColor:[UIColor clearColor]];
    m_tipLab.textAlignment = NSTextAlignmentCenter;
    [m_tipLab setFont:[UIFont systemFontOfSize:15.0]];
    [self.view addSubview:m_tipLab];
    m_play = [[LCOpenSDK_PlayWindow alloc] initPlayWindow:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16) Index:1];
    [m_play setSurfaceBGColor:[UIColor blackColor]];
    [self.view addSubview:[m_play getWindowView]];
    
    m_progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    m_progressInd.center = CGPointMake(self.view.center.x, m_playImg.center.y);
    [self.view addSubview:m_progressInd];

    [self.view bringSubviewToFront:m_playImg];
    [self.view bringSubviewToFront:m_playBarView];
    [self.view bringSubviewToFront:m_progressInd];
    [m_play setWindowListener:(id<LCOpenSDK_EventListener>)self];

    m_Utils = [[LCOpenSDK_Utils alloc] init];

    m_playState = Stop;
    m_isSeeking = NO;
    [self enableOtherBtn:NO];

    m_deltaTime = [self transformToDeltaTime:m_beginTimeSelected EndTime:m_endTimeSelected];

    signal(SIGPIPE, SIG_IGN);
}

- (void)layOutBar
{
    m_playBarView = [[UIView alloc] initWithFrame:CGRectMake(0, super.m_yOffset - RECORD_BAR_HEIGHT + m_playImg.frame.size.height, m_playImg.frame.size.width, RECORD_BAR_HEIGHT)];
    [m_playBarView setBackgroundColor:[UIColor grayColor]];
    m_playBarView.alpha = 0.5;
    [self.view addSubview:m_playBarView];

    m_playBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)];
    [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
    [m_playBtn addTarget:self action:@selector(onPlay) forControlEvents:UIControlEventTouchUpInside];
    [m_playBarView addSubview:m_playBtn];

    m_scalBtn = [[UIButton alloc] initWithFrame:CGRectMake(m_playBarView.frame.size.width - RECORD_BAR_HEIGHT, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)];
    [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_FullScreen_Png] forState:UIControlStateNormal];
    [m_scalBtn addTarget:self action:@selector(onFullScreen) forControlEvents:UIControlEventTouchUpInside];
    [m_playBarView addSubview:m_scalBtn];

    m_startTimeLab = [[UILabel alloc] initWithFrame:CGRectMake(RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)];
    m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
    [m_startTimeLab setBackgroundColor:[UIColor clearColor]];
    [m_startTimeLab setFont:[UIFont systemFontOfSize:12.0]];
    m_startTimeLab.textAlignment = NSTextAlignmentCenter;
    [m_playBarView addSubview:m_startTimeLab];

    m_endTimeLab = [[UILabel alloc] initWithFrame:CGRectMake(m_playBarView.frame.size.width - TIME_LAB_WIDTH - RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)];
    m_endTimeLab.text = [self transformToShortTime:m_endTimeSelected];
    [m_endTimeLab setBackgroundColor:[UIColor clearColor]];
    [m_endTimeLab setFont:[UIFont systemFontOfSize:12.0]];
    m_endTimeLab.textAlignment = NSTextAlignmentCenter;
    [m_playBarView addSubview:m_endTimeLab];

    m_playSlider = [[UISlider alloc] initWithFrame:CGRectMake(RECORD_BAR_HEIGHT + TIME_LAB_WIDTH, 0, m_playBarView.frame.size.width - 2 * (RECORD_BAR_HEIGHT + TIME_LAB_WIDTH), RECORD_BAR_HEIGHT)];
    m_playSlider.value = m_playSlider.minimumValue;
    [m_playSlider addTarget:self action:@selector(onSeek) forControlEvents:UIControlEventTouchUpInside];
    [m_playBarView addSubview:m_playSlider];
}

- (void)refreshSubView
{
    [m_playBtn setFrame:CGRectMake(0, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)];
    [m_scalBtn setFrame:CGRectMake(m_playBarView.frame.size.width - RECORD_BAR_HEIGHT, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)];
    [m_startTimeLab setFrame:CGRectMake(RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)];
    [m_endTimeLab setFrame:CGRectMake(m_playBarView.frame.size.width - TIME_LAB_WIDTH - RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)];
    [m_playSlider setFrame:CGRectMake(RECORD_BAR_HEIGHT + TIME_LAB_WIDTH, 0, m_playBarView.frame.size.width - 2 * (RECORD_BAR_HEIGHT + TIME_LAB_WIDTH), RECORD_BAR_HEIGHT)];
}

- (void)enableOtherBtn:(BOOL)bFalg
{
    m_playSlider.enabled = bFalg;
    m_scalBtn.enabled = bFalg;
}

- (void)setInfo:(NSString*)token PlayToken:(NSString*)playToken Dev:(NSString*)deviceId Key:(NSString*)key Chn:(NSInteger)chn Type:(RecordType)type accessType:(NSString*)accessType;
{
    m_accessToken = [token mutableCopy];
    m_strDevSelected = [deviceId mutableCopy];
    m_encryptKey = [key mutableCopy];
    m_devChnSelected = chn;
    m_recordType = type;
    m_playToken = [playToken copy];
    m_accessType = [accessType copy];
}

- (void)setRecInfo:(NSString*)rec RecReg:(NSString*)recReg Begin:(NSString*)begin End:(NSString*)end Img:(UIImage*)img
{
    m_strRecSelected = [rec mutableCopy];
    m_strRecRegSelected = [recReg mutableCopy];
    m_beginTimeSelected = [begin mutableCopy];
    m_endTimeSelected = [end mutableCopy];
    m_imgPicSelected = img;
}

- (void)onPlay
{
    switch (m_recordType) {
    case DeviceRecord:
        [self playDeviceRecord];
        break;
    case CloudRecord:
        [self playCloudRecord];
        break;
    default:
        break;
    }
}

#pragma mark - 播放设备本地录像文件(En:Play device local video files)
- (void)playDeviceRecord
{
    if (!m_play) {
        NSLog(@"play failed\n");
        return;
    }
    if (m_playState == Stop) {
        [m_play stopDeviceRecord:NO];
        m_isSeeking = NO;
        [self showLoading];
        if ([m_accessType isEqual:@"PaaS"] || [m_accessType isEqual:@"lechange"]) {
            LCOpenSDK_ParamDeviceRecordFileName * paramDeviceRecord = [[LCOpenSDK_ParamDeviceRecordFileName alloc] init];
            paramDeviceRecord.accessToken = m_accessToken;
            paramDeviceRecord.deviceID = m_strDevSelected;
            paramDeviceRecord.psk = m_encryptKey;
            paramDeviceRecord.channel = m_devChnSelected;
            paramDeviceRecord.playToken = m_playToken;
            paramDeviceRecord.fileName = m_strRecSelected;
            paramDeviceRecord.offsetTime = 0 ;
            paramDeviceRecord.isOpt = YES;
            [m_play playDeviceRecordByFileName:paramDeviceRecord];
        }
        else {
            LCOpenSDK_ParamDeviceRecordUTCTime  *paramDeviceRecordUTCTime  = [[LCOpenSDK_ParamDeviceRecordUTCTime alloc] init];
            paramDeviceRecordUTCTime.accessToken = m_accessToken;
            paramDeviceRecordUTCTime.deviceID = m_strDevSelected;
            paramDeviceRecordUTCTime.psk = m_encryptKey;
            paramDeviceRecordUTCTime.channel = m_devChnSelected;
            paramDeviceRecordUTCTime.playToken = m_playToken;
            paramDeviceRecordUTCTime.beginTime = [self timeIntervalOfString:m_beginTimeSelected];
            paramDeviceRecordUTCTime.endTime = [self timeIntervalOfString:m_endTimeSelected] ;
            paramDeviceRecordUTCTime.defiMode =  DEFINITION_MODE_HG;
            paramDeviceRecordUTCTime.isOpt = YES;
            [m_play playDeviceRecordByUtcTime:paramDeviceRecordUTCTime];
        }
        m_playState = Play;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_playBtn.enabled = NO;
            m_tipLab.text = @"ready play";
        });
    }
    else if (m_playState == Pause){
        [m_play resume];
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal];
        m_playState = Play;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"play";
        });
    }
    else if (m_playState == Play) {
        [m_play pause];
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
        m_playState = Pause;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"pause";
        });
    }
}

#pragma mark - 播放云录像(En:Play cloud video)
- (void)playCloudRecord
{
    if (!m_play) {
        NSLog(@"play failed\n");
        return;
    }
    if (m_playState == Stop) {
        [m_play stopCloud:NO];
        m_isSeeking = NO;
        [self showLoading];
        LCOpenSDK_ParamCloudRecord *paramCloudRecord = [[LCOpenSDK_ParamCloudRecord alloc] init];
        paramCloudRecord.accessToken = m_accessToken;
        paramCloudRecord.deviceID = m_strDevSelected;
        paramCloudRecord.channel = m_devChnSelected;
        paramCloudRecord.psk = m_encryptKey;
        paramCloudRecord.recordRegionID = m_strRecRegSelected;
        paramCloudRecord.offsetTime = 0;
        paramCloudRecord.recordType = RECORD_TYPE_ALL;
        paramCloudRecord.timeOut = 60;
        [m_play playCloudRecord:paramCloudRecord];
        m_playState = Play;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"ready play";
            m_playBtn.enabled = NO;
        });
    }
    else if (m_playState == Pause) {
        [m_play resume];
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal];
        m_playState = Play;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"play";
        });
    }
    else if (m_playState == Play) {
        [m_play pause];
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
        m_playState = Pause;
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"pause";
        });
        [m_play stopRecord];
    }
}

#pragma mark - 拖动(En:Seek)
- (void)onSeek
{
    m_isSeeking = YES;
    [self showLoading];

    if (Pause == m_playState) {
        [m_play resume];
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal];
        if (DeviceRecord == m_recordType) {
            return;
        }
    }

    m_playState = Play;

    /**
     Ch:seek到录像最后2秒内,录像可能无法播放,强制使seek在录像最后2秒以外
     En:Seek to the last 2 seconds of the video, the video may not be played, forcing seek to be outside the last 2 seconds of the video.
     */
    Float64 delta = m_playSlider.maximumValue - m_playSlider.value;
    if (delta < (2.0 / m_deltaTime)) {
        m_playSlider.value = (m_playSlider.maximumValue - 2.0 / m_deltaTime) < m_playSlider.minimumValue ? m_playSlider.minimumValue : (m_playSlider.maximumValue - 2.0 / m_deltaTime);
    }
    Float64 rate = m_playSlider.value / (m_playSlider.maximumValue - m_playSlider.minimumValue);
    [m_play seek:rate * m_deltaTime];
}

#pragma mark - 全屏(En:Full screen)
- (void)onFullScreen
{
    [UIDevice lc_setRotateToSatusBarOrientation];
}

- (void)onControlClick:(CGFloat)dx dy:(CGFloat)dy Index:(NSInteger)index
{
    
}

#pragma mark - 双击播放屏幕(En:Double tap the play screen)
- (void)onWindowDBClick:(CGFloat)dx dy:(CGFloat)dy Index:(NSInteger)index
{
    m_playBarView.hidden = !m_playBarView.hidden;
}

- (void)onPlayerResult:(NSString*)code Type:(NSInteger)type Index:(NSInteger)index
{
    switch (m_recordType) {
    case DeviceRecord:
        [self onPlayDeviceRecordResult:code Type:type];
        break;
    case CloudRecord:
        [self onPlayCloudRecordResult:code Type:type];
    default:
        break;
    }
}

#pragma mark - 设备录像播放回调(En:Device video playback callback)
- (void)onPlayDeviceRecordResult:(NSString*)code Type:(NSInteger)type
{
    NSString* displayLab;
    if (99 == type) {
        displayLab = [code isEqualToString:@"-1000"] ? NSLocalizedString(NETWORK_TIMEOUT_TXT, nil) : [NSLocalizedString(REST_LINK_FAILED_TXT, nil) stringByAppendingFormat:@",[%@]", code];
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"RecordPlayViewController, OpenApi connect error!");
            [m_tipLab setText:displayLab];
            [self hideLoading];
            m_playState = Stop;
            m_playImg.hidden = NO;
            m_playBtn.enabled = YES;
            [self enableOtherBtn:NO];
        });
        return;
    }
    
    if(5 == type)
    {
        /**
         Ch:优化拉流
         En:Http pull flow
        */
        if([@"0" isEqualToString:code]){
            displayLab = @"start private protocol";
            return;
        }
        if([@"1000" isEqualToString:code] || [@"4000" isEqualToString:code])
        {
            displayLab = @"play private protocol Succeed!";
            return;
        }
    }
    
    if ([RTSP_Result_String(STATE_RTSP_TEARDOWN_ERROR) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            m_tipLab.text = @"rtsp teardown";
        });
        return;
    }
    if ([RTSP_Result_String(STATE_RTSP_PLAY_READY) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (YES == m_isSeeking) {
                if (Pause == m_playState) {
                    m_playState = Play;
                    Float64 m_Rate = m_playSlider.value / (m_playSlider.maximumValue - m_playSlider.minimumValue);
                    [m_play seek:m_Rate * m_deltaTime];
                } else {
                    m_isSeeking = NO;
                }
            }
        });
        return;
    }
    if ([RTSP_Result_String(STATE_RTSP_FILE_PLAY_OVER) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{

                       });
        return;
    }
    if ([RTSP_Result_String(STATE_RTSP_PAUSE_READY) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{

                       });
        return;
    }
    if ([RTSP_Result_String(STATE_RTSP_KEY_MISMATCH) isEqualToString:code]) {
        displayLab = @"Key Error";
    } else {
        displayLab = [NSString stringWithFormat:@"Rest Failed,[%@]", code];
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        [m_tipLab setText:displayLab];
        [self hideLoading];
        m_playImg.hidden = NO;
        m_playState = Stop;
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
        m_playBtn.enabled = YES;
        [self enableOtherBtn:NO];
        [m_play stopDeviceRecord:NO];

        m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
        [m_playSlider setValue:0];
    });
    return;
}

#pragma mark - 云录像播放回调(En:Cloud video playback callback)
- (void)onPlayCloudRecordResult:(NSString*)code Type:(NSInteger)type
{

    NSLog(@"code[%@] type[%ld]", code, (long)type);
    if (99 == type) {
        NSString* hint = [code isEqualToString:@"-1000"] ? NSLocalizedString(NETWORK_TIMEOUT_TXT, nil) : [NSLocalizedString(REST_LINK_FAILED_TXT, nil) stringByAppendingFormat:@",[%@]", code];
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"RecordPlayViewController, OpenApi connect error!");
            m_tipLab.text = hint;
            [self hideLoading];
            m_playState = Stop;
            m_playImg.hidden = NO;
            m_playBtn.enabled = YES;
            [self enableOtherBtn:NO];
        });
        return;
    }
    if ([HLS_Result_String(HLS_DOWNLOAD_FAILD) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS DOWNLOAD FAILED!");
            m_tipLab.text = @"HLS download failed";
            [self hideLoading];
            m_playState = Stop;
            m_playImg.hidden = NO;
            m_playBtn.enabled = YES;
            [self enableOtherBtn:NO];
            [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];

            m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
            [m_playSlider setValue:0];
        });
        return;
    }
    if ([HLS_Result_String(HLS_DOWNLOAD_BEGIN) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS DOWNLOAD BEGIN!");
        });
        return;
    }
    if ([HLS_Result_String(HLS_DOWNLOAD_END) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS DOWNLOAD END!");
        });
        return;
    }
    if ([HLS_Result_String(HLS_SEEK_SUCCESS) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS SEEK SUCCESS!");
            m_isSeeking = NO;
            [self hideLoading];
        });
        return;
    }
    if ([HLS_Result_String(HLS_SEEK_FAILD) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS SEEK FAILD!");
            [m_play stopCloud:NO];
            m_playState = Stop;
            [self hideLoading];
            [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];

            m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
            [m_playSlider setValue:0];
        });
        return;
    }
    if ([HLS_Result_String(HLS_ABORT_DONE) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS ABORT DONE!");
            m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
            [m_playSlider setValue:0];
        });
        return;
    }
    if ([HLS_Result_String(HLS_RESUME_DONE) isEqualToString:code]) {

        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"HLS RESUME DONE!");
        });
        return;
    }
    if ([HLS_Result_String(HLS_KEY_ERROR) isEqualToString:code]) {
        dispatch_async(dispatch_get_main_queue(), ^{

            [m_play stopCloud:NO];
            [self hideLoading];
            m_tipLab.text = @"Key Error";
            m_playState = Stop;
            m_playImg.hidden = NO;
            m_playBtn.enabled = YES;
            [self enableOtherBtn:NO];
            [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
        });
        return;
    }
}

#pragma mark - 录像开始播放回调(En:Video start playback callback)
- (void)onPlayBegan:(NSInteger)index
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal];
        m_tipLab.text = @"start to play";
        m_playState = Play;
        m_isSeeking = NO;
        [self hideLoading];
        m_playImg.hidden = YES;
        m_playBtn.enabled = YES;
        [self enableOtherBtn:YES];
    });
}

#pragma mark - 录像播放结束回调(En:Video playback end callback)
- (void)onPlayFinished:(NSInteger)index
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (DeviceRecord == m_recordType) {
            [m_play stopDeviceRecord:YES];
        } else if (CloudRecord == m_recordType) {
            [m_play stopCloud:YES];
        }
        m_tipLab.text = @"play over";
        [self hideLoading];
        [self enableOtherBtn:NO];
        [m_startTimeLab setText:[self transformToShortTime:m_beginTimeSelected]];
        [m_playSlider setValue:m_playSlider.minimumValue animated:YES];
        m_playState = Stop;
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
    });
}

#pragma mark - 录像时间状态回调(En:Recording time status callback)
- (void)onPlayerTime:(long)time Index:(NSInteger)index
{
    if (YES == m_isSeeking) {
        return;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        NSString* currentTime = [self transformTimeFromLong:time];
        [m_startTimeLab setText:[self transformToShortTime:currentTime]];
        NSLog(@"_m_startTimeLab.text = %@", m_startTimeLab.text);
        Float64 rate = [self transformToDeltaTime:m_beginTimeSelected EndTime:currentTime] / m_deltaTime;
        Float64 slider_value = rate * (m_playSlider.maximumValue - m_playSlider.minimumValue);
        [m_playSlider setValue:slider_value animated:YES];
    });
}

#pragma mark - TS/PS标准流数据回调(En:TS/PS standard stream data callback)
- (void)onStreamCallback:(NSData*)data Index:(NSInteger)index
{
    if (m_streamPath) {
        NSFileHandle* fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:m_streamPath];
        /**
        Ch:将节点跳到文件的末尾
        En:Jump node to the end of the file
        */
        [fileHandle seekToEndOfFile];
        /**
        Ch:追加写入数据
        En:Append write data
        */
        [fileHandle writeData:data]; 

        [fileHandle closeFile];
        return;
    }
    NSDateFormatter* dataFormat = [[NSDateFormatter alloc] init];
    [dataFormat setDateFormat:@"yyyyMMddHHmmss"];
    NSString* strDate = [dataFormat stringFromDate:[NSDate date]];
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
        NSUserDomainMask, YES);
    NSString* libraryDirectory = [paths objectAtIndex:0];

    NSString* myDirectory =
        [libraryDirectory stringByAppendingPathComponent:@"lechange"];
    NSString* davDirectory =
        [myDirectory stringByAppendingPathComponent:@"HLSexportStream"];
    m_streamPath = [davDirectory stringByAppendingFormat:@"/%@.ps", strDate];
    NSFileManager* fileManage = [NSFileManager defaultManager];
    NSError* pErr;
    BOOL isDir;
    if (NO == [fileManage fileExistsAtPath:myDirectory isDirectory:&isDir]) {
        [fileManage createDirectoryAtPath:myDirectory
              withIntermediateDirectories:YES
                               attributes:nil
                                    error:&pErr];
    }
    if (NO == [fileManage fileExistsAtPath:davDirectory isDirectory:&isDir]) {
        [fileManage createDirectoryAtPath:davDirectory
              withIntermediateDirectories:YES
                               attributes:nil
                                    error:&pErr];
    }
    if (NO == [fileManage fileExistsAtPath:m_streamPath]) //如果不存在
    {
        [data writeToFile:m_streamPath atomically:YES];
    }
}

#pragma mark - 返回上级界面(En:Return to the superior interface)
- (void)onBack
{
    if (m_play) {
        switch (m_recordType) {
        case DeviceRecord:
            [m_play stopDeviceRecord:NO];
            break;
        case CloudRecord:
            [m_play stopCloud:NO];
        default:
            break;
        }
        m_playState = Stop;
    }

    [self dismissViewControllerAnimated:YES completion:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

- (NSTimeInterval)timeIntervalOfString:(NSString*)strTime
{
    NSString* regex = @"[1-9]\\d{3}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
    NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    if (![pred evaluateWithObject:strTime]) {
        NSLog(@"Time format error:%@", strTime);
        return 0;
    }

    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate* date = [formatter dateFromString:strTime];
    return [date timeIntervalSince1970];
}

- (NSTimeInterval)transformToDeltaTime:(NSString*)beginTime EndTime:(NSString*)endTime
{
    NSTimeInterval t_beginTime;
    NSTimeInterval t_endTime;
    NSTimeInterval t_deltaTime;

    t_beginTime = [self timeIntervalOfString:beginTime];
    t_endTime = [self timeIntervalOfString:endTime];

    if (t_endTime >= t_beginTime && t_beginTime != 0 && t_endTime != 0) {
        t_deltaTime = t_endTime - t_beginTime;
    } else {
        return 0;
    }
    return t_deltaTime;
}

- (NSString*)transformToShortTime:(NSString*)time
{
    NSString* regex = @"[1-9]\\d{3}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
    NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if (![pred evaluateWithObject:time]) {
        NSLog(@"Time format error:%@", time);
        return 0;
    }
    NSString* shortTime;
    NSArray* array = [time componentsSeparatedByString:@" "];
    NSLog(@"array:%@", array);
    shortTime = array[1];

    return shortTime;
}

- (NSString*)transformTimeFromLong:(long)time
{
    NSDate* resDate = [NSDate dateWithTimeIntervalSince1970:time];
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    NSString* strTime = [formatter stringFromDate:resDate];
    NSLog(@"时间戳转日期%@", strTime);
    return strTime;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self layoutViews:toInterfaceOrientation force:NO];
}

- (void)viewWillLayoutSubviews
{
    NSLog(@"do nothing, but rewrite method! ");
}

- (void)layoutViews:(UIInterfaceOrientation)InterfaceOrientation force:(BOOL)beForce
{
    CGFloat width = [[[UIDevice currentDevice] systemVersion] floatValue] < 7 ? m_screenFrame.size.width - 20 : m_screenFrame.size.width;
    if (UIInterfaceOrientationIsPortrait(InterfaceOrientation)) {
        [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_FullScreen_Png] forState:UIControlStateNormal];
        [m_play setWindowFrame:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16)];
        m_playImg.frame = CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16);
        m_progressInd.center = m_playImg.center;
        m_playBarView.frame = CGRectMake(0, super.m_yOffset + m_playImg.frame.size.height - RECORD_BAR_HEIGHT, m_playImg.frame.size.width, RECORD_BAR_HEIGHT);
        [self refreshSubView];
        super.m_navigationBar.hidden = NO;
    } else {
        [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_SmallScreen_Png] forState:UIControlStateNormal];
        [m_play setWindowFrame:CGRectMake(0, 0, m_screenFrame.size.height, width)];
        m_playImg.frame = CGRectMake(0, 0, m_screenFrame.size.height, width);
        m_progressInd.center = m_playImg.center;
        m_playBarView.frame = CGRectMake(0, width - RECORD_BAR_HEIGHT, m_screenFrame.size.height, RECORD_BAR_HEIGHT);
        [self refreshSubView];
        [self.view bringSubviewToFront:m_playBarView];
        super.m_navigationBar.hidden = YES;
    }
}

- (BOOL)shouldAutorotate
{
    return YES;
}


- (void)showLoading
{
    dispatch_async(dispatch_get_main_queue(), ^{
         [m_progressInd startAnimating];
    });
}

- (void)hideLoading
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if ([m_progressInd isAnimating]) {
            [m_progressInd stopAnimating];
        }
    });
}

- (void)onActive:(id)sender
{
}

- (void)onResignActive:(id)sender
{
    if (m_play) {
        [m_play stopCloud:NO];
        [m_play stopDeviceRecord:NO];
        [m_play stopAudio];
        m_playState = Stop;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        [self hideLoading];
        m_playImg.hidden = NO;
        [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal];
        [self enableOtherBtn:NO];

        m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected];
        [m_playSlider setValue:0];
    });
}

@end