40 lines
1.9 KiB
C
40 lines
1.9 KiB
C
|
|
#include "project_internal.h"
|
||
|
|
#include "xtc/xtc_editing.h"
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
static xtc_result selection_valid(const xtc_project *p,const uint64_t *ids,size_t count)
|
||
|
|
{
|
||
|
|
size_t i,j;xtc_clip_info c;
|
||
|
|
if(!p || !ids || !count || count>XTC_PROJECT_MAX_CLIPS)return XTC_ERR_INVALID_ARGUMENT;
|
||
|
|
for(i=0;i<count;++i) {
|
||
|
|
if(xtc_project_find_clip(p,ids[i],&c)!=XTC_OK)return XTC_ERR_NOT_FOUND;
|
||
|
|
for(j=0;j<i;++j)if(ids[i]==ids[j])return XTC_ERR_INVALID_ARGUMENT;
|
||
|
|
}
|
||
|
|
return XTC_OK;
|
||
|
|
}
|
||
|
|
static void publish(xtc_project *p,xtc_project *copy)
|
||
|
|
{
|
||
|
|
xtc_graph *old=p->graph;*p=*copy;copy->graph=old;
|
||
|
|
}
|
||
|
|
xtc_result xtc_project_transform_clips(xtc_project *p,const uint64_t *ids,size_t count,
|
||
|
|
xtc_clip_operation operation,int64_t amount,uint64_t *out_ids)
|
||
|
|
{
|
||
|
|
xtc_project *copy=NULL;size_t i;uint64_t output[XTC_PROJECT_MAX_CLIPS];
|
||
|
|
xtc_result r=selection_valid(p,ids,count);
|
||
|
|
if(r!=XTC_OK)return r;
|
||
|
|
if(operation<XTC_CLIPS_MOVE || operation>XTC_CLIPS_DELETE ||
|
||
|
|
amount<-(int64_t)XTC_PROJECT_MAX_TICK || amount>(int64_t)XTC_PROJECT_MAX_TICK)return XTC_ERR_INVALID_ARGUMENT;
|
||
|
|
r=xtc_project_clone(p,©);
|
||
|
|
for(i=0;r==XTC_OK && i<count;++i) {
|
||
|
|
xtc_clip_info c;int64_t start;
|
||
|
|
r=xtc_project_find_clip(copy,ids[i],&c);if(r!=XTC_OK)break;
|
||
|
|
start=(int64_t)c.start_tick+amount;output[i]=ids[i];
|
||
|
|
if(operation==XTC_CLIPS_DELETE)r=xtc_project_remove_clip(copy,ids[i]);
|
||
|
|
else if(start<0 || start>(int64_t)XTC_PROJECT_MAX_TICK)r=XTC_ERR_INVALID_ARGUMENT;
|
||
|
|
else if(operation==XTC_CLIPS_DUPLICATE)r=xtc_project_duplicate_clip(copy,ids[i],c.track_id,(uint64_t)start,output+i);
|
||
|
|
else r=xtc_project_edit_clip(copy,ids[i],c.track_id,(uint64_t)start,c.length_tick,c.offset_tick);
|
||
|
|
}
|
||
|
|
if(r==XTC_OK){publish(p,copy);if(out_ids)memcpy(out_ids,output,count*sizeof(*output));}
|
||
|
|
xtc_project_destroy(copy);return r;
|
||
|
|
}
|