riff.c 33.2 KB
Newer Older
1 2
/*
 * RIFF codec tags
3
 * Copyright (c) 2000 Fabrice Bellard
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19 20 21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22
#include "libavutil/mathematics.h"
23
#include "libavcodec/avcodec.h"
24
#include "avformat.h"
25
#include "avio_internal.h"
26
#include "riff.h"
27
#include "libavcodec/bytestream.h"
28 29 30

/* Note: when encoding, the first matching tag is used, so order is
   important if multiple tags possible for a given codec. */
31
const AVCodecTag ff_codec_bmp_tags[] = {
32 33 34 35 36
    { CODEC_ID_H264,         MKTAG('H', '2', '6', '4') },
    { CODEC_ID_H264,         MKTAG('h', '2', '6', '4') },
    { CODEC_ID_H264,         MKTAG('X', '2', '6', '4') },
    { CODEC_ID_H264,         MKTAG('x', '2', '6', '4') },
    { CODEC_ID_H264,         MKTAG('a', 'v', 'c', '1') },
ami_stuff's avatar
ami_stuff committed
37
    { CODEC_ID_H264,         MKTAG('D', 'A', 'V', 'C') },
38
    { CODEC_ID_H264,         MKTAG('V', 'S', 'S', 'H') },
39
    { CODEC_ID_H264,         MKTAG('Q', '2', '6', '4') }, /* QNAP surveillance system */
40
    { CODEC_ID_H263,         MKTAG('H', '2', '6', '3') },
Ben Littler's avatar
Ben Littler committed
41
    { CODEC_ID_H263,         MKTAG('X', '2', '6', '3') },
42
    { CODEC_ID_H263,         MKTAG('T', '2', '6', '3') },
Ben Littler's avatar
Ben Littler committed
43
    { CODEC_ID_H263,         MKTAG('L', '2', '6', '3') },
44
    { CODEC_ID_H263,         MKTAG('V', 'X', '1', 'K') },
Michael Niedermayer's avatar
Michael Niedermayer committed
45
    { CODEC_ID_H263,         MKTAG('Z', 'y', 'G', 'o') },
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
46
    { CODEC_ID_H263,         MKTAG('M', '2', '6', '3') },
47 48 49 50 51 52 53 54 55 56 57
    { CODEC_ID_H263P,        MKTAG('H', '2', '6', '3') },
    { CODEC_ID_H263I,        MKTAG('I', '2', '6', '3') }, /* intel h263 */
    { CODEC_ID_H261,         MKTAG('H', '2', '6', '1') },
    { CODEC_ID_H263P,        MKTAG('U', '2', '6', '3') },
    { CODEC_ID_H263P,        MKTAG('v', 'i', 'v', '1') },
    { CODEC_ID_MPEG4,        MKTAG('F', 'M', 'P', '4') },
    { CODEC_ID_MPEG4,        MKTAG('D', 'I', 'V', 'X') },
    { CODEC_ID_MPEG4,        MKTAG('D', 'X', '5', '0') },
    { CODEC_ID_MPEG4,        MKTAG('X', 'V', 'I', 'D') },
    { CODEC_ID_MPEG4,        MKTAG('M', 'P', '4', 'S') },
    { CODEC_ID_MPEG4,        MKTAG('M', '4', 'S', '2') },
58
    { CODEC_ID_MPEG4,        MKTAG( 4 ,  0 ,  0 ,  0 ) }, /* some broken avi use this */
59 60 61 62 63 64 65
    { CODEC_ID_MPEG4,        MKTAG('D', 'I', 'V', '1') },
    { CODEC_ID_MPEG4,        MKTAG('B', 'L', 'Z', '0') },
    { CODEC_ID_MPEG4,        MKTAG('m', 'p', '4', 'v') },
    { CODEC_ID_MPEG4,        MKTAG('U', 'M', 'P', '4') },
    { CODEC_ID_MPEG4,        MKTAG('W', 'V', '1', 'F') },
    { CODEC_ID_MPEG4,        MKTAG('S', 'E', 'D', 'G') },
    { CODEC_ID_MPEG4,        MKTAG('R', 'M', 'P', '4') },
66
    { CODEC_ID_MPEG4,        MKTAG('3', 'I', 'V', '2') },
67
    { CODEC_ID_MPEG4,        MKTAG('W', 'A', 'W', 'V') }, /* WaWv MPEG-4 Video Codec */
68
    { CODEC_ID_MPEG4,        MKTAG('F', 'F', 'D', 'S') },
69
    { CODEC_ID_MPEG4,        MKTAG('F', 'V', 'F', 'W') },
Ben Littler's avatar
Ben Littler committed
70 71 72 73 74 75 76
    { CODEC_ID_MPEG4,        MKTAG('D', 'C', 'O', 'D') },
    { CODEC_ID_MPEG4,        MKTAG('M', 'V', 'X', 'M') },
    { CODEC_ID_MPEG4,        MKTAG('P', 'M', '4', 'V') },
    { CODEC_ID_MPEG4,        MKTAG('S', 'M', 'P', '4') },
    { CODEC_ID_MPEG4,        MKTAG('D', 'X', 'G', 'M') },
    { CODEC_ID_MPEG4,        MKTAG('V', 'I', 'D', 'M') },
    { CODEC_ID_MPEG4,        MKTAG('M', '4', 'T', '3') },
77
    { CODEC_ID_MPEG4,        MKTAG('G', 'E', 'O', 'X') },
Ben Littler's avatar
Ben Littler committed
78
    { CODEC_ID_MPEG4,        MKTAG('H', 'D', 'X', '4') }, /* flipped video */
79
    { CODEC_ID_MPEG4,        MKTAG('D', 'M', 'K', '2') },
80
    { CODEC_ID_MPEG4,        MKTAG('D', 'I', 'G', 'I') },
81
    { CODEC_ID_MPEG4,        MKTAG('I', 'N', 'M', 'C') },
Ben Littler's avatar
Ben Littler committed
82
    { CODEC_ID_MPEG4,        MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */
83
    { CODEC_ID_MPEG4,        MKTAG('E', 'M', '4', 'A') },
84
    { CODEC_ID_MPEG4,        MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */
85
    { CODEC_ID_MPEG4,        MKTAG('S', 'N', '4', '0') },
86
    { CODEC_ID_MPEG4,        MKTAG('V', 'S', 'P', 'X') },
87
    { CODEC_ID_MPEG4,        MKTAG('U', 'L', 'D', 'X') },
88
    { CODEC_ID_MPEG4,        MKTAG('G', 'E', 'O', 'V') },
89
    { CODEC_ID_MPEG4,        MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
90
    { CODEC_ID_MPEG4,        MKTAG('X', 'V', 'I', 'X') },
91
    { CODEC_ID_MPEG4,        MKTAG('D', 'r', 'e', 'X') },
92
    { CODEC_ID_MPEG4,        MKTAG('Q', 'M', 'P', '4') }, /* QNAP Systems */
93
    { CODEC_ID_MSMPEG4V3,    MKTAG('M', 'P', '4', '3') },
94
    { CODEC_ID_MSMPEG4V3,    MKTAG('D', 'I', 'V', '3') },
95 96 97 98
    { CODEC_ID_MSMPEG4V3,    MKTAG('M', 'P', 'G', '3') },
    { CODEC_ID_MSMPEG4V3,    MKTAG('D', 'I', 'V', '5') },
    { CODEC_ID_MSMPEG4V3,    MKTAG('D', 'I', 'V', '6') },
    { CODEC_ID_MSMPEG4V3,    MKTAG('D', 'I', 'V', '4') },
99
    { CODEC_ID_MSMPEG4V3,    MKTAG('D', 'V', 'X', '3') },
100 101 102 103 104 105
    { CODEC_ID_MSMPEG4V3,    MKTAG('A', 'P', '4', '1') },
    { CODEC_ID_MSMPEG4V3,    MKTAG('C', 'O', 'L', '1') },
    { CODEC_ID_MSMPEG4V3,    MKTAG('C', 'O', 'L', '0') },
    { CODEC_ID_MSMPEG4V2,    MKTAG('M', 'P', '4', '2') },
    { CODEC_ID_MSMPEG4V2,    MKTAG('D', 'I', 'V', '2') },
    { CODEC_ID_MSMPEG4V1,    MKTAG('M', 'P', 'G', '4') },
Ben Littler's avatar
Ben Littler committed
106
    { CODEC_ID_MSMPEG4V1,    MKTAG('M', 'P', '4', '1') },
107 108 109 110
    { CODEC_ID_WMV1,         MKTAG('W', 'M', 'V', '1') },
    { CODEC_ID_WMV2,         MKTAG('W', 'M', 'V', '2') },
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 's', 'd') },
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', 'd') },
111
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', '1') },
112 113 114 115
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 's', 'l') },
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', '2', '5') },
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', '5', '0') },
    { CODEC_ID_DVVIDEO,      MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
Ben Littler's avatar
Ben Littler committed
116
    { CODEC_ID_DVVIDEO,      MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
117
    { CODEC_ID_DVVIDEO,      MKTAG('C', 'D', 'V', '5') }, /* Canopus DV */
Ben Littler's avatar
Ben Littler committed
118
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'c', ' ') },
119
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'c', 's') },
120
    { CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', '1') },
121 122 123 124 125
    { CODEC_ID_MPEG1VIDEO,   MKTAG('m', 'p', 'g', '1') },
    { CODEC_ID_MPEG1VIDEO,   MKTAG('m', 'p', 'g', '2') },
    { CODEC_ID_MPEG2VIDEO,   MKTAG('m', 'p', 'g', '2') },
    { CODEC_ID_MPEG2VIDEO,   MKTAG('M', 'P', 'E', 'G') },
    { CODEC_ID_MPEG1VIDEO,   MKTAG('P', 'I', 'M', '1') },
Ben Littler's avatar
Ben Littler committed
126
    { CODEC_ID_MPEG2VIDEO,   MKTAG('P', 'I', 'M', '2') },
127
    { CODEC_ID_MPEG1VIDEO,   MKTAG('V', 'C', 'R', '2') },
128 129
    { CODEC_ID_MPEG1VIDEO,   MKTAG( 1 ,  0 ,  0 ,  16) },
    { CODEC_ID_MPEG2VIDEO,   MKTAG( 2 ,  0 ,  0 ,  16) },
130
    { CODEC_ID_MPEG4,        MKTAG( 4 ,  0 ,  0 ,  16) },
131 132
    { CODEC_ID_MPEG2VIDEO,   MKTAG('D', 'V', 'R', ' ') },
    { CODEC_ID_MPEG2VIDEO,   MKTAG('M', 'M', 'E', 'S') },
133
    { CODEC_ID_MPEG2VIDEO,   MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
134
    { CODEC_ID_MPEG2VIDEO,   MKTAG('s', 'l', 'i', 'f') },
135
    { CODEC_ID_MPEG2VIDEO,   MKTAG('E', 'M', '2', 'V') },
136
    { CODEC_ID_MPEG2VIDEO,   MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
137
    { CODEC_ID_MPEG2VIDEO,   MKTAG('m', 'p', 'g', 'v') },
138
    { CODEC_ID_MPEG1VIDEO,   MKTAG('B', 'W', '1', '0') },
139
    { CODEC_ID_MPEG1VIDEO,   MKTAG('X', 'M', 'P', 'G') }, /* Xing MPEG intra only */
140 141
    { CODEC_ID_MJPEG,        MKTAG('M', 'J', 'P', 'G') },
    { CODEC_ID_MJPEG,        MKTAG('L', 'J', 'P', 'G') },
Ben Littler's avatar
Ben Littler committed
142
    { CODEC_ID_MJPEG,        MKTAG('d', 'm', 'b', '1') },
143
    { CODEC_ID_MJPEG,        MKTAG('m', 'j', 'p', 'a') },
144 145 146
    { CODEC_ID_LJPEG,        MKTAG('L', 'J', 'P', 'G') },
    { CODEC_ID_MJPEG,        MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
    { CODEC_ID_JPEGLS,       MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
147
    { CODEC_ID_JPEGLS,       MKTAG('M', 'J', 'P', 'G') },
148 149 150 151
    { CODEC_ID_MJPEG,        MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
    { CODEC_ID_MJPEG,        MKTAG('j', 'p', 'e', 'g') },
    { CODEC_ID_MJPEG,        MKTAG('I', 'J', 'P', 'G') },
    { CODEC_ID_MJPEG,        MKTAG('A', 'V', 'R', 'n') },
152
    { CODEC_ID_MJPEG,        MKTAG('A', 'C', 'D', 'V') },
153
    { CODEC_ID_MJPEG,        MKTAG('Q', 'I', 'V', 'G') },
Ben Littler's avatar
Ben Littler committed
154
    { CODEC_ID_MJPEG,        MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
155
    { CODEC_ID_MJPEG,        MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
156
    { CODEC_ID_MJPEG,        MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
157
    { CODEC_ID_MJPEG,        MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
158 159
    { CODEC_ID_MJPEG,        MKTAG('A', 'V', 'I', '1') },
    { CODEC_ID_MJPEG,        MKTAG('A', 'V', 'I', '2') },
160
    { CODEC_ID_MJPEG,        MKTAG('M', 'T', 'S', 'J') },
161
    { CODEC_ID_MJPEG,        MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
162
    { CODEC_ID_MJPEG,        MKTAG('M', 'M', 'J', 'P') },
163 164 165
    { CODEC_ID_HUFFYUV,      MKTAG('H', 'F', 'Y', 'U') },
    { CODEC_ID_FFVHUFF,      MKTAG('F', 'F', 'V', 'H') },
    { CODEC_ID_CYUV,         MKTAG('C', 'Y', 'U', 'V') },
166
    { CODEC_ID_RAWVIDEO,     MKTAG( 0 ,  0 ,  0 ,  0 ) },
167
    { CODEC_ID_RAWVIDEO,     MKTAG( 3 ,  0 ,  0 ,  0 ) },
168 169 170
    { CODEC_ID_RAWVIDEO,     MKTAG('I', '4', '2', '0') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'U', 'Y', '2') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '4', '2', '2') },
171 172 173 174 175 176
    { CODEC_ID_RAWVIDEO,     MKTAG('V', '4', '2', '2') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'U', 'N', 'V') },
    { CODEC_ID_RAWVIDEO,     MKTAG('U', 'Y', 'N', 'V') },
    { CODEC_ID_RAWVIDEO,     MKTAG('U', 'Y', 'N', 'Y') },
    { CODEC_ID_RAWVIDEO,     MKTAG('u', 'y', 'v', '1') },
    { CODEC_ID_RAWVIDEO,     MKTAG('2', 'V', 'u', '1') },
177
    { CODEC_ID_RAWVIDEO,     MKTAG('2', 'v', 'u', 'y') },
178
    { CODEC_ID_RAWVIDEO,     MKTAG('y', 'u', 'v', 's') },
179
    { CODEC_ID_RAWVIDEO,     MKTAG('y', 'u', 'v', '2') },
180
    { CODEC_ID_RAWVIDEO,     MKTAG('P', '4', '2', '2') },
181
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', '1', '2') },
182
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', '1', '6') },
ami_stuff's avatar
ami_stuff committed
183
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', '2', '4') },
184
    { CODEC_ID_RAWVIDEO,     MKTAG('U', 'Y', 'V', 'Y') },
185
    { CODEC_ID_RAWVIDEO,     MKTAG('V', 'Y', 'U', 'Y') },
186 187
    { CODEC_ID_RAWVIDEO,     MKTAG('I', 'Y', 'U', 'V') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '8', '0', '0') },
188
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '8', ' ', ' ') },
189
    { CODEC_ID_RAWVIDEO,     MKTAG('H', 'D', 'Y', 'C') },
190
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', 'U', '9') },
191
    { CODEC_ID_RAWVIDEO,     MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
192
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '4', '1', '1') },
193 194
    { CODEC_ID_RAWVIDEO,     MKTAG('N', 'V', '1', '2') },
    { CODEC_ID_RAWVIDEO,     MKTAG('N', 'V', '2', '1') },
195 196 197 198
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '4', '1', 'B') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', '4', '2', 'B') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'U', 'V', '9') },
    { CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', 'U', '9') },
ami_stuff's avatar
ami_stuff committed
199
    { CODEC_ID_RAWVIDEO,     MKTAG('a', 'u', 'v', '2') },
200
    { CODEC_ID_FRWU,         MKTAG('F', 'R', 'W', 'U') },
Zhou Zongyi's avatar
Zhou Zongyi committed
201
    { CODEC_ID_R10K,         MKTAG('R', '1', '0', 'k') },
202
    { CODEC_ID_R210,         MKTAG('r', '2', '1', '0') },
203
    { CODEC_ID_V210,         MKTAG('v', '2', '1', '0') },
204
    { CODEC_ID_V308,         MKTAG('v', '3', '0', '8') },
205
    { CODEC_ID_V410,         MKTAG('v', '4', '1', '0') },
206
    { CODEC_ID_YUV4,         MKTAG('y', 'u', 'v', '4') },
207 208 209 210 211 212 213 214 215 216
    { CODEC_ID_INDEO3,       MKTAG('I', 'V', '3', '1') },
    { CODEC_ID_INDEO3,       MKTAG('I', 'V', '3', '2') },
    { CODEC_ID_INDEO4,       MKTAG('I', 'V', '4', '1') },
    { CODEC_ID_INDEO5,       MKTAG('I', 'V', '5', '0') },
    { CODEC_ID_VP3,          MKTAG('V', 'P', '3', '1') },
    { CODEC_ID_VP3,          MKTAG('V', 'P', '3', '0') },
    { CODEC_ID_VP5,          MKTAG('V', 'P', '5', '0') },
    { CODEC_ID_VP6,          MKTAG('V', 'P', '6', '0') },
    { CODEC_ID_VP6,          MKTAG('V', 'P', '6', '1') },
    { CODEC_ID_VP6,          MKTAG('V', 'P', '6', '2') },
217
    { CODEC_ID_VP6F,         MKTAG('V', 'P', '6', 'F') },
218
    { CODEC_ID_VP6F,         MKTAG('F', 'L', 'V', '4') },
Google's avatar
Google committed
219
    { CODEC_ID_VP8,          MKTAG('V', 'P', '8', '0') },
220 221 222 223 224
    { CODEC_ID_ASV1,         MKTAG('A', 'S', 'V', '1') },
    { CODEC_ID_ASV2,         MKTAG('A', 'S', 'V', '2') },
    { CODEC_ID_VCR1,         MKTAG('V', 'C', 'R', '1') },
    { CODEC_ID_FFV1,         MKTAG('F', 'F', 'V', '1') },
    { CODEC_ID_XAN_WC4,      MKTAG('X', 'x', 'a', 'n') },
225
    { CODEC_ID_MIMIC,        MKTAG('L', 'M', '2', '0') },
226
    { CODEC_ID_MSRLE,        MKTAG('m', 'r', 'l', 'e') },
227
    { CODEC_ID_MSRLE,        MKTAG( 1 ,  0 ,  0 ,  0 ) },
Kostya Shishkov's avatar
Kostya Shishkov committed
228
    { CODEC_ID_MSRLE,        MKTAG( 2 ,  0 ,  0 ,  0 ) },
229 230 231 232 233 234 235 236
    { CODEC_ID_MSVIDEO1,     MKTAG('M', 'S', 'V', 'C') },
    { CODEC_ID_MSVIDEO1,     MKTAG('m', 's', 'v', 'c') },
    { CODEC_ID_MSVIDEO1,     MKTAG('C', 'R', 'A', 'M') },
    { CODEC_ID_MSVIDEO1,     MKTAG('c', 'r', 'a', 'm') },
    { CODEC_ID_MSVIDEO1,     MKTAG('W', 'H', 'A', 'M') },
    { CODEC_ID_MSVIDEO1,     MKTAG('w', 'h', 'a', 'm') },
    { CODEC_ID_CINEPAK,      MKTAG('c', 'v', 'i', 'd') },
    { CODEC_ID_TRUEMOTION1,  MKTAG('D', 'U', 'C', 'K') },
237
    { CODEC_ID_TRUEMOTION1,  MKTAG('P', 'V', 'E', 'Z') },
238 239 240 241 242
    { CODEC_ID_MSZH,         MKTAG('M', 'S', 'Z', 'H') },
    { CODEC_ID_ZLIB,         MKTAG('Z', 'L', 'I', 'B') },
    { CODEC_ID_SNOW,         MKTAG('S', 'N', 'O', 'W') },
    { CODEC_ID_4XM,          MKTAG('4', 'X', 'M', 'V') },
    { CODEC_ID_FLV1,         MKTAG('F', 'L', 'V', '1') },
ami_stuff's avatar
ami_stuff committed
243
    { CODEC_ID_FLV1,         MKTAG('S', '2', '6', '3') },
244 245 246 247 248 249 250 251 252
    { CODEC_ID_FLASHSV,      MKTAG('F', 'S', 'V', '1') },
    { CODEC_ID_SVQ1,         MKTAG('s', 'v', 'q', '1') },
    { CODEC_ID_TSCC,         MKTAG('t', 's', 'c', 'c') },
    { CODEC_ID_ULTI,         MKTAG('U', 'L', 'T', 'I') },
    { CODEC_ID_VIXL,         MKTAG('V', 'I', 'X', 'L') },
    { CODEC_ID_QPEG,         MKTAG('Q', 'P', 'E', 'G') },
    { CODEC_ID_QPEG,         MKTAG('Q', '1', '.', '0') },
    { CODEC_ID_QPEG,         MKTAG('Q', '1', '.', '1') },
    { CODEC_ID_WMV3,         MKTAG('W', 'M', 'V', '3') },
253
    { CODEC_ID_WMV3IMAGE,    MKTAG('W', 'M', 'V', 'P') },
254 255
    { CODEC_ID_VC1,          MKTAG('W', 'V', 'C', '1') },
    { CODEC_ID_VC1,          MKTAG('W', 'M', 'V', 'A') },
256
    { CODEC_ID_VC1IMAGE,     MKTAG('W', 'V', 'P', '2') },
257 258 259 260 261 262 263 264 265 266 267
    { CODEC_ID_LOCO,         MKTAG('L', 'O', 'C', 'O') },
    { CODEC_ID_WNV1,         MKTAG('W', 'N', 'V', '1') },
    { CODEC_ID_AASC,         MKTAG('A', 'A', 'S', 'C') },
    { CODEC_ID_INDEO2,       MKTAG('R', 'T', '2', '1') },
    { CODEC_ID_FRAPS,        MKTAG('F', 'P', 'S', '1') },
    { CODEC_ID_THEORA,       MKTAG('t', 'h', 'e', 'o') },
    { CODEC_ID_TRUEMOTION2,  MKTAG('T', 'M', '2', '0') },
    { CODEC_ID_CSCD,         MKTAG('C', 'S', 'C', 'D') },
    { CODEC_ID_ZMBV,         MKTAG('Z', 'M', 'B', 'V') },
    { CODEC_ID_KMVC,         MKTAG('K', 'M', 'V', 'C') },
    { CODEC_ID_CAVS,         MKTAG('C', 'A', 'V', 'S') },
268
    { CODEC_ID_JPEG2000,     MKTAG('m', 'j', 'p', '2') },
269
    { CODEC_ID_JPEG2000,     MKTAG('M', 'J', '2', 'C') },
270 271
    { CODEC_ID_JPEG2000,     MKTAG('L', 'J', '2', 'C') },
    { CODEC_ID_JPEG2000,     MKTAG('L', 'J', '2', 'K') },
272 273
    { CODEC_ID_VMNC,         MKTAG('V', 'M', 'n', 'c') },
    { CODEC_ID_TARGA,        MKTAG('t', 'g', 'a', ' ') },
Ben Littler's avatar
Ben Littler committed
274
    { CODEC_ID_PNG,          MKTAG('M', 'P', 'N', 'G') },
275
    { CODEC_ID_PNG,          MKTAG('P', 'N', 'G', '1') },
Paul B Mahol's avatar
Paul B Mahol committed
276
    { CODEC_ID_CLJR,         MKTAG('C', 'L', 'J', 'R') },
277
    { CODEC_ID_DIRAC,        MKTAG('d', 'r', 'a', 'c') },
278
    { CODEC_ID_RPZA,         MKTAG('a', 'z', 'p', 'r') },
Ben Littler's avatar
Ben Littler committed
279 280
    { CODEC_ID_RPZA,         MKTAG('R', 'P', 'Z', 'A') },
    { CODEC_ID_RPZA,         MKTAG('r', 'p', 'z', 'a') },
281
    { CODEC_ID_SP5X,         MKTAG('S', 'P', '5', '4') },
282 283
    { CODEC_ID_AURA,         MKTAG('A', 'U', 'R', 'A') },
    { CODEC_ID_AURA2,        MKTAG('A', 'U', 'R', '2') },
284
    { CODEC_ID_DPX,          MKTAG('d', 'p', 'x', ' ') },
285
    { CODEC_ID_KGV1,         MKTAG('K', 'G', 'V', '1') },
286
    { CODEC_ID_LAGARITH,     MKTAG('L', 'A', 'G', 'S') },
287 288 289
    { CODEC_ID_G2M,          MKTAG('G', '2', 'M', '2') },
    { CODEC_ID_G2M,          MKTAG('G', '2', 'M', '3') },
    { CODEC_ID_G2M,          MKTAG('G', '2', 'M', '4') },
Michael Niedermayer's avatar
Michael Niedermayer committed
290
    { CODEC_ID_AMV,          MKTAG('A', 'M', 'V', 'F') },
Kostya Shishkov's avatar
Kostya Shishkov committed
291 292
    { CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'R', 'A') },
    { CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'R', 'G') },
293 294
    { CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'Y', '0') },
    { CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'Y', '2') },
