diff options
author | Martin Poirier <theeth@yahoo.com> | 2008-10-06 21:37:03 +0400 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2008-10-06 21:37:03 +0400 |
commit | d16a8649ff6c2b65492a78eab80bcdbefa9dbe9d (patch) | |
tree | 5d2a2bd518cc7de908ad516a28ee8011d9a7e590 /source/blender/blenkernel | |
parent | 1513e96857538a5a686439247c0608bd1dfce64a (diff) | |
parent | de6a9d0194abacb1bd2de5283e72440b4916325c (diff) |
merge runk 16887:16950
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_blender.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 23 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_global.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_writeffmpeg.h | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 72 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/exotic.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/fluidsim.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/idprop.c | 16 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pointcache.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/writeffmpeg.c | 20 |
13 files changed, 140 insertions, 73 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 0105587c5b4..421b4300c8a 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -41,7 +41,7 @@ struct ListBase; struct MemFile; #define BLENDER_VERSION 247 -#define BLENDER_SUBVERSION 9 +#define BLENDER_SUBVERSION 10 #define BLENDER_MINVERSION 245 #define BLENDER_MINSUBVERSION 15 diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index d6b438a3010..a534dcc3669 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -50,28 +50,6 @@ #define DL_FRONT_CURVE 4 #define DL_BACK_CURVE 8 -#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \ -\ -if( (cyclv)==0 && a==(sizev)-1) break; \ -if(cyclu) { \ - p1= sizeu*a; \ - p2= p1+ sizeu-1; \ - p3= p1+ sizeu; \ - p4= p2+ sizeu; \ - b= 0; \ -} \ -else { \ - p2= sizeu*a; \ - p1= p2+1; \ - p4= p2+ sizeu; \ - p3= p1+ sizeu; \ - b= 1; \ -} \ -if( (cyclv) && a==sizev-1) { \ - p3-= sizeu*sizev; \ - p4-= sizeu*sizev; \ -} - /* prototypes */ @@ -114,6 +92,7 @@ extern void makeDispListMBall(struct Object *ob); extern void shadeDispList(struct Base *base); extern void shadeMeshMCol(struct Object *ob, struct Mesh *me); +int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4); void imagestodisplist(void); void reshadeall_displist(void); void filldisplist(struct ListBase *dispbase, struct ListBase *to); diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 1cc336db69e..3a2dca525b8 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -157,10 +157,10 @@ typedef struct Global { /* **************** GLOBAL ********************* */ /* G.f */ -#define G_DISABLE_OK (1 << 0) +#define G_RENDER_OGL (1 << 0) #define G_PLAYANIM (1 << 1) /* also uses G_FILE_AUTOPLAY */ -#define G_SIMULATION (1 << 3) +#define G_RENDER_SHADOW (1 << 3) #define G_BACKBUFSEL (1 << 4) #define G_PICKSEL (1 << 5) #define G_DRAWNORMALS (1 << 6) diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h index 7819919fba8..02f7ba6f860 100644 --- a/source/blender/blenkernel/BKE_writeffmpeg.h +++ b/source/blender/blenkernel/BKE_writeffmpeg.h @@ -44,15 +44,7 @@ extern "C" { #define FFMPEG_XVID 7 #define FFMPEG_FLV 8 #define FFMPEG_MKV 9 - -#define FFMPEG_CODEC_MPEG1 0 -#define FFMPEG_CODEC_MPEG2 1 -#define FFMPEG_CODEC_MPEG4 2 -#define FFMPEG_CODEC_HUFFYUV 3 -#define FFMPEG_CODEC_DV 4 -#define FFMPEG_CODEC_H264 5 -#define FFMPEG_CODEC_XVID 6 -#define FFMPEG_CODEC_FLV1 7 +#define FFMPEG_OGG 10 #define FFMPEG_PRESET_NONE 0 #define FFMPEG_PRESET_DVD 1 diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index d4b17f97ad9..b7f068c936b 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2701,17 +2701,22 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask) if( (G.f & G_WEIGHTPAINT) && ob==obact ) { MCol *wpcol = (MCol*)calc_weightpaint_colors(ob); int layernum = CustomData_number_of_layers(&me->fdata, CD_MCOL); + int prevactive = CustomData_get_active_layer(&me->fdata, CD_MCOL); + int prevrender = CustomData_get_render_layer(&me->fdata, CD_MCOL); /* ugly hack here, we temporarily add a new active mcol layer with weightpaint colors in it, that is then duplicated in CDDM_from_mesh */ CustomData_add_layer(&me->fdata, CD_MCOL, CD_ASSIGN, wpcol, me->totface); CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum); + CustomData_set_layer_render(&me->fdata, CD_MCOL, layernum); mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1, needMapping, dataMask, -1); CustomData_free_layer_active(&me->fdata, CD_MCOL, me->totface); + CustomData_set_layer_active(&me->fdata, CD_MCOL, prevactive); + CustomData_set_layer_render(&me->fdata, CD_MCOL, prevrender); } else { mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, G.rendering, 1, diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index c29a92558d6..b090ac2b538 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -832,7 +832,9 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu if(len==0) return; sum= (float *)MEM_callocN(sizeof(float)*len, "makeNurbcurve1"); - resolu= (resolu*SEGMENTSU(nu))+1; + resolu= (resolu*SEGMENTSU(nu)); + if((nu->flagu & CU_CYCLIC)==0) resolu++; + if(resolu==0) { MEM_freeN(sum); return; @@ -842,7 +844,8 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu ustart= fp[nu->orderu-1]; if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1]; else uend= fp[nu->pntsu]; - ustep= (uend-ustart)/(resolu-1); + ustep= (uend-ustart)/(resolu - ((nu->flagu & CU_CYCLIC) ? 0 : 1)); + basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3"); if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1; @@ -1678,7 +1681,9 @@ void makeBevelList(Object *ob) } else if((nu->type & 7)==CU_NURBS) { if(nu->pntsv==1) { - len= (resolu*SEGMENTSU(nu))+1; + len= (resolu*SEGMENTSU(nu)); + if((nu->flagu & CU_CYCLIC)==0) len++; + bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList3"); BLI_addtail(&(cu->bev), bl); bl->nr= len; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index be24d1d2474..bf17f0cecbc 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -206,8 +206,9 @@ void addnormalsDispList(Object *ob, ListBase *lb) ndata= dl->nors; for(a=0; a<dl->parts; a++) { - - DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); + + if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) + break; v1= vdata+ 3*p1; n1= ndata+ 3*p1; @@ -271,6 +272,33 @@ void count_displist(ListBase *lb, int *totvert, int *totface) } } +int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4) +{ + if((dl->flag & DL_CYCL_V)==0 && a==(dl->parts)-1) { + return 0; + } + + if(dl->flag & DL_CYCL_U) { + (*p1)= dl->nr*a; + (*p2)= (*p1)+ dl->nr-1; + (*p3)= (*p1)+ dl->nr; + (*p4)= (*p2)+ dl->nr; + (*b)= 0; + } else { + (*p2)= dl->nr*a; + (*p1)= (*p2)+1; + (*p4)= (*p2)+ dl->nr; + (*p3)= (*p1)+ dl->nr; + (*b)= 1; + } + + if( (dl->flag & DL_CYCL_U) && a==dl->parts-1) { \ + (*p3)-= dl->nr*dl->parts; \ + (*p4)-= dl->nr*dl->parts; \ + } + + return 1; +} /* ***************************** shade displist. note colors now are in rgb(a) order ******************** */ @@ -858,12 +886,14 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) } } else if((nu->type & 7)==CU_NURBS) { - len= (resolu*SEGMENTSU(nu))+1; + len= (resolu*SEGMENTSU(nu)); + if((nu->flagu & CU_CYCLIC)==0) len++; dl= MEM_callocN(sizeof(DispList), "makeDispListsurf"); dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts"); BLI_addtail(dispbase, dl); dl->parts= 1; + dl->nr= len; dl->col= nu->mat_nr; dl->charidx = nu->charidx; @@ -1253,13 +1283,40 @@ static void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *disp for (; md; md=md->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); - + if ((md->mode & required_mode) != required_mode) continue; if (mti->isDisabled && mti->isDisabled(md)) continue; if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue; - for (dl=dispbase->first; dl; dl=dl->next) { - mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + /* need to put all verts in 1 block for curve deform */ + if(md->type==eModifierType_Curve) { + float *allverts, *fp; + int totvert= 0; + + for (dl=dispbase->first; dl; dl=dl->next) + totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr; + + fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert"); + for (dl=dispbase->first; dl; dl=dl->next) { + int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + memcpy(fp, dl->verts, sizeof(float) * offs); + fp+= offs; + } + + mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert); + + fp= allverts; + for (dl=dispbase->first; dl; dl=dl->next) { + int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + memcpy(dl->verts, fp, sizeof(float) * offs); + fp+= offs; + } + MEM_freeN(allverts); + } + else { + for (dl=dispbase->first; dl; dl=dl->next) { + mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + } } } @@ -1281,7 +1338,8 @@ static void displist_surf_indices(DispList *dl) for(a=0; a<dl->parts; a++) { - DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); + if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) + break; for(; b<dl->nr; b++, index+=4) { index[0]= p1; diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 479be2ee644..561b564ac39 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -2097,8 +2097,10 @@ static void displist_to_mesh(DispList *dlfirst) } for(a=0; a<dl->parts; a++) { - - DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); + + if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) + break; + p1+= startve; p2+= startve; p3+= startve; diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c index 9c1b3ee5a8d..4580c6cbf8b 100644 --- a/source/blender/blenkernel/intern/fluidsim.c +++ b/source/blender/blenkernel/intern/fluidsim.c @@ -77,7 +77,7 @@ void fluidsim_init(FluidsimModifierData *fluidmd) if(!fss) return; - fss->type = 0; + fss->type = OB_FSBND_NOSLIP; fss->show_advancedoptions = 0; fss->resolutionxyz = 50; diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index 0a140ebaba1..f83f66daa85 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -111,6 +111,7 @@ void IDP_ResizeArray(IDProperty *prop, int newlen) newp->type = prop->type; newp->flag = prop->flag; newp->data.val = prop->data.val; + newp->data.val2 = prop->data.val2; return newp; } @@ -219,6 +220,10 @@ IDProperty *IDP_CopyGroup(IDProperty *prop) return newp; } +/* + replaces a property with the same name in a group, or adds + it if the propery doesn't exist. +*/ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop) { IDProperty *loop; @@ -229,8 +234,7 @@ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop) BLI_remlink(&group->data.group, loop); IDP_FreeProperty(loop); - MEM_freeN(loop); - + MEM_freeN(loop); return; } } @@ -262,7 +266,7 @@ int IDP_InsertToGroup(IDProperty *group, IDProperty *previous, IDProperty *pnew) } group->len++; - + BLI_insertlink(&group->data.group, previous, pnew); return 1; } @@ -348,6 +352,7 @@ IDProperty *IDP_GetProperties(ID *id, int create_if_needed) if (create_if_needed) { id->properties = MEM_callocN(sizeof(IDProperty), "IDProperty"); id->properties->type = IDP_GROUP; + strcpy(id->name, "top_level_group"); } return id->properties; } @@ -423,7 +428,7 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, char *name) return prop; } -/*NOTE: this will free all child properties of list arrays and groups! +/*NOTE: this will free all child properties including list arrays and groups! Also, note that this does NOT unlink anything! Plus it doesn't free the actual IDProperty struct either.*/ void IDP_FreeProperty(IDProperty *prop) @@ -441,7 +446,8 @@ void IDP_FreeProperty(IDProperty *prop) } } -/*Unlinks any IDProperty<->ID linkage that might be going on.*/ +/*Unlinks any IDProperty<->ID linkage that might be going on. + note: currently unused.*/ void IDP_UnlinkProperty(IDProperty *prop) { switch (prop->type) { diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 8f7a90625ba..4a4278a05f8 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3973,9 +3973,6 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi } pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size); - if(part->type==PART_REACTOR) - initialize_particle(pa,p,ob,psys,psmd); - reset_particle(pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot); if(cfra>pa->time && part->flag & PART_LOOP && part->type!=PART_HAIR){ diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 43805959e62..d4676653a4e 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -70,6 +70,12 @@ #include <unistd.h> #endif +#ifdef _WIN32 +#ifndef snprintf +#define snprintf _snprintf +#endif +#endif + /* Creating ID's */ void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb) @@ -164,6 +170,9 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob) - stack_index: index in the modifier stack. we can have cache for more then one stack_index */ +#define MAX_PTCACHE_PATH FILE_MAX +#define MAX_PTCACHE_FILE ((FILE_MAXDIR+FILE_MAXFILE)*2) + static int ptcache_path(PTCacheID *pid, char *filename) { Library *lib; @@ -172,7 +181,7 @@ static int ptcache_path(PTCacheID *pid, char *filename) lib= (pid)? pid->ob->id.lib: NULL; if (G.relbase_valid || lib) { - char file[FILE_MAX]; /* we dont want the dir, only the file */ + char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the file */ char *blendfilename; blendfilename= (lib)? lib->filename: G.sce; @@ -184,7 +193,7 @@ static int ptcache_path(PTCacheID *pid, char *filename) if (i > 6) file[i-6] = '\0'; - sprintf(filename, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */ + snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */ BLI_convertstringcode(filename, blendfilename); BLI_add_slash(filename); return strlen(filename); @@ -192,7 +201,7 @@ static int ptcache_path(PTCacheID *pid, char *filename) /* use the temp path. this is weak but better then not using point cache at all */ /* btempdir is assumed to exist and ALWAYS has a trailing slash */ - sprintf(filename, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid())); + snprintf(filename, MAX_PTCACHE_PATH, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid())); BLI_add_slash(filename); return strlen(filename); } @@ -215,13 +224,13 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho idname = (pid->ob->id.name+2); /* convert chars to hex so they are always a valid filename */ while('\0' != *idname) { - sprintf(newname, "%02X", (char)(*idname++)); + snprintf(newname, MAX_PTCACHE_FILE, "%02X", (char)(*idname++)); newname+=2; len += 2; } if (do_ext) { - sprintf(newname, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ + snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ len += 16; } @@ -290,9 +299,10 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) /* mode is same as fopen's modes */ DIR *dir; struct dirent *de; - char path[FILE_MAX]; - char filename[(FILE_MAXDIR+FILE_MAXFILE)*2]; - char path_full[(FILE_MAXDIR+FILE_MAXFILE)*2]; + char path[MAX_PTCACHE_PATH]; + char filename[MAX_PTCACHE_FILE]; + char path_full[MAX_PTCACHE_FILE]; + char ext[MAX_PTCACHE_PATH]; if(!pid->cache) return; @@ -315,9 +325,11 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) dir = opendir(path); if (dir==NULL) return; + + snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index); while ((de = readdir(dir)) != NULL) { - if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/ + if (strstr(de->d_name, ext)) { /* do we have the right extension?*/ if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */ if (mode == PTCACHE_CLEAR_ALL) { BLI_join_dirfile(path_full, path, de->d_name); @@ -326,8 +338,9 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) /* read the number of the file */ int frame, len2 = strlen(de->d_name); char num[7]; + if (len2 > 15) { /* could crash if trying to copy a string out of this range*/ - strncpy(num, de->d_name + (strlen(de->d_name) - 15), 6); + BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num)); frame = atoi(num); if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) || @@ -353,7 +366,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) int BKE_ptcache_id_exist(PTCacheID *pid, int cfra) { - char filename[(FILE_MAXDIR+FILE_MAXFILE)*2]; + char filename[MAX_PTCACHE_FILE]; if(!pid->cache) return 0; @@ -499,8 +512,8 @@ int BKE_ptcache_object_reset(Object *ob, int mode) /* Use this when quitting blender, with unsaved files */ void BKE_ptcache_remove(void) { - char path[FILE_MAX]; - char path_full[FILE_MAX]; + char path[MAX_PTCACHE_PATH]; + char path_full[MAX_PTCACHE_PATH]; int rmdir = 1; ptcache_path(NULL, path); diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index 64af8258f80..cef6f802729 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -230,6 +230,10 @@ static const char** get_file_extensions(int format) static const char * rv[] = { ".mkv", NULL }; return rv; } + case FFMPEG_OGG: { + static const char * rv[] = { ".ogg", ".ogv", NULL }; + return rv; + } default: return NULL; } @@ -251,14 +255,18 @@ static void write_video_frame(AVFrame* frame) AVPacket packet; av_init_packet(&packet); + if (c->coded_frame->pts != AV_NOPTS_VALUE) { #ifdef FFMPEG_CODEC_TIME_BASE - packet.pts = av_rescale_q(c->coded_frame->pts, - c->time_base, - video_stream->time_base); + packet.pts = av_rescale_q(c->coded_frame->pts, + c->time_base, + video_stream->time_base); #else - packet.pts = c->coded_frame->pts; + packet.pts = c->coded_frame->pts; #endif - fprintf(stderr, "Video Frame PTS: %lld\n", packet.pts); + fprintf(stderr, "Video Frame PTS: %lld\n", packet.pts); + } else { + fprintf(stderr, "Video Frame PTS: not set\n"); + } if (c->coded_frame->key_frame) packet.flags |= PKT_FLAG_KEY; packet.stream_index = video_stream->index; @@ -669,6 +677,8 @@ void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty) switch(ffmpeg_type) { case FFMPEG_AVI: case FFMPEG_MOV: + case FFMPEG_OGG: + case FFMPEG_MKV: fmt->video_codec = ffmpeg_codec; break; case FFMPEG_DV: |