annotate libmpdemux/muxer_avi.c @ 34809:ea97bcb28df1

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