Orange fix: Lamp ipos were also not duplicated when indicated... old stuff
[blender.git] / source / blender / blenkernel / intern / writeavi.c
1 /**
2  * Functions for writing avi-format files.
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version. The Blender
12  * Foundation also sells licenses for use in proprietary software under
13  * the Blender License.  See http://www.blender.org/BL/ for information
14  * about this.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  *
25  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): Robert Wenzlaff
31  *
32  * ***** END GPL/BL DUAL LICENSE BLOCK *****
33  * 
34  */
35
36 #include <string.h>
37
38 #include "MEM_guardedalloc.h"
39 #include "BLI_blenlib.h"
40
41 #include "AVI_avi.h"
42
43 #include "BKE_bad_level_calls.h"
44 #include "BKE_global.h"
45
46 #include "IMB_imbuf_types.h"
47 #include "IMB_imbuf.h"
48
49 /* RPW 11-21-2002 */
50 #include "DNA_scene_types.h"
51 /* RPW - End */
52
53 #include "BKE_writeavi.h"
54
55 static AviMovie *avi=NULL;
56 static int sframe;
57
58 void makeavistring (char *string) 
59 {
60         char txt[64];
61
62         if (string==0) return;
63
64         strcpy(string, G.scene->r.pic);
65         BLI_convertstringcode(string, G.sce, G.scene->r.cfra);
66
67         RE_make_existing_file(string);
68
69         if (BLI_strcasecmp(string + strlen(string) - 4, ".avi")) {
70                 sprintf(txt, "%04d_%04d.avi", (G.scene->r.sfra) , (G.scene->r.efra) );
71                 strcat(string, txt);
72         }
73 }
74
75 void start_avi(void)
76 {
77         int x, y;
78         char name[256];
79         AviFormat format;
80         int quality, framerate;
81         
82         makeavistring(name);
83
84         sframe = (G.scene->r.sfra);
85         x = R.rectx;
86         y = R.recty;
87
88         quality= R.r.quality;
89         framerate= R.r.frs_sec;
90         
91         avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
92
93         /* RPW 11-21-2002 
94          if (R.r.imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB;
95         */
96         if (R.r.imtype != R_AVIJPEG ) format = AVI_FORMAT_AVI_RGB;
97         else format = AVI_FORMAT_MJPEG;
98
99         if (AVI_open_compress (name, avi, 1, format) != AVI_ERROR_NONE) {
100                 error("open movie");
101                 MEM_freeN (avi);
102                 avi = NULL;
103                 return;
104         }
105                         
106         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_WIDTH, &x);
107         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_HEIGHT, &y);
108         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_QUALITY, &quality);           
109         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_FRAMERATE, &framerate);
110
111         avi->interlace= 0;
112         avi->odd_fields= 0;
113 /*      avi->interlace= R.r.mode & R_FIELDS; */
114 /*      avi->odd_fields= (R.r.mode & R_ODDFIELD)?1:0; */
115         
116         printf("Created avi: %s\n", name);
117 }
118
119 void append_avi(int frame)
120 {
121         unsigned int *rt1, *rt2, *rectot;
122         int x, y;
123         char *cp, rt;
124         
125         if (avi == NULL) {
126                 G.afbreek = 1;
127                 return;
128         }
129
130         /* note that libavi free's the buffer... stupid interface - zr */
131         rectot= MEM_mallocN(R.rectx*R.recty*sizeof(int), "rectot");
132         rt1= rectot;
133         rt2= R.rectot + (R.recty-1)*R.rectx;
134         /* flip y and convert to abgr */
135         for (y=0; y < R.recty; y++, rt1+= R.rectx, rt2-= R.rectx) {
136                 memcpy (rt1, rt2, R.rectx*sizeof(int));
137                 
138                 cp= (char *)rt1;
139                 for(x= R.rectx; x>0; x--) {
140                         rt= cp[0];
141                         cp[0]= cp[3];
142                         cp[3]= rt;
143                         rt= cp[1];
144                         cp[1]= cp[2];
145                         cp[2]= rt;
146                         cp+= 4;
147                 }
148         }
149         
150         AVI_write_frame (avi, (frame-sframe), AVI_FORMAT_RGB32, rectot, R.rectx*R.recty*4);
151         printf ("added frame %3d (frame %3d in avi): ", frame, frame-sframe);
152 }
153
154 void end_avi(void)
155 {
156         if (avi == NULL) return;
157
158         AVI_close_compress (avi);
159         MEM_freeN (avi);
160         avi= NULL;
161 }