Derek Buitenhuis's avatar
Derek Buitenhuis committed
295
    { CODEC_ID_VBLE,         MKTAG('V', 'B', 'L', 'E') },
296
    { CODEC_ID_ESCAPE130,    MKTAG('E', '1', '3', '0') },
297
    { CODEC_ID_DXTORY,       MKTAG('x', 't', 'o', 'r') },
Paul B Mahol's avatar
Paul B Mahol committed
298
    { CODEC_ID_Y41P,         MKTAG('Y', '4', '1', 'P') },
299
    { CODEC_ID_NONE,         0 }
300 301
};

302
const AVCodecTag ff_codec_wav_tags[] = {
303 304 305 306 307
    { CODEC_ID_PCM_S16LE,       0x0001 },
    { CODEC_ID_PCM_U8,          0x0001 }, /* must come after s16le in this list */
    { CODEC_ID_PCM_S24LE,       0x0001 },
    { CODEC_ID_PCM_S32LE,       0x0001 },
    { CODEC_ID_ADPCM_MS,        0x0002 },
308 309
    { CODEC_ID_PCM_F32LE,       0x0003 },
    { CODEC_ID_PCM_F64LE,       0x0003 }, /* must come after f32le in this list */
310 311 312 313
    { CODEC_ID_PCM_ALAW,        0x0006 },
    { CODEC_ID_PCM_MULAW,       0x0007 },
    { CODEC_ID_WMAVOICE,        0x000A },
    { CODEC_ID_ADPCM_IMA_WAV,   0x0011 },
314
    { CODEC_ID_PCM_ZORK,        0x0011 }, /* must come after adpcm_ima_wav in this list */
315 316 317
    { CODEC_ID_ADPCM_YAMAHA,    0x0020 },
    { CODEC_ID_TRUESPEECH,      0x0022 },
    { CODEC_ID_GSM_MS,          0x0031 },
318
    { CODEC_ID_AMR_NB,          0x0038 },  /* rogue format number */
319 320 321
    { CODEC_ID_ADPCM_G726,      0x0045 },
    { CODEC_ID_MP2,             0x0050 },
    { CODEC_ID_MP3,             0x0055 },
Ben Littler's avatar
Ben Littler committed
322 323
    { CODEC_ID_AMR_NB,          0x0057 },
    { CODEC_ID_AMR_WB,          0x0058 },
324 325
    { CODEC_ID_ADPCM_IMA_DK4,   0x0061 },  /* rogue format number */
    { CODEC_ID_ADPCM_IMA_DK3,   0x0062 },  /* rogue format number */
326
    { CODEC_ID_ADPCM_IMA_WAV,   0x0069 },
327 328
    { CODEC_ID_VOXWARE,         0x0075 },
    { CODEC_ID_AAC,             0x00ff },
329
    { CODEC_ID_SIPR,            0x0130 },
330 331 332
    { CODEC_ID_WMAV1,           0x0160 },
    { CODEC_ID_WMAV2,           0x0161 },
    { CODEC_ID_WMAPRO,          0x0162 },
333
    { CODEC_ID_WMALOSSLESS,     0x0163 },
334 335
    { CODEC_ID_ADPCM_CT,        0x0200 },
    { CODEC_ID_ATRAC3,          0x0270 },
336
    { CODEC_ID_ADPCM_G722,      0x028F },
337
    { CODEC_ID_IMC,             0x0401 },
338 339
    { CODEC_ID_GSM_MS,          0x1500 },
    { CODEC_ID_TRUESPEECH,      0x1501 },
340
    { CODEC_ID_AAC,             0x1600 }, /* ADTS AAC */
341
    { CODEC_ID_AAC_LATM,        0x1602 },
342 343
    { CODEC_ID_AC3,             0x2000 },
    { CODEC_ID_DTS,             0x2001 },
344 345
    { CODEC_ID_SONIC,           0x2048 },
    { CODEC_ID_SONIC_LS,        0x2048 },
346
    { CODEC_ID_PCM_MULAW,       0x6c75 },
347
    { CODEC_ID_AAC,             0x706d },
348
    { CODEC_ID_AAC,             0x4143 },
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
349
    { CODEC_ID_SPEEX,           0xA109 },
350 351 352
    { CODEC_ID_FLAC,            0xF1AC },
    { CODEC_ID_ADPCM_SWF,       ('S'<<8)+'F' },
    { CODEC_ID_VORBIS,          ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id?
353 354

    /* FIXME: All of the IDs below are not 16 bit and thus illegal. */
355 356
    // for NuppelVideo (nuv.c)
    { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') },
357 358
    { CODEC_ID_MP3,       MKTAG('L', 'A', 'M', 'E') },
    { CODEC_ID_MP3,       MKTAG('M', 'P', '3', ' ') },
359
    { CODEC_ID_NONE,      0 },
360 361
};

362 363
const AVCodecGuid ff_codec_wav_guids[] = {
    {CODEC_ID_AC3,        {0x2C,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
Peter Ross's avatar
Peter Ross committed
364
    {CODEC_ID_ATRAC3P,    {0xBF,0xAA,0x23,0xE9,0x58,0xCB,0x71,0x44,0xA1,0x19,0xFF,0xFA,0x01,0xE4,0xCE,0x62}},
365 366 367 368 369
    {CODEC_ID_EAC3,       {0xAF,0x87,0xFB,0xA7,0x02,0x2D,0xFB,0x42,0xA4,0xD4,0x05,0xCD,0x93,0x84,0x3B,0xDD}},
    {CODEC_ID_MP2,        {0x2B,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
    {CODEC_ID_NONE}
};

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
const AVMetadataConv ff_riff_info_conv[] = {
    { "IART", "artist"    },
    { "ICMT", "comment"   },
    { "ICOP", "copyright" },
    { "ICRD", "date"      },
    { "IGNR", "genre"     },
    { "ILNG", "language"  },
    { "INAM", "title"     },
    { "IPRD", "album"     },
    { "IPRT", "track"     },
    { "ISFT", "encoder"   },
    { "ITCH", "encoded_by"},
    { 0 },
};

const char ff_riff_tags[][5] = {
    "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
    "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
    "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
    {0}
};

392
#if CONFIG_MUXERS
393
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
394
{
395
    ffio_wfourcc(pb, tag);
396
    avio_wl32(pb, 0);
397
    return avio_tell(pb);
398 399
}

400
void ff_end_tag(AVIOContext *pb, int64_t start)
401
{
402
    int64_t pos;
403

404
    pos = avio_tell(pb);
405
    avio_seek(pb, start - 4, SEEK_SET);
406
    avio_wl32(pb, (uint32_t)(pos - start));
407
    avio_seek(pb, pos, SEEK_SET);
408 409 410 411
}

/* WAVEFORMATEX header */
/* returns the size or -1 on error */
412
int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
413 414 415
{
    int bps, blkalign, bytespersec;
    int hdrsize = 18;
416 417 418 419
    int waveformatextensible;
    uint8_t temp[256];
    uint8_t *riff_extradata= temp;
    uint8_t *riff_extradata_start= temp;
420

421
    if(!enc->codec_tag || enc->codec_tag > 0xffff)
422
        return -1;
423 424 425
    waveformatextensible =   (enc->channels > 2 && enc->channel_layout)
                          || enc->sample_rate > 48000
                          || av_get_bits_per_sample(enc->codec_id) > 16;
426

427
    if (waveformatextensible) {
428
        avio_wl16(pb, 0xfffe);
429
    } else {
430
        avio_wl16(pb, enc->codec_tag);
431
    }
432 433
    avio_wl16(pb, enc->channels);
    avio_wl32(pb, enc->sample_rate);
434
    if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) {
435 436
        bps = 0;
    } else {
437 438 439 440 441 442
        if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
            if (enc->bits_per_coded_sample)
                bps = enc->bits_per_coded_sample;
            else
                bps = 16; // default to 16
        }
443
    }
444 445
    if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){
        av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps);
446
    }
447

448
    if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) {
Diego Biurrun's avatar
Diego Biurrun committed
449
        blkalign = enc->frame_size; //this is wrong, but it seems many demuxers do not work if this is set correctly
450
        //blkalign = 144 * enc->bit_rate/enc->sample_rate;
451 452
    } else if (enc->codec_id == CODEC_ID_AC3) {
            blkalign = 3840; //maximum bytes per frame
453 454 455
    } else if (enc->block_align != 0) { /* specified by the codec */
        blkalign = enc->block_align;
    } else
456
        blkalign = bps * enc->channels / av_gcd(8, bps);
457 458 459
    if (enc->codec_id == CODEC_ID_PCM_U8 ||
        enc->codec_id == CODEC_ID_PCM_S24LE ||
        enc->codec_id == CODEC_ID_PCM_S32LE ||
460 461
        enc->codec_id == CODEC_ID_PCM_F32LE ||
        enc->codec_id == CODEC_ID_PCM_F64LE ||
462 463 464 465 466
        enc->codec_id == CODEC_ID_PCM_S16LE) {
        bytespersec = enc->sample_rate * blkalign;
    } else {
        bytespersec = enc->bit_rate / 8;
    }
467 468 469
    avio_wl32(pb, bytespersec); /* bytes per second */
    avio_wl16(pb, blkalign); /* block align */
    avio_wl16(pb, bps); /* bits per sample */
470 471
    if (enc->codec_id == CODEC_ID_MP3) {
        hdrsize += 12;
472 473 474 475 476
        bytestream_put_le16(&riff_extradata, 1);    /* wID */
        bytestream_put_le32(&riff_extradata, 2);    /* fdwFlags */
        bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
        bytestream_put_le16(&riff_extradata, 1);    /* nFramesPerBlock */
        bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
477 478
    } else if (enc->codec_id == CODEC_ID_MP2) {
        hdrsize += 22;
479 480 481 482 483 484 485 486
        bytestream_put_le16(&riff_extradata, 2);                          /* fwHeadLayer */
        bytestream_put_le32(&riff_extradata, enc->bit_rate);              /* dwHeadBitrate */
        bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */
        bytestream_put_le16(&riff_extradata, 0);                          /* fwHeadModeExt */
        bytestream_put_le16(&riff_extradata, 1);                          /* wHeadEmphasis */
        bytestream_put_le16(&riff_extradata, 16);                         /* fwHeadFlags */
        bytestream_put_le32(&riff_extradata, 0);                          /* dwPTSLow */
        bytestream_put_le32(&riff_extradata, 0);                          /* dwPTSHigh */
Zhentan Feng's avatar
Zhentan Feng committed
487
    } else if (enc->codec_id == CODEC_ID_GSM_MS || enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
488
        hdrsize += 2;
489
        bytestream_put_le16(&riff_extradata, enc->frame_size); /* wSamplesPerBlock */
490
    } else if(enc->extradata_size){
491 492
        riff_extradata_start= enc->extradata;
        riff_extradata= enc->extradata + enc->extradata_size;
493
        hdrsize += enc->extradata_size;
494 495 496
    }
    if(waveformatextensible) {                                    /* write WAVEFORMATEXTENSIBLE extensions */
        hdrsize += 22;
497
        avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */
498
        avio_wl16(pb, bps);                                        /* ValidBitsPerSample || SamplesPerBlock || Reserved */
499 500 501 502 503
        avio_wl32(pb, enc->channel_layout);                        /* dwChannelMask */
        avio_wl32(pb, enc->codec_tag);                             /* GUID + next 3 */
        avio_wl32(pb, 0x00100000);
        avio_wl32(pb, 0xAA000080);
        avio_wl32(pb, 0x719B3800);
504 505
    } else {
        avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
506
    }
507
    avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
508 509
    if(hdrsize&1){
        hdrsize++;
510
        avio_w8(pb, 0);
511
    }
512 513 514 515 516

    return hdrsize;
}

/* BITMAPINFOHEADER header */
517
void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf)
518
{
519 520
    avio_wl32(pb, 40 + enc->extradata_size); /* size */
    avio_wl32(pb, enc->width);
521
    //We always store RGB TopDown
522 523
    avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
    avio_wl16(pb, 1); /* planes */
524

525
    avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
526
    /* compression type */
527
    avio_wl32(pb, enc->codec_tag);
528
    avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8);
