annotate libmpdemux/muxer_avi.c @ 18066:2ee39341b7a6

fix segfault in the skin browser when sbSelectedSkin gets dereferenced before setting, when no skin is selected in the skin list upon opening the browser, and "Cancel" or "OK" buttons get clicked. Noticed when runnig freshly compiled gmplayer on a system where the skins were still under the old location. based on a combined patch by Stanislav Maslovski <stanislav POIS maslovski AH gmail POIS com>
author gpoirier
date Sun, 09 Apr 2006 13:52:45 +0000
parents 92ac78a93625
children 4928dd61f136
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 1
diff changeset
1 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 1
diff changeset
2 #include <stdlib.h>
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
3 #include <string.h>
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
4 #include <inttypes.h>
8591
35bfd508bf5f FreeBSD fix
nexus
parents: 8585
diff changeset
5 #include <unistd.h>
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
6 #include <limits.h>
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
7
2555
66837325b929 config.h cleanup, few things added to steram/demuxer headers
arpi
parents: 2529
diff changeset
8 #include "config.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 14753
diff changeset
9 #include "version.h"
2555
66837325b929 config.h cleanup, few things added to steram/demuxer headers
arpi
parents: 2529
diff changeset
10
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
11 #include "stream.h"
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
12 #include "demuxer.h"
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
13 #include "stheader.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 1
diff changeset
14
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
15 #include "bswap.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 1
diff changeset
16
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
17 #include "muxer.h"
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
18 #include "aviheader.h"
12341
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 12235
diff changeset
19 #include "ms_hdr.h"
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
20 #include "mp_msg.h"
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
21 #include "help_mp.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22
7145
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
23 extern char *info_name;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
24 extern char *info_artist;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
25 extern char *info_genre;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
26 extern char *info_subject;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
27 extern char *info_copyright;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
28 extern char *info_sourceform;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
29 extern char *info_comment;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
30
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
31 /* #define ODML_CHUNKLEN 0x02000000 */ /* for testing purposes */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
32 #define ODML_CHUNKLEN 0x40000000
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
33 #define ODML_NOTKEYFRAME 0x80000000U
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
34 #define MOVIALIGN 0x00001000
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
35
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
36 float avi_aspect_override = -1.0;
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
37 int write_odml = 1;
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
38
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
39 struct avi_odmlidx_entry {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
40 uint64_t ofs;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
41 uint32_t len;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
42 uint32_t flags;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
43 };
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
44
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
45 struct avi_odmlsuperidx_entry {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
46 uint64_t ofs;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
47 uint32_t len;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
48 uint32_t duration;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
49 };
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
50
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
51 struct avi_stream_info {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
52 int idxsize;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
53 int idxpos;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
54 int superidxpos;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
55 int superidxsize;
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
56 int riffofspos;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
57 int riffofssize;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
58 off_t *riffofs;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
59 struct avi_odmlidx_entry *idx;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
60 struct avi_odmlsuperidx_entry *superidx;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
61 };
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
62
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
63 static unsigned int avi_aspect(muxer_stream_t *vstream)
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
64 {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
65 int x,y;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
66 float aspect = vstream->aspect;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
67
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
68 if (avi_aspect_override > 0.0) {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
69 aspect = avi_aspect_override;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
70 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
71
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
72 if (aspect <= 0.0) return 0;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
73
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
74 if (aspect > 15.99/9.0 && aspect < 16.01/9.0) {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
75 return MAKE_AVI_ASPECT(16, 9);
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
76 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
77 if (aspect > 3.99/3.0 && aspect < 4.01/3.0) {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
78 return MAKE_AVI_ASPECT(4, 3);
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
79 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
80
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
81 if (aspect >= 1.0) {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
82 x = 16384;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
83 y = (float)x / aspect;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
84 } else {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
85 y = 16384;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
86 x = (float)y * aspect;
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
87 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
88
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
89 return MAKE_AVI_ASPECT(x, y);
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
90 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
91
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
92 static muxer_stream_t* avifile_new_stream(muxer_t *muxer,int type){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
93 struct avi_stream_info *si;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
94 muxer_stream_t* s;
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
95 if (!muxer) return NULL;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
96 if(muxer->avih.dwStreams>=MUXER_MAX_STREAMS){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
97 mp_msg(MSGT_MUXER, MSGL_ERR, "Too many streams! increase MUXER_MAX_STREAMS !\n");
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
98 return NULL;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
99 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
100 s=malloc(sizeof(muxer_stream_t));
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
101 memset(s,0,sizeof(muxer_stream_t));
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
102 if(!s) return NULL; // no mem!?
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
103 muxer->streams[muxer->avih.dwStreams]=s;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
104 s->type=type;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
105 s->id=muxer->avih.dwStreams;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
106 s->timer=0.0;
2652
fd279f14b9ab new stream field: size
arpi
parents: 2635
diff changeset
107 s->size=0;
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
108 s->muxer=muxer;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
109 s->priv=si=malloc(sizeof(struct avi_stream_info));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
110 memset(si,0,sizeof(struct avi_stream_info));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
111 si->idxsize=256;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
112 si->idx=malloc(sizeof(struct avi_odmlidx_entry)*si->idxsize);
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
113 si->riffofssize=16;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
114 si->riffofs=malloc(sizeof(off_t)*(si->riffofssize+1));
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
115 memset(si->riffofs, 0, sizeof(off_t)*si->riffofssize);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
116
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
117 switch(type){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
118 case MUXER_TYPE_VIDEO:
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
119 s->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'d','c');
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
120 s->h.fccType=streamtypeVIDEO;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
121 if(!muxer->def_v) muxer->def_v=s;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
122 break;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
123 case MUXER_TYPE_AUDIO:
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
124 s->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'w','b');
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
125 s->h.fccType=streamtypeAUDIO;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
126 break;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
127 default:
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
128 mp_msg(MSGT_MUXER, MSGL_WARN, "Warning! unknown stream type: %d\n",type);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
129 return NULL;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
130 }
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
131 muxer->avih.dwStreams++;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
132 return s;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
133 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
135 static void write_avi_chunk(FILE *f,unsigned int id,int len,void* data){
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
136 int le_len = le2me_32(len);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
137 int le_id = le2me_32(id);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
138 fwrite(&le_id,4,1,f);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
139 fwrite(&le_len,4,1,f);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
140
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 if(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 if(data){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 // DATA
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 fwrite(data,len,1,f);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 if(len&1){ // padding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 unsigned char zerobyte=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 fwrite(&zerobyte,1,1,f);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 // JUNK
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 char *avi_junk_data="[= MPlayer junk data! =]";
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 if(len&1) ++len; // padding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 int l=strlen(avi_junk_data);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 if(l>len) l=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 fwrite(avi_junk_data,l,1,f);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 len-=l;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
161 }
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
162
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
163 static void write_avi_list(FILE *f,unsigned int id,int len);
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
164 static void avifile_write_standard_index(muxer_t *muxer);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
165
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
166 static void avifile_odml_new_riff(muxer_t *muxer)
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
167 {
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
168 struct avi_stream_info *vsi = muxer->def_v->priv;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
169 FILE *f = muxer->file;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
170 uint32_t riff[3];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
171
12497
da17b2c262de no kabbe-bytes or men in black or any of that nonsense here...
rfelker
parents: 12363
diff changeset
172 mp_msg(MSGT_MUXER, MSGL_INFO, "ODML: Starting new RIFF chunk at %dMB.\n", (int)(muxer->file_end/1024/1024));
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
173
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
174 vsi->riffofspos++;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
175 if (vsi->riffofspos>=vsi->riffofssize) {
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
176 vsi->riffofssize+=16;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
177 vsi->riffofs=realloc(vsi->riffofs,sizeof(off_t)*(vsi->riffofssize+1));
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
178 }
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
179 vsi->riffofs[vsi->riffofspos] = ftello(f);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
180
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
181 /* RIFF/AVIX chunk */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
182 riff[0]=le2me_32(mmioFOURCC('R','I','F','F'));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
183 riff[1]=0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
184 riff[2]=le2me_32(mmioFOURCC('A','V','I','X'));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
185 fwrite(riff,12,1,f);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
186
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
187 write_avi_list(f,listtypeAVIMOVIE,0);
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
188
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
189 muxer->file_end = ftello(f);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
190 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
191
13250
b8b626781ab0 fixed warning in my patch
rfelker
parents: 13249
diff changeset
192 static void avifile_write_header(muxer_t *muxer);
b8b626781ab0 fixed warning in my patch
rfelker
parents: 13249
diff changeset
193
17487
fa17424b4c7b change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents: 17366
diff changeset
194 static void avifile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags, double dts, double pts){
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
195 off_t rifflen;
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
196 muxer_t *muxer=s->muxer;
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
197 struct avi_stream_info *si = s->priv;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
198 struct avi_stream_info *vsi = muxer->def_v->priv;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
199 int paddedlen = len + (len&1);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
200
13249
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
201 if (s->type == MUXER_TYPE_VIDEO && !s->h.dwSuggestedBufferSize) {
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
202 off_t pos=ftell(muxer->file);
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
203 fseek(muxer->file, 0, SEEK_SET);
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
204 avifile_write_header(muxer);
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
205 fseek(muxer->file, pos, SEEK_SET);
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
206 }
a6642a4330fa ensure that avi files have a valid header as soon as possible.
rfelker
parents: 12497
diff changeset
207
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
208 rifflen = muxer->file_end - vsi->riffofs[vsi->riffofspos] - 8;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
209 if (vsi->riffofspos == 0) {
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
210 rifflen += 8+muxer->idx_pos*sizeof(AVIINDEXENTRY);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
211 }
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
212 if (rifflen + paddedlen > ODML_CHUNKLEN && write_odml == 1) {
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
213 if (vsi->riffofspos == 0) {
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
214 avifile_write_standard_index(muxer);
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
215 }
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
216 avifile_odml_new_riff(muxer);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
217 }
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
218
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
219 if (vsi->riffofspos == 0) {
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
220 // add to the traditional index:
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
221 if(muxer->idx_pos>=muxer->idx_size){
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
222 muxer->idx_size+=256; // 4kB
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
223 muxer->idx=realloc(muxer->idx,16*muxer->idx_size);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
224 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
225 muxer->idx[muxer->idx_pos].ckid=s->ckid;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
226 muxer->idx[muxer->idx_pos].dwFlags=flags; // keyframe?
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
227 muxer->idx[muxer->idx_pos].dwChunkOffset=muxer->file_end-(muxer->movi_start-4);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
228 muxer->idx[muxer->idx_pos].dwChunkLength=len;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
229 ++muxer->idx_pos;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
230 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
231
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
232 // add to odml index
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
233 if(si->idxpos>=si->idxsize){
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
234 si->idxsize+=256;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
235 si->idx=realloc(si->idx,sizeof(*si->idx)*si->idxsize);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
236 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
237 si->idx[si->idxpos].flags=(flags&AVIIF_KEYFRAME)?0:ODML_NOTKEYFRAME;
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
238 si->idx[si->idxpos].ofs=muxer->file_end;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
239 si->idx[si->idxpos].len=len;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
240 ++si->idxpos;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
241
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
242 // write out the chunk:
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
243 write_avi_chunk(muxer->file,s->ckid,len,s->buffer); /* unsigned char */
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
244
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
245 if (len > s->h.dwSuggestedBufferSize){
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
246 s->h.dwSuggestedBufferSize = len;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
247 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
248 if((unsigned int)len>s->h.dwSuggestedBufferSize) s->h.dwSuggestedBufferSize=len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
250 muxer->file_end += 8 + paddedlen;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
253 static void write_avi_list(FILE *f,unsigned int id,int len){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 unsigned int list_id=FOURCC_LIST;
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
255 int le_len;
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
256 int le_id;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 len+=4; // list fix
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
258 list_id = le2me_32(list_id);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
259 le_len = le2me_32(len);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
260 le_id = le2me_32(id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 fwrite(&list_id,4,1,f);
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
262 fwrite(&le_len,4,1,f);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
263 fwrite(&le_id,4,1,f);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265
11374
e00d3351b912 Fix waveformatex size calculation
ranma
parents: 9007
diff changeset
266 #define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(wf)->cbSize)
2635
c1e24e01601b fixed AVI header creation - now should be compatible with NaNdub
arpi
parents: 2555
diff changeset
267
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
268 static void avifile_write_header(muxer_t *muxer){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
269 uint32_t riff[3];
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
270 unsigned int dmlh[1];
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
271 unsigned int i;
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
272 unsigned int hdrsize;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
273 muxer_info_t info[16];
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
274 FILE *f = muxer->file;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
275 VideoPropHeader vprp;
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
276 uint32_t aspect = avi_aspect(muxer->def_v);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
277 off_t pos;
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
278 struct avi_stream_info *vsi = muxer->def_v->priv;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
279 int isodml = vsi->riffofspos > 0;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
280
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
281 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingHeader);
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
282 if (aspect == 0) {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
283 mp_msg(MSGT_MUXER, MSGL_INFO, "ODML: Aspect information not (yet?) available or unspecified, not writing vprp header.\n");
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
284 } else {
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
285 mp_msg(MSGT_MUXER, MSGL_INFO, "ODML: vprp aspect is %d:%d.\n", aspect >> 16, aspect & 0xffff);
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
286 }
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
287
17648
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
288 /* deal with stream delays */
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
289 for (i = 0; muxer->streams[i] && i < MUXER_MAX_STREAMS; ++i) {
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
290 muxer_stream_t *s = muxer->streams[i];
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
291 if (s->type == MUXER_TYPE_AUDIO && muxer->audio_delay_fix > 0.0) {
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
292 s->h.dwStart = muxer->audio_delay_fix * s->h.dwRate/s->h.dwScale;
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
293 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_SettingAudioDelay, (float)s->h.dwStart * s->h.dwScale/s->h.dwRate);
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
294 }
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
295 if (s->type == MUXER_TYPE_VIDEO && muxer->audio_delay_fix < 0.0) {
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
296 s->h.dwStart = -muxer->audio_delay_fix * s->h.dwRate/s->h.dwScale;
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
297 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_SettingVideoDelay, (float)s->h.dwStart * s->h.dwScale/s->h.dwRate);
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
298 }
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
299 }
5963b50c2178 dwStart support for mencoder.
corey
parents: 17487
diff changeset
300
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
301 if (isodml) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
302 unsigned int rifflen, movilen;
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
303 int i;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
304
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
305 vsi->riffofs[vsi->riffofspos+1] = muxer->file_end;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
306
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
307 /* fixup RIFF lengths */
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
308 for (i=0; i<=vsi->riffofspos; i++) {
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
309 rifflen = vsi->riffofs[i+1] - vsi->riffofs[i] - 8;
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
310 movilen = le2me_32(rifflen - 12);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
311 rifflen = le2me_32(rifflen);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
312 fseeko(f, vsi->riffofs[i]+4, SEEK_SET);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
313 fwrite(&rifflen,4,1,f);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
314
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
315 /* fixup movi length */
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
316 if (i > 0) {
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
317 fseeko(f, vsi->riffofs[i]+16, SEEK_SET);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
318 fwrite(&movilen,4,1,f);
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
319 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
320 }
7145
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
321
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
322 fseeko(f, 12, SEEK_SET);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
323 } else {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
324 // RIFF header:
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
325 riff[0]=mmioFOURCC('R','I','F','F');
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
326 riff[1]=muxer->file_end-2*sizeof(unsigned int); // filesize
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
327 riff[2]=formtypeAVI; // 'AVI '
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
328 riff[0]=le2me_32(riff[0]);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
329 riff[1]=le2me_32(riff[1]);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
330 riff[2]=le2me_32(riff[2]);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
331 fwrite(&riff,12,1,f);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
332 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
333
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
334 // update AVI header:
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
335 if(muxer->def_v){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
336 int i;
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
337 muxer->avih.dwMicroSecPerFrame=1000000.0*muxer->def_v->h.dwScale/muxer->def_v->h.dwRate;
2635
c1e24e01601b fixed AVI header creation - now should be compatible with NaNdub
arpi
parents: 2555
diff changeset
338 // muxer->avih.dwMaxBytesPerSec=1000000; // dummy!!!!! FIXME
c1e24e01601b fixed AVI header creation - now should be compatible with NaNdub
arpi
parents: 2555
diff changeset
339 // muxer->avih.dwPaddingGranularity=2; // ???
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
340 muxer->avih.dwFlags|=AVIF_ISINTERLEAVED|AVIF_TRUSTCKTYPE;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
341 muxer->avih.dwTotalFrames=0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
342 for (i=0; i<muxer->idx_pos; i++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
343 if (muxer->idx[i].ckid == muxer->def_v->ckid)
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
344 muxer->avih.dwTotalFrames++;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
345 }
2635
c1e24e01601b fixed AVI header creation - now should be compatible with NaNdub
arpi
parents: 2555
diff changeset
346 // muxer->avih.dwSuggestedBufferSize=muxer->def_v->h.dwSuggestedBufferSize;
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
347 muxer->avih.dwWidth=muxer->def_v->bih->biWidth;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
348 muxer->avih.dwHeight=muxer->def_v->bih->biHeight;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
349 }
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
350
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 // AVI header:
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
352 hdrsize=sizeof(muxer->avih)+8;
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
353 if (isodml) hdrsize+=sizeof(dmlh)+20; // dmlh
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
354 // calc total header size:
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
355 for(i=0;i<muxer->avih.dwStreams;i++){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
356 muxer_stream_t *s = muxer->streams[i];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
357 struct avi_stream_info *si = s->priv;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
358
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
359 hdrsize+=12; // LIST
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
360 hdrsize+=sizeof(muxer->streams[i]->h)+8; // strh
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
361 switch(muxer->streams[i]->type){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
362 case MUXER_TYPE_VIDEO:
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
363 hdrsize+=muxer->streams[i]->bih->biSize+8; // strf
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
364 if (aspect != 0) {
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
365 hdrsize+=8+4*(9+8*1); // vprp
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
366 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
367 break;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
368 case MUXER_TYPE_AUDIO:
2635
c1e24e01601b fixed AVI header creation - now should be compatible with NaNdub
arpi
parents: 2555
diff changeset
369 hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
370 break;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
371 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
372 if (isodml && si && si->superidx && si->superidxsize) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
373 hdrsize += 32 + 16*si->superidxsize; //indx
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
374 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
375 }
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
376 write_avi_list(f,listtypeAVIHEADER,hdrsize);
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
377
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
378 le2me_MainAVIHeader(&muxer->avih);
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
379 write_avi_chunk(f,ckidAVIMAINHDR,sizeof(muxer->avih),&muxer->avih); /* MainAVIHeader */
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
380 le2me_MainAVIHeader(&muxer->avih);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
381
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
382 // stream headers:
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
383 for(i=0;i<muxer->avih.dwStreams;i++){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
384 muxer_stream_t *s = muxer->streams[i];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
385 struct avi_stream_info *si = s->priv;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
386 unsigned int idxhdr[8];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
387 int j,n;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
388
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
389 hdrsize=sizeof(s->h)+8; // strh
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
390 if (si && si->superidx && si->superidxsize) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
391 hdrsize += 32 + 16*si->superidxsize; //indx
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
392 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
393 switch(s->type){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
394 case MUXER_TYPE_VIDEO:
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
395 hdrsize+=s->bih->biSize+8; // strf
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
396 s->h.fccHandler = s->bih->biCompression;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
397 s->h.rcFrame.right = s->bih->biWidth;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
398 s->h.rcFrame.bottom = s->bih->biHeight;
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
399 if (aspect != 0) {
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
400 // fill out vprp info
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
401 memset(&vprp, 0, sizeof(vprp));
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
402 vprp.dwVerticalRefreshRate = (s->h.dwRate+s->h.dwScale-1)/s->h.dwScale;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
403 vprp.dwHTotalInT = muxer->avih.dwWidth;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
404 vprp.dwVTotalInLines = muxer->avih.dwHeight;
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
405 vprp.dwFrameAspectRatio = aspect;
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
406 vprp.dwFrameWidthInPixels = muxer->avih.dwWidth;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
407 vprp.dwFrameHeightInLines = muxer->avih.dwHeight;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
408 vprp.nbFieldPerFrame = 1;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
409 vprp.FieldInfo[0].CompressedBMHeight = muxer->avih.dwHeight;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
410 vprp.FieldInfo[0].CompressedBMWidth = muxer->avih.dwWidth;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
411 vprp.FieldInfo[0].ValidBMHeight = muxer->avih.dwHeight;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
412 vprp.FieldInfo[0].ValidBMWidth = muxer->avih.dwWidth;
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
413 hdrsize+=8+4*(9+8*1); // vprp
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
414 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
415 break;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
416 case MUXER_TYPE_AUDIO:
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
417 hdrsize+=WFSIZE(s->wf)+8; // strf
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
418 s->h.fccHandler = s->wf->wFormatTag;
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
419 break;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
420 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
421
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
422 write_avi_list(f,listtypeSTREAMHEADER,hdrsize);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
423 le2me_AVIStreamHeader(&s->h);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
424 write_avi_chunk(f,ckidSTREAMHEADER,sizeof(s->h),&s->h); /* AVISTreamHeader */ // strh
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
425 le2me_AVIStreamHeader(&s->h);
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
426
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
427 switch(s->type){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
428 case MUXER_TYPE_VIDEO:
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
429 {
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
430 int biSize=s->bih->biSize;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
431 le2me_BITMAPINFOHEADER(s->bih);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
432 write_avi_chunk(f,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */
12053
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
433 le2me_BITMAPINFOHEADER(s->bih);
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
434
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 12053
diff changeset
435 if (aspect != 0) {
12053
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
436 int fields = vprp.nbFieldPerFrame;
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
437 le2me_VideoPropHeader(&vprp);
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
438 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]);
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
439 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]);
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
440 write_avi_chunk(f,mmioFOURCC('v','p','r','p'),
12053
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
441 sizeof(VideoPropHeader) -
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
442 sizeof(VIDEO_FIELD_DESC)*(2-fields),
cdf62dc6d6a0 Better vprp aspect fix
ranma
parents: 12051
diff changeset
443 &vprp); /* Video Properties Header */
12051
78884d076dd4 explicit option for AVI PRP header
henry
parents: 12037
diff changeset
444 }
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
445 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
446 break;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
447 case MUXER_TYPE_AUDIO:
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
448 {
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
449 int wfsize = WFSIZE(s->wf);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
450 le2me_WAVEFORMATEX(s->wf);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
451 write_avi_chunk(f,ckidSTREAMFORMAT,wfsize,s->wf); /* WAVEFORMATEX */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
452 le2me_WAVEFORMATEX(s->wf);
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
453 }
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
454 break;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
455 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
456 if (isodml && si && si->superidx && si->superidxsize) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
457 n = si->superidxsize;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
458
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
459 idxhdr[0] = le2me_32(mmioFOURCC('i', 'n', 'd', 'x'));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
460 idxhdr[1] = le2me_32(24 + 16*n);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
461 idxhdr[2] = le2me_32(0x00000004);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
462 idxhdr[3] = le2me_32(si->superidxpos);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
463 idxhdr[4] = le2me_32(s->ckid);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
464 idxhdr[5] = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
465 idxhdr[6] = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
466 idxhdr[7] = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
467
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
468 fwrite(idxhdr,sizeof(idxhdr),1,f);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
469 for (j=0; j<n; j++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
470 struct avi_odmlsuperidx_entry *entry = &si->superidx[j];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
471 unsigned int data[4];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
472 data[0] = le2me_32(entry->ofs);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
473 data[1] = le2me_32(entry->ofs >> 32);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
474 data[2] = le2me_32(entry->len);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
475 data[3] = le2me_32(entry->duration);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
476 fwrite(data,sizeof(data),1,f);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
477 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
478 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
479 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
480
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
481 // ODML
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
482 if (isodml) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
483 memset(dmlh, 0, sizeof(dmlh));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
484 dmlh[0] = le2me_32(muxer->avih.dwTotalFrames);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
485 write_avi_list(f,mmioFOURCC('o','d','m','l'),sizeof(dmlh)+8);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
486 write_avi_chunk(f,mmioFOURCC('d','m','l','h'),sizeof(dmlh),dmlh);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
487 }
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
488
7145
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
489 // ============= INFO ===============
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
490 // always include software info
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
491 info[0].id=mmioFOURCC('I','S','F','T'); // Software:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
492 info[0].text="MEncoder " VERSION;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
493 // include any optional strings
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
494 i=1;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
495 if(info_name!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
496 info[i].id=mmioFOURCC('I','N','A','M'); // Name:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
497 info[i++].text=info_name;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
498 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
499 if(info_artist!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
500 info[i].id=mmioFOURCC('I','A','R','T'); // Artist:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
501 info[i++].text=info_artist;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
502 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
503 if(info_genre!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
504 info[i].id=mmioFOURCC('I','G','N','R'); // Genre:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
505 info[i++].text=info_genre;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
506 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
507 if(info_subject!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
508 info[i].id=mmioFOURCC('I','S','B','J'); // Subject:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
509 info[i++].text=info_subject;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
510 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
511 if(info_copyright!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
512 info[i].id=mmioFOURCC('I','C','O','P'); // Copyright:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
513 info[i++].text=info_copyright;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
514 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
515 if(info_sourceform!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
516 info[i].id=mmioFOURCC('I','S','R','F'); // Source Form:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
517 info[i++].text=info_sourceform;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
518 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
519 if(info_comment!=NULL){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
520 info[i].id=mmioFOURCC('I','C','M','T'); // Comment:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
521 info[i++].text=info_comment;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
522 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
523 info[i].id=0;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
524
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
525 hdrsize=0;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
526 // calc info size:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
527 for(i=0;info[i].id!=0;i++) if(info[i].text){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
528 size_t sz=strlen(info[i].text)+1;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
529 hdrsize+=sz+8+sz%2;
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
530 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
531 // write infos:
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
532 if (hdrsize!=0){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
533 write_avi_list(f,mmioFOURCC('I','N','F','O'),hdrsize);
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
534 for(i=0;info[i].id!=0;i++) if(info[i].text){
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
535 write_avi_chunk(f,info[i].id,strlen(info[i].text)+1,info[i].text);
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
536 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
537 }
3854945aefbb new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents: 7144
diff changeset
538
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
539 // JUNK:
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
540 write_avi_chunk(f,ckidAVIPADDING,MOVIALIGN-(ftello(f)%MOVIALIGN)-8,NULL); /* junk */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
541 if (!isodml) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
542 // 'movi' header:
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
543 write_avi_list(f,listtypeAVIMOVIE,muxer->movi_end-ftello(f)-12);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
544 } else {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
545 if (ftello(f) != MOVIALIGN) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
546 mp_msg(MSGT_MUXER, MSGL_ERR, "Opendml superindex is too big for reserved space!\n");
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17065
diff changeset
547 mp_msg(MSGT_MUXER, MSGL_ERR, "Expected filepos %d, real filepos %ld, missing space %ld\n", MOVIALIGN, ftell(muxer->file), ftell(muxer->file)-MOVIALIGN);
12037
d2d18129f8e1 copy&paste 10l
ranma
parents: 12036
diff changeset
548 mp_msg(MSGT_MUXER, MSGL_ERR, "Try increasing MOVIALIGN in libmpdemux/muxer_avi.c\n");
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
549 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
550 write_avi_list(f,listtypeAVIMOVIE,muxer->movi_end-ftello(f)-12);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
551 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
552 muxer->movi_start=ftello(muxer->file);
12235
ca5dc9c2cb51 Get rid of the 'RIFF chunks have to be aligned on ODML_CHUNKLEN'
ranma
parents: 12062
diff changeset
553 if (muxer->file_end == 0) muxer->file_end = ftello(muxer->file);
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
554 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
555
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
556 static void avifile_odml_write_index(muxer_t *muxer){
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
557 muxer_stream_t* s;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
558 struct avi_stream_info *si;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
559 int i;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
560
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
561 for (i=0; i<muxer->avih.dwStreams; i++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
562 int j,k,n,idxpos,len,last,entries_per_subidx;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
563 unsigned int idxhdr[8];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
564 s = muxer->streams[i];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
565 si = s->priv;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
566
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
567 /*
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
568 * According to Avery Lee MSMP wants the subidx chunks to have the same size.
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
569 *
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
570 * So this code figures out how many entries we can put into
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
571 * an ix?? chunk, so that each ix?? chunk has the same size and the offsets
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
572 * don't overflow (Using ODML_CHUNKLEN for that is a bit more restrictive
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
573 * than it has to be though).
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
574 */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
575
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
576 len = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
577 n = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
578 entries_per_subidx = INT_MAX;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
579 do {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
580 off_t start = si->idx[0].ofs;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
581 last = entries_per_subidx;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
582 for (j=0; j<si->idxpos; j++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
583 len = si->idx[j].ofs - start;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
584 if(len >= ODML_CHUNKLEN || n >= entries_per_subidx) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
585 if (entries_per_subidx > n) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
586 entries_per_subidx = n;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
587 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
588 start = si->idx[j].ofs;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
589 len = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
590 n = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
591 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
592 n++;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
593 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
594 } while (last != entries_per_subidx);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
595
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
596 si->superidxpos = (si->idxpos+entries_per_subidx-1) / entries_per_subidx;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
597
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
598 mp_msg(MSGT_MUXER, MSGL_V, "ODML: Stream %d: Using %d entries per subidx, %d entries in superidx\n",
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
599 i, entries_per_subidx, si->superidxpos);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
600
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
601 si->superidxsize = si->superidxpos;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
602 si->superidx = malloc(sizeof(*si->superidx) * si->superidxsize);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
603 memset(si->superidx, 0, sizeof(*si->superidx) * si->superidxsize);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
604
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
605 idxpos = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
606 for (j=0; j<si->superidxpos; j++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
607 off_t start = si->idx[idxpos].ofs;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
608 int duration;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
609
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
610 duration = 0;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
611 for (k=0; k<entries_per_subidx && idxpos+k<si->idxpos; k++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
612 duration += s->h.dwSampleSize ? si->idx[idxpos+k].len/s->h.dwSampleSize : 1;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
613 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
614
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
615 idxhdr[0] = le2me_32((s->ckid << 16) | mmioFOURCC('i', 'x', 0, 0));
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
616 idxhdr[1] = le2me_32(24 + 8*k);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
617 idxhdr[2] = le2me_32(0x01000002);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
618 idxhdr[3] = le2me_32(k);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
619 idxhdr[4] = le2me_32(s->ckid);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
620 idxhdr[5] = le2me_32(start + 8);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
621 idxhdr[6] = le2me_32((start + 8)>> 32);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
622 idxhdr[7] = 0; /* unused */
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
623
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
624 si->superidx[j].len = 32 + 8*k;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
625 si->superidx[j].ofs = ftello(muxer->file);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
626 si->superidx[j].duration = duration;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
627
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
628 fwrite(idxhdr,sizeof(idxhdr),1,muxer->file);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
629 for (k=0; k<entries_per_subidx && idxpos<si->idxpos; k++) {
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
630 unsigned int entry[2];
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
631 entry[0] = le2me_32(si->idx[idxpos].ofs - start);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
632 entry[1] = le2me_32(si->idx[idxpos].len | si->idx[idxpos].flags);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
633 idxpos++;
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
634 fwrite(entry,sizeof(entry),1,muxer->file);
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
635 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
636 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
637 }
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
638 muxer->file_end=ftello(muxer->file);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
639 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
640
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
641 static void avifile_write_standard_index(muxer_t *muxer){
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
642
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
643 muxer->movi_end=ftello(muxer->file);
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
644 if(muxer->idx && muxer->idx_pos>0){
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
645 int i;
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
646 // fixup index entries:
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
647 // for(i=0;i<muxer->idx_pos;i++) muxer->idx[i].dwChunkOffset-=muxer->movi_start-4;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
648 // write index chunk:
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
649 for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i]));
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8591
diff changeset
650 write_avi_chunk(muxer->file,ckidAVINEWINDEX,16*muxer->idx_pos,muxer->idx); /* AVIINDEXENTRY */
6918
62ac2cac100d PPC endianess fix by Colin Leroy <colin@colino.net>
arpi
parents: 5572
diff changeset
651 for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i]));
2529
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
652 muxer->avih.dwFlags|=AVIF_HASINDEX;
266dab71162b AVI muxer rewritten
arpi
parents: 2310
diff changeset
653 }
12036
846ed866f86c OpenDML read/write support
ranma
parents: 11863
diff changeset
654 muxer->file_end=ftello(muxer->file);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
655 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
656
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
657 static void avifile_write_index(muxer_t *muxer){
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
658 struct avi_stream_info *vsi = muxer->def_v->priv;
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
659
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
660 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingTrailer);
12363
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
661 if (vsi->riffofspos > 0){
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
662 avifile_odml_write_index(muxer);
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
663 } else {
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
664 avifile_write_standard_index(muxer);
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
665 }
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
666 }
5dac21977312 Allow user to disable writing of ODML index
ranma
parents: 12341
diff changeset
667
17659
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
668 static void avifile_fix_parameters(muxer_stream_t *s){
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
669 /* adjust audio_delay_fix according to individual stream delay */
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
670 if (s->type == MUXER_TYPE_AUDIO)
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
671 s->muxer->audio_delay_fix -= (float)s->decoder_delay * s->h.dwScale/s->h.dwRate;
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
672 if (s->type == MUXER_TYPE_VIDEO)
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
673 s->muxer->audio_delay_fix += (float)s->decoder_delay * s->h.dwScale/s->h.dwRate;
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
674 }
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
675
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 13250
diff changeset
676 int muxer_init_muxer_avi(muxer_t *muxer){
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
677 muxer->cont_new_stream = &avifile_new_stream;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
678 muxer->cont_write_chunk = &avifile_write_chunk;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
679 muxer->cont_write_header = &avifile_write_header;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
680 muxer->cont_write_index = &avifile_write_index;
17659
92ac78a93625 Fix video delay when encoding with B-frames.
corey
parents: 17648
diff changeset
681 muxer->fix_stream_parameters = &avifile_fix_parameters;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 13250
diff changeset
682 return 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8074
diff changeset
683 }