annotate avienc.c @ 318:54e915169d48 libavformat

Add more resilience in reading ffm files. In particular, don't assume that the write pointer is correct. This can happen in certain failure modes.
author philipjsg
date Wed, 19 Nov 2003 02:34:40 +0000
parents a313e1080322
children e14ebc79e4bf
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 * TODO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 * - fill all fields if non streamed (nb_frames for example)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 266
diff changeset
27 #ifdef CONFIG_ENCODERS
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
28 typedef struct AVIIentry {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
29 unsigned int flags, pos, len;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
30 } AVIIentry;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
31
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
32 #define AVI_INDEX_CLUSTER_SIZE 16384
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
33
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 typedef struct AVIIndex {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
35 offset_t indx_start;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
36 int entry;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
37 int ents_allocated;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
38 AVIIentry** cluster;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 } AVIIndex;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 typedef struct {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
42 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
43 offset_t frames_hdr_all, frames_hdr_strm[MAX_STREAMS];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 int audio_strm_length[MAX_STREAMS];
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
45 int riff_id;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
46
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
47 AVIIndex indexes[MAX_STREAMS];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 } AVIContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
50 static inline AVIIentry* avi_get_ientry(AVIIndex* idx, int ent_id)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
51 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
52 int cl = ent_id / AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
53 int id = ent_id % AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
54 return &idx->cluster[cl][id];
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
55 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
56
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 offset_t start_tag(ByteIOContext *pb, const char *tag)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 put_tag(pb, tag);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 return url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 void end_tag(ByteIOContext *pb, offset_t start)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 offset_t pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 pos = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 url_fseek(pb, start - 4, SEEK_SET);
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 61
diff changeset
70 put_le32(pb, (uint32_t)(pos - start));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 url_fseek(pb, pos, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 }
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 266
diff changeset
73 #endif //CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 /* Note: when encoding, the first matching tag is used, so order is
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 important if multiple tags possible for a given codec. */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 const CodecTag codec_bmp_tags[] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 { CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 { CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 { CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
81
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
82 /* added based on MPlayer */
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
83 { CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
84 { CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
85
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X'), .invalid_asf = 1 },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 { CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0'), .invalid_asf = 1 },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D'), .invalid_asf = 1 },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 { CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 { CODEC_ID_MPEG4, MKTAG(0x04, 0, 0, 0) }, /* some broken avi use this */
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
92
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
93 /* added based on MPlayer */
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
94 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
95 { CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
96 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
97 { CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
98
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3'), .invalid_asf = 1 }, /* default signature when using MSMPEG4 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
101
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
102 /* added based on MPlayer */
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
103 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
104 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
105 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
106 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
107 { CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
108 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
109 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
110
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 { CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
112
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
113 /* added based on MPlayer */
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
114 { CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
115
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
117
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 { CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
90
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
119
27d6df9208d4 merging a small amount of the changes from BroadQ, the rest is either not clean / doesnt apply / or is PS2 specific (someone with a PS2 should merge/send a patch for the later)
michaelni
parents: 89
diff changeset
120 /* added based on MPlayer */
77
f416fa1f5f1c wmv2 & huffyuv regression test
michaelni
parents: 76
diff changeset
121 { CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
124 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
125 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
183
b3b056122bd8 ATI VCR2
michaelni
parents: 181
diff changeset
129 { CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
158
700b69d00b27 lossless jpeg support
al3x
parents: 150
diff changeset
131 { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
169
michaelni
parents: 158
diff changeset
132 { CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
158
700b69d00b27 lossless jpeg support
al3x
parents: 150
diff changeset
133 { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
15
4d872c573360 huffyuv 4cc & -strict
michaelni
parents: 7
diff changeset
134 { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
61
2aa6e12c82fc hook this up to the CYUV decoder
tmmm
parents: 36
diff changeset
135 { CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
89
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
136 { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
94
79b7d70d6c37 I420 patch by (Sebastien Bechet <s dot bechet at av7 dot net>)
michaelni
parents: 90
diff changeset
137 { CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
105
d7ab50ab9376 native Indeo3 decoder implementation
tmmm
parents: 104
diff changeset
138 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
d7ab50ab9376 native Indeo3 decoder implementation
tmmm
parents: 104
diff changeset
139 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
124
a1ad0f8b75bf first pass at a new VP3 video decoder
tmmm
parents: 123
diff changeset
140 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
142
720bab5adc70 asv1 regression test
michaelni
parents: 128
diff changeset
141 { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
208
8dd53565cd50 asv2 regression test
michaelni
parents: 183
diff changeset
142 { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
181
20cd73ef6ead ATI VCR1 decoder
michaelni
parents: 169
diff changeset
143 { CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
150
michaelni
parents: 142
diff changeset
144 { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
227
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 219
diff changeset
145 { CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
266
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
146 { CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
147 { CODEC_ID_MSRLE, MKTAG(0x1, 0x0, 0x0, 0x0) },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
148 { CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
149 { CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
150 { CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
151 { CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
152 { CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
153 { CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 264
diff changeset
154 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 { 0, 0 },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 unsigned int codec_get_tag(const CodecTag *tags, int id)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 while (tags->id != 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 if (tags->id == id)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 return tags->tag;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 tags++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 static unsigned int codec_get_asf_tag(const CodecTag *tags, int id)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 while (tags->id != 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 if (!tags->invalid_asf && tags->id == id)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 return tags->tag;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 tags++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177
120
c720ddf380df * more strict types
kabi
parents: 119
diff changeset
178 enum CodecID codec_get_id(const CodecTag *tags, unsigned int tag)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 while (tags->id != 0) {
214
6e732ea5ea09 case insensitive codec_get_id()
michaelni
parents: 208
diff changeset
181 if( toupper((tag >> 0)&0xFF) == toupper((tags->tag >> 0)&0xFF)
6e732ea5ea09 case insensitive codec_get_id()
michaelni
parents: 208
diff changeset
182 && toupper((tag >> 8)&0xFF) == toupper((tags->tag >> 8)&0xFF)
6e732ea5ea09 case insensitive codec_get_id()
michaelni
parents: 208
diff changeset
183 && toupper((tag >>16)&0xFF) == toupper((tags->tag >>16)&0xFF)
6e732ea5ea09 case insensitive codec_get_id()
michaelni
parents: 208
diff changeset
184 && toupper((tag >>24)&0xFF) == toupper((tags->tag >>24)&0xFF))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 return tags->id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 tags++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 }
120
c720ddf380df * more strict types
kabi
parents: 119
diff changeset
188 return CODEC_ID_NONE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 unsigned int codec_get_bmp_tag(int id)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 return codec_get_tag(codec_bmp_tags, id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
196 unsigned int codec_get_wav_tag(int id)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
197 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
198 return codec_get_tag(codec_wav_tags, id);
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
199 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
200
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
201 enum CodecID codec_get_bmp_id(unsigned int tag)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
202 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
203 return codec_get_id(codec_bmp_tags, tag);
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
204 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
205
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
206 enum CodecID codec_get_wav_id(unsigned int tag)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
207 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
208 return codec_get_id(codec_wav_tags, tag);
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
209 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents: 214
diff changeset
210
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 266
diff changeset
211 #ifdef CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 /* BITMAPINFOHEADER header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 void put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, const CodecTag *tags, int for_asf)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 {
76
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
215 put_le32(pb, 40 + enc->extradata_size); /* size */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 put_le32(pb, enc->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 put_le32(pb, enc->height);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 put_le16(pb, 1); /* planes */
76
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
219
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
220 put_le16(pb, enc->bits_per_sample ? enc->bits_per_sample : 24); /* depth */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 /* compression type */
128
45633cd5518a * introducing new public interface in imgconvert.c
romansh
parents: 124
diff changeset
222 put_le32(pb, for_asf ? codec_get_asf_tag(tags, enc->codec_id) : enc->codec_tag);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 put_le32(pb, enc->width * enc->height * 3);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 put_le32(pb, 0);
76
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
228
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
229 put_buffer(pb, enc->extradata, enc->extradata_size);
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
230
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
231 if (enc->extradata_size & 1)
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
232 put_byte(pb, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 static void parse_specific_params(AVCodecContext *stream, int *au_byterate, int *au_ssize, int *au_scale)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 switch(stream->codec_id) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 case CODEC_ID_PCM_S16LE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 *au_scale = *au_ssize = 2*stream->channels;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 *au_byterate = *au_ssize * stream->sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 case CODEC_ID_PCM_U8:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 case CODEC_ID_PCM_ALAW:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 case CODEC_ID_PCM_MULAW:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 *au_scale = *au_ssize = stream->channels;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 *au_byterate = *au_ssize * stream->sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 case CODEC_ID_MP2:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 *au_ssize = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 *au_scale = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 *au_byterate = stream->bit_rate / 8;
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 227
diff changeset
252 case CODEC_ID_MP3:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 *au_ssize = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 *au_scale = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 *au_byterate = stream->bit_rate / 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 *au_ssize = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 *au_scale = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 *au_byterate = stream->bit_rate / 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
264 static offset_t avi_start_new_riff(AVIContext *avi, ByteIOContext *pb,
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
265 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
266 {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
267 offset_t loff;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
268 int i;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
269
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
270 avi->riff_id++;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
271 for (i=0; i<MAX_STREAMS; i++)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
272 avi->indexes[i].entry = 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
273
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
274 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
275 put_tag(pb, riff_tag);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
276 loff = start_tag(pb, "LIST");
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
277 put_tag(pb, list_tag);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
278 return loff;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
279 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
280
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
281 static unsigned char* avi_stream2fourcc(unsigned char* tag, int index,
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
282 enum CodecType type)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
283 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
284 tag[0] = '0';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
285 tag[1] = '0' + index;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
286 if (type == CODEC_TYPE_VIDEO) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
287 tag[2] = 'd';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
288 tag[3] = 'c';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
289 } else {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
290 tag[2] = 'w';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
291 tag[3] = 'b';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
292 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
293 tag[4] = '\0';
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
294 return tag;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
295 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
296
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 static int avi_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 int bitrate, n, i, nb_frames, au_byterate, au_ssize, au_scale;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 AVCodecContext *stream, *video_enc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 offset_t list1, list2, strh, strf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 /* header list */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
306 avi->riff_id = 0;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
307 list1 = avi_start_new_riff(avi, pb, "AVI ", "hdrl");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 /* avi header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 put_tag(pb, "avih");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 put_le32(pb, 14 * 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 bitrate = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 video_enc = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 for(n=0;n<s->nb_streams;n++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 stream = &s->streams[n]->codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 bitrate += stream->bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 if (stream->codec_type == CODEC_TYPE_VIDEO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 video_enc = stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 nb_frames = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
324 if(video_enc){
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 77
diff changeset
325 put_le32(pb, (uint32_t)(int64_t_C(1000000) * video_enc->frame_rate_base / video_enc->frame_rate));
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
326 } else {
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
327 put_le32(pb, 0);
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
328 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 put_le32(pb, bitrate / 8); /* XXX: not quite exact */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 put_le32(pb, 0); /* padding */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 put_le32(pb, AVIF_TRUSTCKTYPE | AVIF_HASINDEX | AVIF_ISINTERLEAVED); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 avi->frames_hdr_all = url_ftell(pb); /* remember this offset to fill later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 put_le32(pb, nb_frames); /* nb frames, filled later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 put_le32(pb, 0); /* initial frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 put_le32(pb, s->nb_streams); /* nb streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 put_le32(pb, 1024 * 1024); /* suggested buffer size */
36
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
337 if(video_enc){
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 put_le32(pb, video_enc->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 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
340 } else {
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
341 put_le32(pb, 0);
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
342 put_le32(pb, 0);
1188ad85857a audio only avi patch by (Andriy Rysin <arysin at bcsii dot net>)
michaelni
parents: 15
diff changeset
343 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 put_le32(pb, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 /* stream list */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 for(i=0;i<n;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 list2 = start_tag(pb, "LIST");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 put_tag(pb, "strl");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 stream = &s->streams[i]->codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355
89
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
356 /* 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
357 if (! stream->codec_tag) {
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
358 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
359 }
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
360
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 /* stream generic header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 strh = start_tag(pb, "strh");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 switch(stream->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 case CODEC_TYPE_VIDEO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 put_tag(pb, "vids");
89
8e3cf4e9fc5a rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 85
diff changeset
366 put_le32(pb, stream->codec_tag);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367 put_le32(pb, 0); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 put_le16(pb, 0); /* priority */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 put_le16(pb, 0); /* language */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 put_le32(pb, 0); /* initial frame */
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 65
diff changeset
371
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 77
diff changeset
372 put_le32(pb, stream->frame_rate_base); /* scale */
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 77
diff changeset
373 put_le32(pb, stream->frame_rate); /* rate */
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 65
diff changeset
374
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 put_le32(pb, 0); /* start */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 put_le32(pb, nb_frames); /* length, XXX: fill later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 put_le32(pb, 1024 * 1024); /* suggested buffer size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 put_le32(pb, -1); /* quality */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 put_le32(pb, stream->width * stream->height * 3); /* sample size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 put_le16(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 put_le16(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 put_le16(pb, stream->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 put_le16(pb, stream->height);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 put_tag(pb, "auds");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 put_le32(pb, 1); /* tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 put_le32(pb, 0); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390 put_le16(pb, 0); /* priority */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 put_le16(pb, 0); /* language */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 put_le32(pb, 0); /* initial frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 put_le32(pb, au_scale); /* scale */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 put_le32(pb, au_byterate); /* rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 put_le32(pb, 0); /* start */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 put_le32(pb, 0); /* length, XXX: filled later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 put_le32(pb, 12 * 1024); /* suggested buffer size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 put_le32(pb, -1); /* quality */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 put_le32(pb, au_ssize); /* sample size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 put_le32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 av_abort();
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
408 end_tag(pb, strh);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410 strf = start_tag(pb, "strf");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 switch(stream->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412 case CODEC_TYPE_VIDEO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 put_bmp_header(pb, stream, codec_bmp_tags, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 if (put_wav_header(pb, stream) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 av_free(avi);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 av_abort();
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 end_tag(pb, strf);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
425
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
426 if (!url_is_streamed(pb)) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
427 unsigned char tag[5];
123
3b9e4b0a91e2 * Making AVI encoding predictable (all JUNK chunks are filled with 0)
romansh
parents: 122
diff changeset
428 int j;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
429
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
430 /* Starting to lay out AVI OpenDML master index.
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
431 * We want to make it JUNK entry for now, since we'd
123
3b9e4b0a91e2 * Making AVI encoding predictable (all JUNK chunks are filled with 0)
romansh
parents: 122
diff changeset
432 * like to get away without making AVI an OpenDML one
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
433 * for compatibility reasons.
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
434 */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
435 avi->indexes[i].entry = avi->indexes[i].ents_allocated = 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
436 avi->indexes[i].indx_start = start_tag(pb, "JUNK");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
437 put_le16(pb, 4); /* wLongsPerEntry */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
438 put_byte(pb, 0); /* bIndexSubType (0 == frame index) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
439 put_byte(pb, 0); /* bIndexType (0 == AVI_INDEX_OF_INDEXES) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
440 put_le32(pb, 0); /* nEntriesInUse (will fill out later on) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
441 put_tag(pb, avi_stream2fourcc(&tag[0], i, stream->codec_type));
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
442 /* dwChunkId */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
443 put_le64(pb, 0); /* dwReserved[3]
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
444 put_le32(pb, 0); Must be 0. */
123
3b9e4b0a91e2 * Making AVI encoding predictable (all JUNK chunks are filled with 0)
romansh
parents: 122
diff changeset
445 for (j=0; j < AVI_MASTER_INDEX_SIZE * 2; j++)
3b9e4b0a91e2 * Making AVI encoding predictable (all JUNK chunks are filled with 0)
romansh
parents: 122
diff changeset
446 put_le64(pb, 0);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
447 end_tag(pb, avi->indexes[i].indx_start);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
448 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
449
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 end_tag(pb, list2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 }
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
452
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
453 if (!url_is_streamed(pb)) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
454 /* 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
455 avi->odml_list = start_tag(pb, "JUNK");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
456 put_tag(pb, "odml");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
457 put_tag(pb, "dmlh");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
458 put_le32(pb, 248);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
459 for (i = 0; i < 248; i+= 4)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
460 put_le32(pb, 0);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
461 end_tag(pb, avi->odml_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
462 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 end_tag(pb, list1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 avi->movi_list = start_tag(pb, "LIST");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 put_tag(pb, "movi");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
474 static int avi_write_ix(AVFormatContext *s)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
475 {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
476 ByteIOContext *pb = &s->pb;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
477 AVIContext *avi = s->priv_data;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
478 unsigned char tag[5];
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
479 unsigned char ix_tag[] = "ix00";
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
480 int i, j;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
481
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
482 if (avi->riff_id > AVI_MASTER_INDEX_SIZE)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
483 return -1;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
484
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
485 for (i=0;i<s->nb_streams;i++) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
486 offset_t ix, pos;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
487
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
488 avi_stream2fourcc(&tag[0], i, s->streams[i]->codec.codec_type);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
489 ix_tag[3] = '0' + i;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
490
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
491 /* Writing AVI OpenDML leaf index chunk */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
492 ix = url_ftell(pb);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
493 put_tag(pb, &ix_tag[0]); /* ix?? */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
494 put_le32(pb, avi->indexes[i].entry * 8 + 24);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
495 /* chunk size */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
496 put_le16(pb, 2); /* wLongsPerEntry */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
497 put_byte(pb, 0); /* bIndexSubType (0 == frame index) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
498 put_byte(pb, 1); /* bIndexType (1 == AVI_INDEX_OF_CHUNKS) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
499 put_le32(pb, avi->indexes[i].entry);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
500 /* nEntriesInUse */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
501 put_tag(pb, &tag[0]); /* dwChunkId */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
502 put_le64(pb, avi->movi_list);/* qwBaseOffset */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
503 put_le32(pb, 0); /* dwReserved_3 (must be 0) */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
504
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
505 for (j=0; j<avi->indexes[i].entry; j++) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
506 AVIIentry* ie = avi_get_ientry(&avi->indexes[i], j);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
507 put_le32(pb, ie->pos + 8);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
508 put_le32(pb, ((uint32_t)ie->len & ~0x80000000) |
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
509 (ie->flags & 0x10 ? 0 : 0x80000000));
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
510 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
511 put_flush_packet(pb);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
512 pos = url_ftell(pb);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
513
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
514 /* Updating one entry in the AVI OpenDML master index */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
515 url_fseek(pb, avi->indexes[i].indx_start - 8, SEEK_SET);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
516 put_tag(pb, "indx"); /* enabling this entry */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
517 url_fskip(pb, 8);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
518 put_le32(pb, avi->riff_id); /* nEntriesInUse */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
519 url_fskip(pb, 16*avi->riff_id);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
520 put_le64(pb, ix); /* qwOffset */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
521 put_le32(pb, pos - ix); /* dwSize */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
522 put_le32(pb, avi->indexes[i].entry); /* dwDuration */
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
523
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
524 url_fseek(pb, pos, SEEK_SET);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
525 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
526 return 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
527 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
528
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
529 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
530 {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
531 ByteIOContext *pb = &s->pb;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
532 AVIContext *avi = s->priv_data;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
533 offset_t file_size, idx_chunk;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
534 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
535 AVCodecContext *stream;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
536 unsigned char tag[5];
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
537
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
538 if (!url_is_streamed(pb)) {
122
013a7a0f2a1f * keeping compiler happy and quiet
kabi
parents: 120
diff changeset
539 AVIIentry* ie = 0, *tie;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
540 int entry[MAX_STREAMS];
122
013a7a0f2a1f * keeping compiler happy and quiet
kabi
parents: 120
diff changeset
541 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
542
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
543 idx_chunk = start_tag(pb, "idx1");
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
544 memset(&entry[0], 0, sizeof(entry));
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
545 do {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
546 empty = 1;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
547 for (i=0; i<s->nb_streams; i++) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
548 if (avi->indexes[i].entry <= entry[i])
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
549 continue;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
550
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
551 tie = avi_get_ientry(&avi->indexes[i], entry[i]);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
552 if (empty || tie->pos < ie->pos) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
553 ie = tie;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
554 stream_id = i;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
555 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
556 empty = 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
557 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
558 if (!empty) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
559 avi_stream2fourcc(&tag[0], stream_id,
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
560 s->streams[stream_id]->codec.codec_type);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
561 put_tag(pb, &tag[0]);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
562 put_le32(pb, ie->flags);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
563 put_le32(pb, ie->pos);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
564 put_le32(pb, ie->len);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
565 entry[stream_id]++;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
566 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
567 } while (!empty);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
568 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
569
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
570 /* Fill in frame/sample counters */
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
571 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
572 nb_frames = 0;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
573 for(n=0;n<s->nb_streams;n++) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
574 if (avi->frames_hdr_strm[n] != 0) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
575 stream = &s->streams[n]->codec;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
576 url_fseek(pb, avi->frames_hdr_strm[n], SEEK_SET);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
577 if (stream->codec_type == CODEC_TYPE_VIDEO) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
578 put_le32(pb, stream->frame_number);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
579 if (nb_frames < stream->frame_number)
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
580 nb_frames = stream->frame_number;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
581 } else {
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 227
diff changeset
582 if (stream->codec_id == CODEC_ID_MP2 || stream->codec_id == CODEC_ID_MP3) {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
583 put_le32(pb, stream->frame_number);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
584 nb_frames += stream->frame_number;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
585 } else {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
586 parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
587 put_le32(pb, avi->audio_strm_length[n] / au_ssize);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
588 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
589 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
590 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
591 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
592 if (avi->frames_hdr_all != 0) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
593 url_fseek(pb, avi->frames_hdr_all, SEEK_SET);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
594 put_le32(pb, nb_frames);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
595 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
596 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
597 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
598 return 0;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
599 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
600
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601 static int avi_write_packet(AVFormatContext *s, int stream_index,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 232
diff changeset
602 const uint8_t *buf, int size, int64_t pts)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606 unsigned char tag[5];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607 unsigned int flags;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 AVCodecContext *enc;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
609
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
610 if (url_ftell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE) {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
611 avi_write_ix(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
612 end_tag(pb, avi->movi_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
613
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
614 if (avi->riff_id == 1)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
615 avi_write_idx1(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
616
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
617 end_tag(pb, avi->riff_start);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
618 avi->movi_list = avi_start_new_riff(avi, pb, "AVIX", "movi");
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
619 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 enc = &s->streams[stream_index]->codec;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
622 avi_stream2fourcc(&tag[0], stream_index, enc->codec_type);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
623 if (enc->codec_type == CODEC_TYPE_AUDIO) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624 avi->audio_strm_length[stream_index] += size;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
625 flags = 0x10;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
626 } else
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
627 flags = enc->coded_frame->key_frame ? 0x10 : 0x00;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629 if (!url_is_streamed(&s->pb)) {
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
630 AVIIndex* idx = &avi->indexes[stream_index];
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
631 int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
632 int id = idx->entry % AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
633 if (idx->ents_allocated <= idx->entry) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
634 idx->cluster = av_realloc(idx->cluster, (cl+1)*sizeof(void*));
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
635 if (!idx->cluster)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
636 return -1;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
637 idx->cluster[cl] = av_malloc(AVI_INDEX_CLUSTER_SIZE*sizeof(AVIIentry));
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
638 if (!idx->cluster[cl])
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
639 return -1;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
640 idx->ents_allocated += AVI_INDEX_CLUSTER_SIZE;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
641 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
642
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
643 idx->cluster[cl][id].flags = flags;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
644 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
645 idx->cluster[cl][id].len = size;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
646 idx->entry++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
649 put_buffer(pb, tag, 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 put_le32(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 put_buffer(pb, buf, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 if (size & 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 put_byte(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 static int avi_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
661 AVIContext *avi = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 ByteIOContext *pb = &s->pb;
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
663 int res = 0;
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
664 int i, j, n, nb_frames;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
665 offset_t file_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
667 if (avi->riff_id == 1) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
668 end_tag(pb, avi->movi_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
669 res = avi_write_idx1(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
670 end_tag(pb, avi->riff_start);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
671 } else {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
672 avi_write_ix(s);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
673 end_tag(pb, avi->movi_list);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
674 end_tag(pb, avi->riff_start);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
675
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 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
677 url_fseek(pb, avi->odml_list - 8, SEEK_SET);
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
678 put_tag(pb, "LIST"); /* Making this AVI OpenDML one */
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
679 url_fskip(pb, 16);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
680
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
681 for (n=nb_frames=0;n<s->nb_streams;n++) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
682 AVCodecContext *stream = &s->streams[n]->codec;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
683 if (stream->codec_type == CODEC_TYPE_VIDEO) {
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
684 if (nb_frames < stream->frame_number)
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
685 nb_frames = stream->frame_number;
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
686 } else {
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 227
diff changeset
687 if (stream->codec_id == CODEC_ID_MP2 || stream->codec_id == CODEC_ID_MP3) {
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
688 nb_frames += stream->frame_number;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 }
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
691 }
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
692 put_le32(pb, nb_frames);
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
693 url_fseek(pb, file_size, SEEK_SET);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
694 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
695 put_flush_packet(pb);
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
696
119
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
697 for (i=0; i<MAX_STREAMS; i++) {
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
698 for (j=0; j<avi->indexes[i].ents_allocated/AVI_INDEX_CLUSTER_SIZE; j++)
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
699 av_free(avi->indexes[i].cluster[j]);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
700 av_free(avi->indexes[i].cluster);
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
701 avi->indexes[i].cluster = NULL;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
702 avi->indexes[i].ents_allocated = avi->indexes[i].entry = 0;
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
703 }
602546f3cbea Complete support for OpenDML AVIs and AVIs > 2Gb.
romansh
parents: 106
diff changeset
704
102
c48108fe538e AVI > 2Gb (OpenDML) generation patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 94
diff changeset
705 return res;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
707
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 static AVOutputFormat avi_oformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
709 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710 "avi format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711 "video/x-msvideo",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 sizeof(AVIContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 CODEC_ID_MP2,
106
4da5d55b3690 we really shouldnt use M$* as default codec -> use MPEG4 as default
michaelni
parents: 105
diff changeset
715 CODEC_ID_MPEG4,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 avi_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 avi_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
718 avi_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
720
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 int avienc_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
723 av_register_output_format(&avi_oformat);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
724 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
725 }
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 266
diff changeset
726 #endif //CONFIG_ENCODERS