529 530 531 532
    avio_wl32(pb, 0);
    avio_wl32(pb, 0);
    avio_wl32(pb, 0);
    avio_wl32(pb, 0);
533

534
    avio_write(pb, enc->extradata, enc->extradata_size);
535

536
    if (!for_asf && enc->extradata_size & 1)
537
        avio_w8(pb, 0);
538 539 540
}
#endif //CONFIG_MUXERS

541
#if CONFIG_DEMUXERS
542 543 544 545 546 547 548
/* We could be given one of the three possible structures here:
 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
 * is an expansion of the previous one with the fields added
 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
 * WAVEFORMATEX adds 'WORD  cbSize' and basically makes itself
 * an openended structure.
 */
549
int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
550 551 552
{
    int id;

553
    id = avio_rl16(pb);
554
    codec->codec_type = AVMEDIA_TYPE_AUDIO;
555 556 557 558
    codec->channels = avio_rl16(pb);
    codec->sample_rate = avio_rl32(pb);
    codec->bit_rate = avio_rl32(pb) * 8;
    codec->block_align = avio_rl16(pb);
559
    if (size == 14) {  /* We're dealing with plain vanilla WAVEFORMAT */
560
        codec->bits_per_coded_sample = 8;
561
    }else
562
        codec->bits_per_coded_sample = avio_rl16(pb);
563 564 565 566 567 568
    if (id == 0xFFFE) {
        codec->codec_tag = 0;
    } else {
        codec->codec_tag = id;
        codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
    }
569
    if (size >= 18) {  /* We're obviously dealing with WAVEFORMATEX */
570
        int cbSize = avio_rl16(pb); /* cbSize */
571 572 573
        size -= 18;
        cbSize = FFMIN(size, cbSize);
        if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
574
            ff_asf_guid subformat;
575 576
            codec->bits_per_coded_sample = avio_rl16(pb);
            codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
577 578 579 580 581 582 583 584 585
            ff_get_guid(pb, &subformat);
            if (!memcmp(subformat + 4, (const uint8_t[]){FF_MEDIASUBTYPE_BASE_GUID}, 12)) {
                codec->codec_tag = AV_RL32(subformat);
                codec->codec_id = ff_wav_codec_get_id(codec->codec_tag, codec->bits_per_coded_sample);
            } else {
                codec->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
                if (!codec->codec_id)
                    av_log(codec, AV_LOG_WARNING, "unknown subformat:"FF_PRI_GUID"\n", FF_ARG_GUID(subformat));
            }
586 587 588 589 590
            cbSize -= 22;
            size -= 22;
        }
        codec->extradata_size = cbSize;
        if (cbSize > 0) {
591
            av_free(codec->extradata);
592
            codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
593 594
            if (!codec->extradata)
                return AVERROR(ENOMEM);
595
            avio_read(pb, codec->extradata, codec->extradata_size);
596 597
            size -= cbSize;
        }
598 599

        /* It is possible for the chunk to contain garbage at the end */
600
        if (size > 0)
601
            avio_skip(pb, size);
602
    }
