//
//  NvTimelineUtils.h
//  SDKDemo
//
//  说明：resetXXX接口适用于编辑过程中编辑信息的非连续变化操作，例如按钮的点击操作；不适用于信息的连续变化操作，例如滑动条的滑动的响应处理。
//
//  Created by shizhouhu on 2018/6/26.
 //
//

#import <Foundation/Foundation.h>
#import "NvsTimeline.h"
#import "NvsVideoTrack.h"
#import "NvsAudioTrack.h"
#import "NvTimelineData.h"
#import "NvUtils.h"
#import "NvsVideoClip.h"
#import "NvsMultiThumbnailSequenceView.h"
#import "NvRecordingInfo.h"

#define NV_TIME_BASE 1000000
#define TIMELINE_FX_REVERSE  1
#define TIMELINE_FX_REPEAT   2
#define TIMELINE_FX_SLOWMOTION  3


#define NV_MUSIC_SOUND_TRACK     0    //音乐轨道
#define NV_DUBBING_SOUND_TRACK   1    //配音音轨


@interface NvTimelineUtils : NSObject

@property (nonatomic, assign) BOOL isCaptionVC;//是否是字幕页面

@property (nonatomic, assign) BOOL isVideoFx;

+(NvTimelineUtils *) sharedInstance;

/**
 * 创建时间线。
 */
+ (NvsTimeline *)createTimeline:(NvEditMode)editMode;

/**
 * 删除时间线。
 */
+ (void)removeTimeline:(NvsTimeline *)timeline;

/**
 * 根据timeline data单例中保存的信息重构时间线。
 */
+ (void)recreateTimeline:(NvsTimeline *)timeline;

/**
 * 根据片段信息重置时间线上的片段。
 */
+ (void)resetEditData:(NvsTimeline *)timeline editDataArray:(NSArray<NvEditDataModel *> *)editDataArray;

/**
 * 根据主题信息重置时间线上的主题。
 */
+ (void)resetTheme:(NvsTimeline *)timeline themeInfo:(NvThemeInfoModel *)themeInfo;

/**
 * 根据字幕信息重置时间线上的字幕。
 */
+ (void)resetCaption:(NvsTimeline *)timeline captionDataArray:(NSArray<NvCaptionInfoModel *> *)captionDataArray;

/**
 * 根据贴纸信息重置时间线上的贴纸。
 */
+ (void)resetSticker:(NvsTimeline *)timeline stickerDataArray:(NSArray<NvStickerInfoModel *> *)stickerDataArray;

/**
 * 根据水印信息重置时间线上的水印。
 */
+ (void)resetWatermark:(NvsTimeline *)timeline watermarkInfo:(NvWatermarkInfoModel *)watermarkInfo;

/**
 * 根据转场信息重置时间线上的转场。
 */
+ (void)resetTransition:(NvsTimeline *)timeline transitionDataArray:(NSArray<NvTransitionInfoModel *> *)transitionDataArray;

/**
 * 根据粒子信息重置时间线上的粒子。
 */
+ (void)resetParticle:(NvsTimeline *)timeline particleDataArray:(NSArray<NvParticleInfoModel *> *)particleDataArray;

/**
 * 根据滤镜信息重置时间线上的滤镜。
 */
+ (void)resetVideoFx:(NvsTimeline *)timeline videoFxDataArray:(NSArray<NvTimeFilterInfoModel *> *)videoFxDataArray;

/**
 * 根据音乐信息重置时间线上的音乐。
 */
+ (void)resetMusicTrack:(NvsTimeline *)timeline musicDataArray:(NSArray<NvMusicInfoModel *> *)musicDataArray;

/**
 * 根据配音信息重置时间线上的配音。
 */
+ (void)resetDubbingTrack:(NvsTimeline *)timeline dubbingModel:(NvDubbingModel *)dubbingModel;

/**
 * 根据片段信息获取片段在时间线的入点
 */
+ (int64_t)getClipInpoint:(NvsTimeline *)timeline clipInfo:(NvEditDataModel *)clipInfo;

/**
 * 根据片段信息获取片段在时间线的出点
 */
+ (int64_t)getClipOutpoint:(NvsTimeline *)timeline clipInfo:(NvEditDataModel *)clipInfo;

/**
 * 根据片段信息获取时间线上的视频片段.
 * 说明：如果需要连续改变片段的某个属性，例如片段的角度，饱和度等，上述resetXXX接口执行效率不如直接设置NvsVideoClip的对象。
 */
+ (NvsVideoClip *)getTimelineVideoClip:(NvsTimeline *)timeline clipInfo:(NvEditDataModel *)clipInfo;

/**
 * 获取视频轨道的缩略图描述数组
 */
+ (NSMutableArray<NvsThumbnailSequenceDesc *> *)getThumbnailSequenceDescArray:(NvsTimeline *)timeline;

/**
 * 定位到时间线上某一点
 */
+ (void)seekTimeline:(NvsTimeline *)timeline atTime:(int64_t)atTime;

/**
 * 从时间线上某一点开始播放
 */
+ (void)playTimeline:(NvsTimeline *)timeline atTime:(int64_t)atTime;

/**
 重复轨道上的某个点
 */
+ (BOOL)doRepeatTimeline:(uint64_t)point videotrack:(NvsVideoTrack*_Nullable)track originCutTrimInfo:(NvRecordingInfo *)info;
//慢动作
+ (BOOL)doSlowMotionTimeline:(uint64_t)point videotrack:(NvsVideoTrack*_Nullable)track;

@end
