annotate avienc.c @ 1206:e60bf67d9bf8 libavformat

The reader ignores the size of the ASF data object and keeps on reading even beyond it. Therefore if the ASF file includes an index object at its end, the reader will treat the index like data, but of course will fail since it thinks that the data is corrupted. When reading an asf file with an index object, ffmpeg will complain at the end of the file that it read an invalid header. Patch by Kohn Emil Dan, < emild A cs P technion P ac P il > Original thead: Date: Apr 18, 2006 4:11 PM Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author gpoirier
date Sat, 29 Jul 2006 16:07:19 +0000
parents 6a5e58d2114b
children 2cddf00f92a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * AVI encoder.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 894
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 #include "avi.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1169
diff changeset
21 #include "riff.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 /*
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
24 * TODO:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 * - fill all fields if non streamed (nb_frames for example)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
28 #ifdef CONFIG_AVI_MUXER
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
29 typedef struct AVIIentry {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
30 unsigned int flags, pos, len;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
31 } AVIIentry;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
32
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
33 #define AVI_INDEX_CLUSTER_SIZE 16384
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
34
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 typedef struct AVIIndex {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
36 offset_t indx_start;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
37 int entry;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
38 int ents_allocated;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
39 AVIIentry** cluster;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 } AVIIndex;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 typedef struct {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
43 offset_t riff_start, movi_list, odml_list;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
44 offset_t frames_hdr_all, frames_hdr_strm[MAX_STREAMS];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 int audio_strm_length[MAX_STREAMS];
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
46 int riff_id;
479
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
47 int packet_count[MAX_STREAMS];
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
48
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
49 AVIIndex indexes[MAX_STREAMS];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 } AVIContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
52 static inline AVIIentry* avi_get_ientry(AVIIndex* idx, int ent_id)
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
53 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
54 int cl = ent_id / AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
55 int id = ent_id % AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
56 return &idx->cluster[cl][id];
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
57 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
58
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
59 static offset_t avi_start_new_riff(AVIContext *avi, ByteIOContext *pb,
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
60 const char* riff_tag, const char* list_tag)
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
61 {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
62 offset_t loff;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
63 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
64
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
65 avi->riff_id++;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
66 for (i=0; i<MAX_STREAMS; i++)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
67 avi->indexes[i].entry = 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
68
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
69 avi->riff_start = start_tag(pb, "RIFF");
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
70 put_tag(pb, riff_tag);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
71 loff = start_tag(pb, "LIST");
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
72 put_tag(pb, list_tag);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
73 return loff;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
74 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
75
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
76 static unsigned char* avi_stream2fourcc(unsigned char* tag, int index,
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
77 enum CodecType type)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
78 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
79 tag[0] = '0';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
80 tag[1] = '0' + index;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
81 if (type == CODEC_TYPE_VIDEO) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
82 tag[2] = 'd';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
83 tag[3] = 'c';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
84 } else {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
85 tag[2] = 'w';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
86 tag[3] = 'b';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
87 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
88 tag[4] = '\0';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
89 return tag;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
90 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
91
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 static int avi_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 int bitrate, n, i, nb_frames, au_byterate, au_ssize, au_scale;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 AVCodecContext *stream, *video_enc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 offset_t list1, list2, strh, strf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 /* header list */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
101 avi->riff_id = 0;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
102 list1 = avi_start_new_riff(avi, pb, "AVI ", "hdrl");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 /* avi header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 put_tag(pb, "avih");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 put_le32(pb, 14 * 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 bitrate = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 video_enc = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 for(n=0;n<s->nb_streams;n++) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 796
diff changeset
111 stream = s->streams[n]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 bitrate += stream->bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 if (stream->codec_type == CODEC_TYPE_VIDEO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 video_enc = stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
116
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 nb_frames = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
119 if(video_enc){
743
af4e24d6310c switch to native time bases
michael
parents: 733
diff changeset
120 put_le32(pb, (uint32_t)(int64_t_C(1000000) * video_enc->time_base.num / video_enc->time_base.den));
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
121 } else {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
122 put_le32(pb, 0);
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
123 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 put_le32(pb, bitrate / 8); /* XXX: not quite exact */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 put_le32(pb, 0); /* padding */
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
126 if (url_is_streamed(pb))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
127 put_le32(pb, AVIF_TRUSTCKTYPE | AVIF_ISINTERLEAVED); /* flags */
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
128 else
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
129 put_le32(pb, AVIF_TRUSTCKTYPE | AVIF_HASINDEX | AVIF_ISINTERLEAVED); /* flags */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 avi->frames_hdr_all = url_ftell(pb); /* remember this offset to fill later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 put_le32(pb, nb_frames); /* nb frames, filled later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 put_le32(pb, 0); /* initial frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 put_le32(pb, s->nb_streams); /* nb streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 put_le32(pb, 1024 * 1024); /* suggested buffer size */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
135 if(video_enc){
992
d54472fc2d04 indention
michael
parents: 978
diff changeset
136 put_le32(pb, video_enc->width);
d54472fc2d04 indention
michael
parents: 978
diff changeset
137 put_le32(pb, video_enc->height);
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
138 } else {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
139 put_le32(pb, 0);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
140 put_le32(pb, 0);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
141 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 put_le32(pb, 0); /* reserved */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
146
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 /* stream list */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 for(i=0;i<n;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 list2 = start_tag(pb, "LIST");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 put_tag(pb, "strl");
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
151
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 796
diff changeset
152 stream = s->streams[i]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153
89
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
154 /* FourCC should really be set by the codec itself */
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
155 if (! stream->codec_tag) {
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
156 stream->codec_tag = codec_get_bmp_tag(stream->codec_id);
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
157 }
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
158
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 /* stream generic header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 strh = start_tag(pb, "strh");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 switch(stream->codec_type) {
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
162 case CODEC_TYPE_VIDEO: put_tag(pb, "vids"); break;
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
163 case CODEC_TYPE_AUDIO: put_tag(pb, "auds"); break;
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
164 // case CODEC_TYPE_TEXT : put_tag(pb, "txts"); break;
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
165 case CODEC_TYPE_DATA : put_tag(pb, "dats"); break;
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
166 }
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
167 if(stream->codec_type == CODEC_TYPE_VIDEO)
89
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
168 put_le32(pb, stream->codec_tag);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
169 else
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
170 put_le32(pb, 1);
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
171 put_le32(pb, 0); /* flags */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
172 put_le16(pb, 0); /* priority */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
173 put_le16(pb, 0); /* language */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
174 put_le32(pb, 0); /* initial frame */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
175
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
176 ff_parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 65
diff changeset
177
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
178 put_le32(pb, au_scale); /* scale */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
179 put_le32(pb, au_byterate); /* rate */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
180 av_set_pts_info(s->streams[i], 64, au_scale, au_byterate);
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
181
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
182 put_le32(pb, 0); /* start */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
183 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
184 if (url_is_streamed(pb))
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
185 put_le32(pb, AVI_MAX_RIFF_SIZE); /* FIXME: this may be broken, but who cares */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
186 else
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
187 put_le32(pb, 0); /* length, XXX: filled later */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
188
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
189 /* suggested buffer size */ //FIXME set at the end to largest chunk
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
190 if(stream->codec_type == CODEC_TYPE_VIDEO)
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
191 put_le32(pb, 1024 * 1024);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
192 else if(stream->codec_type == CODEC_TYPE_AUDIO)
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
193 put_le32(pb, 12 * 1024);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
194 else
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
195 put_le32(pb, 0);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
196 put_le32(pb, -1); /* quality */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
197 put_le32(pb, au_ssize); /* sample size */
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
198 put_le32(pb, 0);
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
199 put_le16(pb, stream->width);
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
200 put_le16(pb, stream->height);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 end_tag(pb, strh);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
203 if(stream->codec_type != CODEC_TYPE_DATA){
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 strf = start_tag(pb, "strf");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 switch(stream->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 case CODEC_TYPE_VIDEO:
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
207 put_bmp_header(pb, stream, codec_bmp_tags, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 if (put_wav_header(pb, stream) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 av_free(avi);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 default:
537
558a093b04db do not call (av_)abort()
michael
parents: 521
diff changeset
216 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 end_tag(pb, strf);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
219 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
220
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
221 if (!url_is_streamed(pb)) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
222 unsigned char tag[5];
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
223 int j;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
224
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
225 /* Starting to lay out AVI OpenDML master index.
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
226 * We want to make it JUNK entry for now, since we'd
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
227 * like to get away without making AVI an OpenDML one
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
228 * for compatibility reasons.
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
229 */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
230 avi->indexes[i].entry = avi->indexes[i].ents_allocated = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
231 avi->indexes[i].indx_start = start_tag(pb, "JUNK");
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
232 put_le16(pb, 4); /* wLongsPerEntry */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
233 put_byte(pb, 0); /* bIndexSubType (0 == frame index) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
234 put_byte(pb, 0); /* bIndexType (0 == AVI_INDEX_OF_INDEXES) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
235 put_le32(pb, 0); /* nEntriesInUse (will fill out later on) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
236 put_tag(pb, avi_stream2fourcc(&tag[0], i, stream->codec_type));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
237 /* dwChunkId */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
238 put_le64(pb, 0); /* dwReserved[3]
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
239 put_le32(pb, 0); Must be 0. */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
240 for (j=0; j < AVI_MASTER_INDEX_SIZE * 2; j++)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
241 put_le64(pb, 0);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
242 end_tag(pb, avi->indexes[i].indx_start);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
243 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
244
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 end_tag(pb, list2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
247
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
248 if (!url_is_streamed(pb)) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
249 /* AVI could become an OpenDML one, if it grows beyond 2Gb range */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
250 avi->odml_list = start_tag(pb, "JUNK");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
251 put_tag(pb, "odml");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
252 put_tag(pb, "dmlh");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
253 put_le32(pb, 248);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
254 for (i = 0; i < 248; i+= 4)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
255 put_le32(pb, 0);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
256 end_tag(pb, avi->odml_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
257 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 end_tag(pb, list1);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
260
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 avi->movi_list = start_tag(pb, "LIST");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 put_tag(pb, "movi");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
269 static int avi_write_ix(AVFormatContext *s)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
270 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
271 ByteIOContext *pb = &s->pb;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
272 AVIContext *avi = s->priv_data;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
273 unsigned char tag[5];
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
274 unsigned char ix_tag[] = "ix00";
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
275 int i, j;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
276
976
c4a67d8fa68f replace if by assert as it should never by true
michael
parents: 969
diff changeset
277 assert(!url_is_streamed(pb));
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
278
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
279 if (avi->riff_id > AVI_MASTER_INDEX_SIZE)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
280 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
281
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
282 for (i=0;i<s->nb_streams;i++) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
283 offset_t ix, pos;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
284
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
285 avi_stream2fourcc(&tag[0], i, s->streams[i]->codec->codec_type);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
286 ix_tag[3] = '0' + i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
287
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
288 /* Writing AVI OpenDML leaf index chunk */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
289 ix = url_ftell(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
290 put_tag(pb, &ix_tag[0]); /* ix?? */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
291 put_le32(pb, avi->indexes[i].entry * 8 + 24);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
292 /* chunk size */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
293 put_le16(pb, 2); /* wLongsPerEntry */
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
294 put_byte(pb, 0); /* bIndexSubType (0 == frame index) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
295 put_byte(pb, 1); /* bIndexType (1 == AVI_INDEX_OF_CHUNKS) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
296 put_le32(pb, avi->indexes[i].entry);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
297 /* nEntriesInUse */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
298 put_tag(pb, &tag[0]); /* dwChunkId */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
299 put_le64(pb, avi->movi_list);/* qwBaseOffset */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
300 put_le32(pb, 0); /* dwReserved_3 (must be 0) */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
301
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
302 for (j=0; j<avi->indexes[i].entry; j++) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
303 AVIIentry* ie = avi_get_ientry(&avi->indexes[i], j);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
304 put_le32(pb, ie->pos + 8);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
305 put_le32(pb, ((uint32_t)ie->len & ~0x80000000) |
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
306 (ie->flags & 0x10 ? 0 : 0x80000000));
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
307 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
308 put_flush_packet(pb);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
309 pos = url_ftell(pb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
310
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
311 /* Updating one entry in the AVI OpenDML master index */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
312 url_fseek(pb, avi->indexes[i].indx_start - 8, SEEK_SET);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
313 put_tag(pb, "indx"); /* enabling this entry */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
314 url_fskip(pb, 8);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
315 put_le32(pb, avi->riff_id); /* nEntriesInUse */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
316 url_fskip(pb, 16*avi->riff_id);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
317 put_le64(pb, ix); /* qwOffset */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
318 put_le32(pb, pos - ix); /* dwSize */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
319 put_le32(pb, avi->indexes[i].entry); /* dwDuration */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
320
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
321 url_fseek(pb, pos, SEEK_SET);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
322 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
323 return 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
324 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
325
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
326 static int avi_write_idx1(AVFormatContext *s)
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
327 {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
328 ByteIOContext *pb = &s->pb;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
329 AVIContext *avi = s->priv_data;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
330 offset_t file_size, idx_chunk;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
331 int i, n, nb_frames, au_byterate, au_ssize, au_scale;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
332 AVCodecContext *stream;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
333 unsigned char tag[5];
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
334
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
335 if (!url_is_streamed(pb)) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
336 AVIIentry* ie = 0, *tie;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
337 int entry[MAX_STREAMS];
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
338 int empty, stream_id = -1;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
339
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
340 idx_chunk = start_tag(pb, "idx1");
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
341 memset(&entry[0], 0, sizeof(entry));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
342 do {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
343 empty = 1;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
344 for (i=0; i<s->nb_streams; i++) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
345 if (avi->indexes[i].entry <= entry[i])
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
346 continue;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
347
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
348 tie = avi_get_ientry(&avi->indexes[i], entry[i]);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
349 if (empty || tie->pos < ie->pos) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
350 ie = tie;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
351 stream_id = i;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
352 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
353 empty = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
354 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
355 if (!empty) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
356 avi_stream2fourcc(&tag[0], stream_id,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
357 s->streams[stream_id]->codec->codec_type);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
358 put_tag(pb, &tag[0]);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
359 put_le32(pb, ie->flags);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
360 put_le32(pb, ie->pos);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
361 put_le32(pb, ie->len);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
362 entry[stream_id]++;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
363 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
364 } while (!empty);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
365 end_tag(pb, idx_chunk);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
366
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
367 /* Fill in frame/sample counters */
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
368 file_size = url_ftell(pb);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
369 nb_frames = 0;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
370 for(n=0;n<s->nb_streams;n++) {
993
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
371 assert(avi->frames_hdr_strm[n]);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 796
diff changeset
372 stream = s->streams[n]->codec;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
373 url_fseek(pb, avi->frames_hdr_strm[n], SEEK_SET);
781
ba478112ecb1 a step toward CODEC_TYPE_DATA support
michael
parents: 763
diff changeset
374 ff_parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
577
f8edb92d97b6 cbr audio muxing fix
michael
parents: 575
diff changeset
375 if (au_ssize == 0) {
914
ef25e246c7f2 avoid using non constant fields of AVCodecContext in avi muxer
michael
parents: 896
diff changeset
376 put_le32(pb, avi->packet_count[n]);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
377 } else {
577
f8edb92d97b6 cbr audio muxing fix
michael
parents: 575
diff changeset
378 put_le32(pb, avi->audio_strm_length[n] / au_ssize);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
379 }
993
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
380 if(stream->codec_type == CODEC_TYPE_VIDEO)
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
381 nb_frames = FFMAX(nb_frames, avi->packet_count[n]);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
382 }
993
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
383 assert(avi->frames_hdr_all);
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
384 url_fseek(pb, avi->frames_hdr_all, SEEK_SET);
3c027a642915 fixing total_frames
michael
parents: 992
diff changeset
385 put_le32(pb, nb_frames);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
386 url_fseek(pb, file_size, SEEK_SET);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
387 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
388 return 0;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
389 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
390
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
391 static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 unsigned char tag[5];
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
396 unsigned int flags=0;
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
397 const int stream_index= pkt->stream_index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 796
diff changeset
398 AVCodecContext *enc= s->streams[stream_index]->codec;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
399 int size= pkt->size;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
400
479
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
401 // av_log(s, AV_LOG_DEBUG, "%lld %d %d\n", pkt->dts, avi->packet_count[stream_index], stream_index);
724
43e5b8eea963 fix vorbis in avi
michael
parents: 720
diff changeset
402 while(enc->block_align==0 && pkt->dts != AV_NOPTS_VALUE && pkt->dts > avi->packet_count[stream_index]){
479
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
403 AVPacket empty_packet;
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
404
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
405 av_init_packet(&empty_packet);
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
406 empty_packet.size= 0;
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
407 empty_packet.data= NULL;
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
408 empty_packet.stream_index= stream_index;
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
409 avi_write_packet(s, &empty_packet);
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
410 // av_log(s, AV_LOG_DEBUG, "dup %lld %d\n", pkt->dts, avi->packet_count[stream_index]);
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
411 }
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
412 avi->packet_count[stream_index]++;
d84d9d8bb0a4 pass timestamps correctly for -sync 0
michael
parents: 476
diff changeset
413
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
414 // Make sure to put an OpenDML chunk when the file size exceeds the limits
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
415 if (!url_is_streamed(pb) &&
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
416 (url_ftell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
417
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
418 avi_write_ix(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
419 end_tag(pb, avi->movi_list);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
420
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
421 if (avi->riff_id == 1)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
422 avi_write_idx1(s);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
423
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
424 end_tag(pb, avi->riff_start);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
425 avi->movi_list = avi_start_new_riff(avi, pb, "AVIX", "movi");
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
426 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
427
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
428 avi_stream2fourcc(&tag[0], stream_index, enc->codec_type);
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
429 if(pkt->flags&PKT_FLAG_KEY)
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
430 flags = 0x10;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
431 if (enc->codec_type == CODEC_TYPE_AUDIO) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 avi->audio_strm_length[stream_index] += size;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
433 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 if (!url_is_streamed(&s->pb)) {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
436 AVIIndex* idx = &avi->indexes[stream_index];
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
437 int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
438 int id = idx->entry % AVI_INDEX_CLUSTER_SIZE;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
439 if (idx->ents_allocated <= idx->entry) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
440 idx->cluster = av_realloc(idx->cluster, (cl+1)*sizeof(void*));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
441 if (!idx->cluster)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
442 return -1;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
443 idx->cluster[cl] = av_malloc(AVI_INDEX_CLUSTER_SIZE*sizeof(AVIIentry));
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
444 if (!idx->cluster[cl])
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
445 return -1;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
446 idx->ents_allocated += AVI_INDEX_CLUSTER_SIZE;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
447 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
448
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
449 idx->cluster[cl][id].flags = flags;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
450 idx->cluster[cl][id].pos = url_ftell(pb) - avi->movi_list;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
451 idx->cluster[cl][id].len = size;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
452 idx->entry++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
454
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 put_buffer(pb, tag, 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 put_le32(pb, size);
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 458
diff changeset
457 put_buffer(pb, pkt->data, size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 if (size & 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 put_byte(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 static int avi_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
467 AVIContext *avi = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 ByteIOContext *pb = &s->pb;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
469 int res = 0;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
470 int i, j, n, nb_frames;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
471 offset_t file_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
473 if (!url_is_streamed(pb))
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
474 {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
475 if (avi->riff_id == 1) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
476 end_tag(pb, avi->movi_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
477 res = avi_write_idx1(s);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
478 end_tag(pb, avi->riff_start);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
479 } else {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
480 avi_write_ix(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
481 end_tag(pb, avi->movi_list);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
482 end_tag(pb, avi->riff_start);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
483
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 file_size = url_ftell(pb);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
485 url_fseek(pb, avi->odml_list - 8, SEEK_SET);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
486 put_tag(pb, "LIST"); /* Making this AVI OpenDML one */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
487 url_fskip(pb, 16);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
488
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
489 for (n=nb_frames=0;n<s->nb_streams;n++) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 796
diff changeset
490 AVCodecContext *stream = s->streams[n]->codec;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
491 if (stream->codec_type == CODEC_TYPE_VIDEO) {
914
ef25e246c7f2 avoid using non constant fields of AVCodecContext in avi muxer
michael
parents: 896
diff changeset
492 if (nb_frames < avi->packet_count[n])
ef25e246c7f2 avoid using non constant fields of AVCodecContext in avi muxer
michael
parents: 896
diff changeset
493 nb_frames = avi->packet_count[n];
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
494 } else {
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 227
diff changeset
495 if (stream->codec_id == CODEC_ID_MP2 || stream->codec_id == CODEC_ID_MP3) {
914
ef25e246c7f2 avoid using non constant fields of AVCodecContext in avi muxer
michael
parents: 896
diff changeset
496 nb_frames += avi->packet_count[n];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
498 }
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
499 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
500 put_le32(pb, nb_frames);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
501 url_fseek(pb, file_size, SEEK_SET);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
502 }
873
7af647503b67 Support for streaming: dont write indexes and dont signal HAS_INDEX in header. Also set filesize to max in this case.
alex
parents: 863
diff changeset
503 }
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
504 put_flush_packet(pb);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
505
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
506 for (i=0; i<MAX_STREAMS; i++) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
507 for (j=0; j<avi->indexes[i].ents_allocated/AVI_INDEX_CLUSTER_SIZE; j++)
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
508 av_free(avi->indexes[i].cluster[j]);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
509 av_free(avi->indexes[i].cluster);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
510 avi->indexes[i].cluster = NULL;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
511 avi->indexes[i].ents_allocated = avi->indexes[i].entry = 0;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
512 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 876
diff changeset
513
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
514 return res;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
515 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
517 AVOutputFormat avi_muxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519 "avi format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520 "video/x-msvideo",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
521 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
522 sizeof(AVIContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523 CODEC_ID_MP2,
106
4da5d55b3690 we really shouldnt use M$* as default codec -> use MPEG4 as default
michaelni
parents: 105
diff changeset
524 CODEC_ID_MPEG4,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
525 avi_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
526 avi_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
527 avi_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
528 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
529 #endif //CONFIG_AVI_MUXER