603 604 605 606 607
    if (codec->codec_id == CODEC_ID_AAC_LATM) {
        /* channels and sample_rate values are those prior to applying SBR and/or PS */
        codec->channels    = 0;
        codec->sample_rate = 0;
    }
608 609 610
    /* override bits_per_coded_sample for G.726 */
    if (codec->codec_id == CODEC_ID_ADPCM_G726)
        codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
611 612

    return 0;
613 614 615
}


616
enum CodecID ff_wav_codec_get_id(unsigned int tag, int bps)
617
{
618
    enum CodecID id;
619
    id = ff_codec_get_id(ff_codec_wav_tags, tag);
620 621 622 623 624 625 626 627 628
    if (id <= 0)
        return id;
    /* handle specific u8 codec */
    if (id == CODEC_ID_PCM_S16LE && bps == 8)
        id = CODEC_ID_PCM_U8;
    if (id == CODEC_ID_PCM_S16LE && bps == 24)
        id = CODEC_ID_PCM_S24LE;
    if (id == CODEC_ID_PCM_S16LE && bps == 32)
        id = CODEC_ID_PCM_S32LE;
629 630
    if (id == CODEC_ID_PCM_F32LE && bps == 64)
        id = CODEC_ID_PCM_F64LE;
631 632
    if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8)
        id = CODEC_ID_PCM_ZORK;
