annotate wc3movie.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 4211f91f69b1
children 08cd1179a20d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
1 /*
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
2 * Wing Commander III Movie (.mve) File Demuxer
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
3 * Copyright (c) 2003 The ffmpeg Project
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
15 * Lesser General Public License for more details.
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
16 *
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
20 */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
21
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4201
diff changeset
23 * @file libavformat/wc3movie.c
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
24 * Wing Commander III Movie file demuxer
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
25 * by Mike Melanson (melanson@pcisys.net)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
26 * for more information on the WC3 .mve file format, visit:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
27 * http://www.pcisys.net/~melanson/codecs/
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
28 */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
29
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3908
diff changeset
30 #include "libavutil/intreadwrite.h"
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
31 #include "avformat.h"
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
32
386
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
33 #define FORM_TAG MKTAG('F', 'O', 'R', 'M')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
34 #define MOVE_TAG MKTAG('M', 'O', 'V', 'E')
2786
6050822262f6 1000l _reserved (found by checktree.sh)
michael
parents: 2771
diff changeset
35 #define PC__TAG MKTAG('_', 'P', 'C', '_')
386
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
36 #define SOND_TAG MKTAG('S', 'O', 'N', 'D')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
37 #define BNAM_TAG MKTAG('B', 'N', 'A', 'M')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
38 #define SIZE_TAG MKTAG('S', 'I', 'Z', 'E')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
39 #define PALT_TAG MKTAG('P', 'A', 'L', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
40 #define INDX_TAG MKTAG('I', 'N', 'D', 'X')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
41 #define BRCH_TAG MKTAG('B', 'R', 'C', 'H')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
42 #define SHOT_TAG MKTAG('S', 'H', 'O', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
43 #define VGA__TAG MKTAG('V', 'G', 'A', ' ')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
44 #define TEXT_TAG MKTAG('T', 'E', 'X', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
45 #define AUDI_TAG MKTAG('A', 'U', 'D', 'I')
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
46
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
47 /* video resolution unless otherwise specified */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
48 #define WC3_DEFAULT_WIDTH 320
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
49 #define WC3_DEFAULT_HEIGHT 165
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
50
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
51 /* always use the same PCM audio parameters */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
52 #define WC3_SAMPLE_RATE 22050
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
53 #define WC3_AUDIO_CHANNELS 1
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
54 #define WC3_AUDIO_BITS 16
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
55
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
56 /* nice, constant framerate */
3099
b74cbb146e2d fix wc3movie demuxer to conform to the PTS API
melanson
parents: 2786
diff changeset
57 #define WC3_FRAME_FPS 15
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
58
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
59 #define PALETTE_SIZE (256 * 3)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
60 #define PALETTE_COUNT 256
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
61
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
62 typedef struct Wc3DemuxContext {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
63 int width;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
64 int height;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
65 unsigned char *palettes;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
66 int palette_count;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
67 int64_t pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
68 int video_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
69 int audio_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
70
245
d8b6af80b1dd deploy palette control API
tmmm
parents: 243
diff changeset
71 AVPaletteControl palette_control;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
72
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
73 } Wc3DemuxContext;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
74
4853
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
75 /**
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
76 * palette lookup table that does gamma correction
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
77 *
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
78 * can be calculated by this formula:
4865
1273a2b9c32a Slightly improve/correct description of wc3_pal_lookup
reimar
parents: 4855
diff changeset
79 * for i between 0 and 251 inclusive:
1273a2b9c32a Slightly improve/correct description of wc3_pal_lookup
reimar
parents: 4855
diff changeset
80 * wc3_pal_lookup[i] = round(pow(i / 256.0, 0.8) * 256);
1273a2b9c32a Slightly improve/correct description of wc3_pal_lookup
reimar
parents: 4855
diff changeset
81 * values 252, 253, 254 and 255 are all 0xFD
4853
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
82 * calculating this at runtime should not cause any
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
83 * rounding issues, the maximum difference between
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
84 * the table values and the calculated doubles is
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
85 * about 0.497527
74342058fc9d Explain the purpose of the wc3_pal_lookup and the formula that was used to
reimar
parents: 4852
diff changeset
86 */
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
87 static const unsigned char wc3_pal_lookup[] = {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
88 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0E,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
89 0x10, 0x12, 0x13, 0x15, 0x16, 0x18, 0x19, 0x1A,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
90 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x23, 0x24, 0x25,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
91 0x27, 0x28, 0x29, 0x2A, 0x2C, 0x2D, 0x2E, 0x2F,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
92 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
93 0x3A, 0x3B, 0x3C, 0x3D, 0x3F, 0x40, 0x41, 0x42,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
94 0x43, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4A, 0x4B,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
95 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
96 0x54, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
97 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
98 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
99 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
100 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
101 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
102 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
103 0x8C, 0x8D, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
104 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x99,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
105 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
106 0xA2, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
107 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
108 0xB0, 0xB1, 0xB2, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
109 0xB7, 0xB8, 0xB9, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
110 0xBE, 0xBF, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
111 0xC5, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
112 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
113 0xD2, 0xD3, 0xD4, 0xD5, 0xD5, 0xD6, 0xD7, 0xD8,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
114 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
115 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
116 0xE6, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEB, 0xEC,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
117 0xED, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF1, 0xF2,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
118 0xF3, 0xF4, 0xF5, 0xF6, 0xF6, 0xF7, 0xF8, 0xF9,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
119 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
120 };
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
121
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
122
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
123 static int wc3_probe(AVProbeData *p)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
124 {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
125 if (p->buf_size < 12)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
126 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
127
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
128 if ((AV_RL32(&p->buf[0]) != FORM_TAG) ||
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
129 (AV_RL32(&p->buf[8]) != MOVE_TAG))
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
130 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
131
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
132 return AVPROBE_SCORE_MAX;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
133 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
134
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
135 static int wc3_read_header(AVFormatContext *s,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
136 AVFormatParameters *ap)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
137 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
138 Wc3DemuxContext *wc3 = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
139 ByteIOContext *pb = s->pb;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
140 unsigned int fourcc_tag;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
141 unsigned int size;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
142 AVStream *st;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
143 int ret = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
144 int current_palette = 0;
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
145 char *buffer;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
146 int i;
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
147 unsigned char rotate;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
148
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
149 /* default context members */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
150 wc3->width = WC3_DEFAULT_WIDTH;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
151 wc3->height = WC3_DEFAULT_HEIGHT;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
152 wc3->palettes = NULL;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
153 wc3->palette_count = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
154 wc3->pts = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
155 wc3->video_stream_index = wc3->audio_stream_index = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
156
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
157 /* skip the first 3 32-bit numbers */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
158 url_fseek(pb, 12, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
159
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
160 /* traverse through the chunks and load the header information before
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
161 * the first BRCH tag */
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
162 fourcc_tag = get_le32(pb);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
163 size = (get_be32(pb) + 1) & (~1);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
164
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
165 do {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
166 switch (fourcc_tag) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
167
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
168 case SOND_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
169 case INDX_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
170 /* SOND unknown, INDX unnecessary; ignore both */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
171 url_fseek(pb, size, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
172 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
173
2786
6050822262f6 1000l _reserved (found by checktree.sh)
michael
parents: 2771
diff changeset
174 case PC__TAG:
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
175 /* need the number of palettes */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
176 url_fseek(pb, 8, SEEK_CUR);
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
177 wc3->palette_count = get_le32(pb);
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
178 if((unsigned)wc3->palette_count >= UINT_MAX / PALETTE_SIZE){
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
179 wc3->palette_count= 0;
639
0b52743104ac integer overflows, heap corruption
michael
parents: 482
diff changeset
180 return -1;
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
181 }
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
182 wc3->palettes = av_malloc(wc3->palette_count * PALETTE_SIZE);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
183 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
184
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
185 case BNAM_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
186 /* load up the name */
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
187 buffer = av_malloc(size+1);
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
188 if (!buffer)
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
189 return AVERROR_NOMEM;
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
190 if ((ret = get_buffer(pb, buffer, size)) != size)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
191 return AVERROR(EIO);
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
192 buffer[size] = 0;
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
193 av_metadata_set2(&s->metadata, "title", buffer,
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 4865
diff changeset
194 AV_METADATA_DONT_STRDUP_VAL);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
195 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
196
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
197 case SIZE_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
198 /* video resolution override */
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
199 wc3->width = get_le32(pb);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
200 wc3->height = get_le32(pb);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
201 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
202
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
203 case PALT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
204 /* one of several palettes */
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
205 if ((unsigned)current_palette >= wc3->palette_count)
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
206 return AVERROR_INVALIDDATA;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
207 if ((ret = get_buffer(pb,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
208 &wc3->palettes[current_palette * PALETTE_SIZE],
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
209 PALETTE_SIZE)) != PALETTE_SIZE)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
210 return AVERROR(EIO);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
211
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
212 /* transform the current palette in place */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
213 for (i = current_palette * PALETTE_SIZE;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
214 i < (current_palette + 1) * PALETTE_SIZE; i++) {
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
215 /* rotate each palette component left by 2 and use the result
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
216 * as an index into the color component table */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
217 rotate = ((wc3->palettes[i] << 2) & 0xFF) |
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
218 ((wc3->palettes[i] >> 6) & 0xFF);
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
219 wc3->palettes[i] = wc3_pal_lookup[rotate];
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
220 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
221 current_palette++;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
222 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
223
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
224 default:
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
225 av_log(s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",
4855
adec0fc30104 Fix "unrecognized WC3 chunk" debug output which was broken r18444 due to sign expansion.
reimar
parents: 4854
diff changeset
226 (uint8_t)fourcc_tag, (uint8_t)(fourcc_tag >> 8), (uint8_t)(fourcc_tag >> 16), (uint8_t)(fourcc_tag >> 24),
adec0fc30104 Fix "unrecognized WC3 chunk" debug output which was broken r18444 due to sign expansion.
reimar
parents: 4854
diff changeset
227 (uint8_t)fourcc_tag, (uint8_t)(fourcc_tag >> 8), (uint8_t)(fourcc_tag >> 16), (uint8_t)(fourcc_tag >> 24));
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
228 return AVERROR_INVALIDDATA;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
229 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
230 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
231
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
232 fourcc_tag = get_le32(pb);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
233 /* chunk sizes are 16-bit aligned */
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
234 size = (get_be32(pb) + 1) & (~1);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
235 if (url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
236 return AVERROR(EIO);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
237
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
238 } while (fourcc_tag != BRCH_TAG);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
239
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
240 /* initialize the decoder streams */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
241 st = av_new_stream(s, 0);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
242 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2006
diff changeset
243 return AVERROR(ENOMEM);
3099
b74cbb146e2d fix wc3movie demuxer to conform to the PTS API
melanson
parents: 2786
diff changeset
244 av_set_pts_info(st, 33, 1, WC3_FRAME_FPS);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
245 wc3->video_stream_index = st->index;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5446
diff changeset
246 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
247 st->codec->codec_id = CODEC_ID_XAN_WC3;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
248 st->codec->codec_tag = 0; /* no fourcc */
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
249 st->codec->width = wc3->width;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
250 st->codec->height = wc3->height;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
251
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
252 /* palette considerations */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
253 st->codec->palctrl = &wc3->palette_control;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
254
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
255 st = av_new_stream(s, 0);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
256 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2006
diff changeset
257 return AVERROR(ENOMEM);
3099
b74cbb146e2d fix wc3movie demuxer to conform to the PTS API
melanson
parents: 2786
diff changeset
258 av_set_pts_info(st, 33, 1, WC3_FRAME_FPS);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
259 wc3->audio_stream_index = st->index;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5446
diff changeset
260 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
261 st->codec->codec_id = CODEC_ID_PCM_S16LE;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
262 st->codec->codec_tag = 1;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
263 st->codec->channels = WC3_AUDIO_CHANNELS;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
264 st->codec->bits_per_coded_sample = WC3_AUDIO_BITS;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
265 st->codec->sample_rate = WC3_SAMPLE_RATE;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
266 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate *
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
267 st->codec->bits_per_coded_sample;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
268 st->codec->block_align = WC3_AUDIO_BITS * WC3_AUDIO_CHANNELS;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
269
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
270 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
271 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
272
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
273 static int wc3_read_packet(AVFormatContext *s,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
274 AVPacket *pkt)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
275 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
276 Wc3DemuxContext *wc3 = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
277 ByteIOContext *pb = s->pb;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
278 unsigned int fourcc_tag;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
279 unsigned int size;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
280 int packet_read = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
281 int ret = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
282 unsigned char text[1024];
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
283 unsigned int palette_number;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
284 int i;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
285 unsigned char r, g, b;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
286 int base_palette_index;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
287
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
288 while (!packet_read) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
289
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
290 fourcc_tag = get_le32(pb);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
291 /* chunk sizes are 16-bit aligned */
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
292 size = (get_be32(pb) + 1) & (~1);
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
293 if (url_feof(pb))
4645
a9a2c60d0e84 Fix a condition that causes an infinite loop, but only when compiled with
melanson
parents: 4596
diff changeset
294 return AVERROR(EIO);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
295
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
296 switch (fourcc_tag) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
297
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
298 case BRCH_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
299 /* no-op */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
300 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
301
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
302 case SHOT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
303 /* load up new palette */
4852
ecf9f13948f1 Use get_le32/get_be32 in wc3movie demuxer instead of reading everything into
reimar
parents: 4645
diff changeset
304 palette_number = get_le32(pb);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
305 if (palette_number >= wc3->palette_count)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
306 return AVERROR_INVALIDDATA;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
307 base_palette_index = palette_number * PALETTE_COUNT * 3;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
308 for (i = 0; i < PALETTE_COUNT; i++) {
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
309 r = wc3->palettes[base_palette_index + i * 3 + 0];
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
310 g = wc3->palettes[base_palette_index + i * 3 + 1];
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
311 b = wc3->palettes[base_palette_index + i * 3 + 2];
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
312 wc3->palette_control.palette[i] = (r << 16) | (g << 8) | (b);
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
313 }
245
d8b6af80b1dd deploy palette control API
tmmm
parents: 243
diff changeset
314 wc3->palette_control.palette_changed = 1;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
315 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
316
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
317 case VGA__TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
318 /* send out video chunk */
775
c5077fdab490 AVPacket.pos
michael
parents: 643
diff changeset
319 ret= av_get_packet(pb, pkt, size);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
320 pkt->stream_index = wc3->video_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
321 pkt->pts = wc3->pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
322 packet_read = 1;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
323 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
324
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
325 case TEXT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
326 /* subtitle chunk */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
327 #if 0
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
328 url_fseek(pb, size, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
329 #else
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
330 if ((unsigned)size > sizeof(text) || (ret = get_buffer(pb, text, size)) != size)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
331 ret = AVERROR(EIO);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
332 else {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
333 int i = 0;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
334 av_log (s, AV_LOG_DEBUG, "Subtitle time!\n");
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
335 av_log (s, AV_LOG_DEBUG, " inglish: %s\n", &text[i + 1]);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
336 i += text[i] + 1;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
337 av_log (s, AV_LOG_DEBUG, " doytsch: %s\n", &text[i + 1]);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
338 i += text[i] + 1;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
339 av_log (s, AV_LOG_DEBUG, " fronsay: %s\n", &text[i + 1]);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
340 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
341 #endif
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
342 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
343
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
344 case AUDI_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
345 /* send out audio chunk */
775
c5077fdab490 AVPacket.pos
michael
parents: 643
diff changeset
346 ret= av_get_packet(pb, pkt, size);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
347 pkt->stream_index = wc3->audio_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
348 pkt->pts = wc3->pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
349
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
350 /* time to advance pts */
3099
b74cbb146e2d fix wc3movie demuxer to conform to the PTS API
melanson
parents: 2786
diff changeset
351 wc3->pts++;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
352
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
353 packet_read = 1;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
354 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
355
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
356 default:
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
357 av_log (s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",
4855
adec0fc30104 Fix "unrecognized WC3 chunk" debug output which was broken r18444 due to sign expansion.
reimar
parents: 4854
diff changeset
358 (uint8_t)fourcc_tag, (uint8_t)(fourcc_tag >> 8), (uint8_t)(fourcc_tag >> 16), (uint8_t)(fourcc_tag >> 24),
adec0fc30104 Fix "unrecognized WC3 chunk" debug output which was broken r18444 due to sign expansion.
reimar
parents: 4854
diff changeset
359 (uint8_t)fourcc_tag, (uint8_t)(fourcc_tag >> 8), (uint8_t)(fourcc_tag >> 16), (uint8_t)(fourcc_tag >> 24));
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
360 ret = AVERROR_INVALIDDATA;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
361 packet_read = 1;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
362 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
363 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
364 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
365
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
366 return ret;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
367 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
368
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
369 static int wc3_read_close(AVFormatContext *s)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
370 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
371 Wc3DemuxContext *wc3 = s->priv_data;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
372
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
373 av_free(wc3->palettes);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
374
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
375 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
376 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
377
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
378 AVInputFormat wc3_demuxer = {
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
379 "wc3movie",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3099
diff changeset
380 NULL_IF_CONFIG_SMALL("Wing Commander III movie format"),
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
381 sizeof(Wc3DemuxContext),
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
382 wc3_probe,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
383 wc3_read_header,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
384 wc3_read_packet,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
385 wc3_read_close,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
386 };