- remove all obsolete inclusions of BLI_winstuff.h (due to recent changes)
[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 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 #include "MEM_guardedalloc.h"
43 #include "BLI_blenlib.h"
44
45 #include "AVI_avi.h"
46
47 #include "BKE_bad_level_calls.h"
48 #include "BKE_global.h"
49
50 #include "IMB_imbuf_types.h"
51 #include "IMB_imbuf.h"
52
53 /* RPW 11-21-2002 */
54 #include "DNA_scene_types.h"
55 /* RPW - End */
56
57 #include "BKE_writeavi.h"
58
59 static AviMovie *avi=NULL;
60 static int sframe;
61
62 void makeavistring (char *string) 
63 {
64         char txt[64];
65
66         if (string==0) return;
67
68         strcpy(string, G.scene->r.pic);
69         BLI_convertstringcode(string, G.sce, G.scene->r.cfra);
70
71         RE_make_existing_file(string);
72
73         if (strcasecmp(string + strlen(string) - 4, ".avi")) {
74                 sprintf(txt, "%04d_%04d.avi", (G.scene->r.sfra) , (G.scene->r.efra) );
75                 strcat(string, txt);
76         }
77 }
78
79 void start_avi(void)
80 {
81         int x, y;
82         char name[256];
83         AviFormat format;
84         int quality, framerate;
85         
86         makeavistring(name);
87
88         sframe = (G.scene->r.sfra);
89         x = R.rectx;
90         y = R.recty;
91
92         quality= R.r.quality;
93         framerate= R.r.frs_sec;
94         
95         avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
96
97         /* RPW 11-21-2002 
98          if (R.r.imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB;
99         */
100         if (R.r.imtype != R_AVIJPEG ) format = AVI_FORMAT_AVI_RGB;
101         else format = AVI_FORMAT_MJPEG;
102
103         if (AVI_open_compress (name, avi, 1, format) != AVI_ERROR_NONE) {
104                 error("open movie");
105                 MEM_freeN (avi);
106                 avi = NULL;
107                 return;
108         }
109                         
110         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_WIDTH, &x);
111         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_HEIGHT, &y);
112         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_QUALITY, &quality);           
113         AVI_set_compress_option (avi, AVI_OPTION_TYPE_MAIN, 0, AVI_OPTION_FRAMERATE, &framerate);
114
115         avi->interlace= 0;
116         avi->odd_fields= 0;
117 /*      avi->interlace= R.r.mode & R_FIELDS; */
118 /*      avi->odd_fields= (R.r.mode & R_ODDFIELD)?1:0; */
119         
120         printf("Created avi: %s\n", name);
121 }
122
123 void append_avi(int frame)
124 {
125         unsigned int *rt1, *rt2, *temp;
126         int y;
127
128         if (avi == NULL) {
129                 G.afbreek = 1;
130                 return;
131         }
132
133                 /* note that libavi free's the buffer... stupid interface - zr */
134         temp = MEM_mallocN(R.rectx*R.recty*4, "append_avi buf");
135
136         rt1= temp;
137         rt2= R.rectot + (R.recty-1)*R.rectx;
138         for (y=0; y < R.recty; y++, rt1+= R.rectx, rt2-= R.rectx) {
139                 memcpy (rt1, rt2, R.rectx*4);
140         }
141
142         IMB_convert_rgba_to_abgr(R.rectx*R.recty, temp);
143         
144         AVI_write_frame (avi, (frame-sframe), AVI_FORMAT_RGB32, 
145                                                                                 temp, R.rectx*R.recty*4);
146         printf ("added frame %3d (frame %3d in avi): ", frame, frame-sframe);
147 }
148
149 void end_avi(void)
150 {
151         if (avi == NULL) return;
152
153         AVI_close_compress (avi);
154         MEM_freeN (avi);
155         avi= NULL;
156 }