633 634
    return id;
}
635

636
int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
637 638
{
    int tag1;
639 640 641 642 643 644 645 646 647 648 649
    avio_rl32(pb); /* size */
    st->codec->width = avio_rl32(pb);
    st->codec->height = (int32_t)avio_rl32(pb);
    avio_rl16(pb); /* planes */
    st->codec->bits_per_coded_sample= avio_rl16(pb); /* depth */
    tag1 = avio_rl32(pb);
    avio_rl32(pb); /* ImageSize */
    avio_rl32(pb); /* XPelsPerMeter */
    avio_rl32(pb); /* YPelsPerMeter */
    avio_rl32(pb); /* ClrUsed */
    avio_rl32(pb); /* ClrImportant */
650 651
    return tag1;
}
652 653 654 655 656 657 658 659 660 661
#endif // CONFIG_DEMUXERS

void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
{
    int gcd;

    *au_ssize= stream->block_align;
    if(stream->frame_size && stream->sample_rate){
        *au_scale=stream->frame_size;
        *au_rate= stream->sample_rate;
662
    }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO ||
663
             stream->codec_type == AVMEDIA_TYPE_DATA ||
664
             stream->codec_type == AVMEDIA_TYPE_SUBTITLE){
665 666 667 668
        *au_scale= stream->time_base.num;
        *au_rate = stream->time_base.den;
    }else{
        *au_scale= stream->block_align ? stream->block_align*8 : 8;
669
        *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate;
670
    }
