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