671
    gcd= av_gcd(*au_scale, *au_rate);
672 673 674
    *au_scale /= gcd;
    *au_rate /= gcd;
}
675 676 677 678

void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
{
    assert(sizeof(*g) == 16);
679 680
    if (avio_read(s, *g, sizeof(*g)) < (int)sizeof(*g))
        memset(*g, 0, sizeof(*g));
681
}
682 683 684 685 686 687 688 689 690 691

enum CodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
{
    int i;
    for (i = 0; guids[i].id != CODEC_ID_NONE; i++) {
        if (!ff_guidcmp(guids[i].guid, guid))
            return guids[i].id;
    }
    return CODEC_ID_NONE;
}
692

693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
int ff_read_riff_info(AVFormatContext *s, int64_t size)
{
    int64_t start, end, cur;
    AVIOContext *pb = s->pb;

    start = avio_tell(pb);
    end = start + size;

    while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
        uint32_t chunk_code;
        int64_t chunk_size;
        char key[5] = {0};
        char *value;

        chunk_code = avio_rl32(pb);
        chunk_size = avio_rl32(pb);
        if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
            av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
            return AVERROR_INVALIDDATA;
        }

        chunk_size += (chunk_size & 1);

        value = av_malloc(chunk_size + 1);
        if (!value) {
            av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
            return AVERROR(ENOMEM);
        }

        AV_WL32(key, chunk_code);

        if (avio_read(pb, value, chunk_size) != chunk_size) {
725
            av_freep(&value);
726 727 728 729 730 731 732 733 734 735 736
            av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
            return AVERROR_INVALIDDATA;
        }

        value[chunk_size] = 0;

        av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
    }

    return 0;
}