annotate wc3movie.c @ 1407:fb4bf3858f77 libavformat

Make read_packet fail is the v4l2 driver returns an unexpected frame size (driver's bug? If not, we will have to support this in some way)
author lucabe
date Sun, 22 Oct 2006 09:56:08 +0000
parents 0899bfe4105c
children a782462e2497
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 /**
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
23 * @file wc3movie.c
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
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
30 #include "avformat.h"
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
31
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
32 #define WC3_PREAMBLE_SIZE 8
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
33
386
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
34 #define FORM_TAG MKTAG('F', 'O', 'R', 'M')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
35 #define MOVE_TAG MKTAG('M', 'O', 'V', 'E')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
36 #define _PC__TAG MKTAG('_', 'P', 'C', '_')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
37 #define SOND_TAG MKTAG('S', 'O', 'N', 'D')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
38 #define BNAM_TAG MKTAG('B', 'N', 'A', 'M')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
39 #define SIZE_TAG MKTAG('S', 'I', 'Z', 'E')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
40 #define PALT_TAG MKTAG('P', 'A', 'L', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
41 #define INDX_TAG MKTAG('I', 'N', 'D', 'X')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
42 #define BRCH_TAG MKTAG('B', 'R', 'C', 'H')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
43 #define SHOT_TAG MKTAG('S', 'H', 'O', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
44 #define VGA__TAG MKTAG('V', 'G', 'A', ' ')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
45 #define TEXT_TAG MKTAG('T', 'E', 'X', 'T')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
46 #define AUDI_TAG MKTAG('A', 'U', 'D', 'I')
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
47
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
48 /* video resolution unless otherwise specified */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
49 #define WC3_DEFAULT_WIDTH 320
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
50 #define WC3_DEFAULT_HEIGHT 165
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
51
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
52 /* always use the same PCM audio parameters */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
53 #define WC3_SAMPLE_RATE 22050
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
54 #define WC3_AUDIO_CHANNELS 1
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
55 #define WC3_AUDIO_BITS 16
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
56
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
57 /* nice, constant framerate */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
58 #define WC3_FRAME_PTS_INC (90000 / 15)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
59
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
60 #define PALETTE_SIZE (256 * 3)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
61 #define PALETTE_COUNT 256
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
62
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
63 typedef struct Wc3DemuxContext {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
64 int width;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
65 int height;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
66 unsigned char *palettes;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
67 int palette_count;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
68 int64_t pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
69 int video_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
70 int audio_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
71
245
d8b6af80b1dd deploy palette control API
tmmm
parents: 243
diff changeset
72 AVPaletteControl palette_control;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
73
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
74 } Wc3DemuxContext;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
75
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
76 /* bizarre palette lookup table */
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
77 static const unsigned char wc3_pal_lookup[] = {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
78 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0E,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
79 0x10, 0x12, 0x13, 0x15, 0x16, 0x18, 0x19, 0x1A,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
80 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x23, 0x24, 0x25,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
81 0x27, 0x28, 0x29, 0x2A, 0x2C, 0x2D, 0x2E, 0x2F,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
82 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
83 0x3A, 0x3B, 0x3C, 0x3D, 0x3F, 0x40, 0x41, 0x42,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
84 0x43, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4A, 0x4B,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
85 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
86 0x54, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
87 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
88 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
89 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
90 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
91 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
92 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
93 0x8C, 0x8D, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
94 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x99,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
95 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
96 0xA2, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
97 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
98 0xB0, 0xB1, 0xB2, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
99 0xB7, 0xB8, 0xB9, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
100 0xBE, 0xBF, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
101 0xC5, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
102 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
103 0xD2, 0xD3, 0xD4, 0xD5, 0xD5, 0xD6, 0xD7, 0xD8,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
104 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
105 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
106 0xE6, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEB, 0xEC,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
107 0xED, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF1, 0xF2,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
108 0xF3, 0xF4, 0xF5, 0xF6, 0xF6, 0xF7, 0xF8, 0xF9,
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
109 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
110 };
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
111
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
112
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
113 static int wc3_probe(AVProbeData *p)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
114 {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
115 if (p->buf_size < 12)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
116 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
117
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
118 if ((LE_32(&p->buf[0]) != FORM_TAG) ||
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
119 (LE_32(&p->buf[8]) != MOVE_TAG))
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
120 return 0;
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 return AVPROBE_SCORE_MAX;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
123 }
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 static int wc3_read_header(AVFormatContext *s,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
126 AVFormatParameters *ap)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
127 {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
128 Wc3DemuxContext *wc3 = (Wc3DemuxContext *)s->priv_data;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
129 ByteIOContext *pb = &s->pb;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
130 unsigned int fourcc_tag;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
131 unsigned int size;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
132 AVStream *st;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
133 unsigned char preamble[WC3_PREAMBLE_SIZE];
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
134 int ret = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
135 int current_palette = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
136 int bytes_to_read;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
137 int i;
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
138 unsigned char rotate;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
139
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
140 /* default context members */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
141 wc3->width = WC3_DEFAULT_WIDTH;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
142 wc3->height = WC3_DEFAULT_HEIGHT;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
143 wc3->palettes = NULL;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
144 wc3->palette_count = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
145 wc3->pts = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
146 wc3->video_stream_index = wc3->audio_stream_index = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
147
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
148 /* skip the first 3 32-bit numbers */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
149 url_fseek(pb, 12, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
150
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
151 /* traverse through the chunks and load the header information before
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
152 * the first BRCH tag */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
153 if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
154 WC3_PREAMBLE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
155 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
156 fourcc_tag = LE_32(&preamble[0]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
157 size = (BE_32(&preamble[4]) + 1) & (~1);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
158
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
159 do {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
160 switch (fourcc_tag) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
161
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
162 case SOND_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
163 case INDX_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
164 /* SOND unknown, INDX unnecessary; ignore both */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
165 url_fseek(pb, size, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
166 break;
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 _PC__TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
169 /* need the number of palettes */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
170 url_fseek(pb, 8, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
171 if ((ret = get_buffer(pb, preamble, 4)) != 4)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
172 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
173 wc3->palette_count = LE_32(&preamble[0]);
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
174 if((unsigned)wc3->palette_count >= UINT_MAX / PALETTE_SIZE){
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
175 wc3->palette_count= 0;
639
0b52743104ac integer overflows, heap corruption
michael
parents: 482
diff changeset
176 return -1;
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
177 }
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
178 wc3->palettes = av_malloc(wc3->palette_count * PALETTE_SIZE);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
179 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
180
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
181 case BNAM_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
182 /* load up the name */
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
183 if ((unsigned)size < 512)
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
184 bytes_to_read = size;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
185 else
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
186 bytes_to_read = 512;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
187 if ((ret = get_buffer(pb, s->title, bytes_to_read)) != bytes_to_read)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
188 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
189 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
190
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
191 case SIZE_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
192 /* video resolution override */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
193 if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
194 WC3_PREAMBLE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
195 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
196 wc3->width = LE_32(&preamble[0]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
197 wc3->height = LE_32(&preamble[4]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
198 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
199
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
200 case PALT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
201 /* one of several palettes */
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
202 if ((unsigned)current_palette >= wc3->palette_count)
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
203 return AVERROR_INVALIDDATA;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
204 if ((ret = get_buffer(pb,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
205 &wc3->palettes[current_palette * PALETTE_SIZE],
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
206 PALETTE_SIZE)) != PALETTE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
207 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
208
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
209 /* transform the current palette in place */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
210 for (i = current_palette * PALETTE_SIZE;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
211 i < (current_palette + 1) * PALETTE_SIZE; i++) {
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
212 /* 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
213 * as an index into the color component table */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
214 rotate = ((wc3->palettes[i] << 2) & 0xFF) |
243
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
215 ((wc3->palettes[i] >> 6) & 0xFF);
a315234e11eb forgot to apply the palette component lookup table
tmmm
parents: 225
diff changeset
216 wc3->palettes[i] = wc3_pal_lookup[rotate];
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
217 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
218 current_palette++;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
219 break;
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 default:
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
222 av_log(s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
223 preamble[0], preamble[1], preamble[2], preamble[3],
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
224 preamble[0], preamble[1], preamble[2], preamble[3]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
225 return AVERROR_INVALIDDATA;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
226 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
227 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
228
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
229 if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
230 WC3_PREAMBLE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
231 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
232 fourcc_tag = LE_32(&preamble[0]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
233 /* chunk sizes are 16-bit aligned */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
234 size = (BE_32(&preamble[4]) + 1) & (~1);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
235
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
236 } while (fourcc_tag != BRCH_TAG);
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 /* initialize the decoder streams */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
239 st = av_new_stream(s, 0);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
240 if (!st)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
241 return AVERROR_NOMEM;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 386
diff changeset
242 av_set_pts_info(st, 33, 1, 90000);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
243 wc3->video_stream_index = st->index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
244 st->codec->codec_type = CODEC_TYPE_VIDEO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
245 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
246 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
247 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
248 st->codec->height = wc3->height;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
249
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
250 /* 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
251 st->codec->palctrl = &wc3->palette_control;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
252
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
253 st = av_new_stream(s, 0);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
254 if (!st)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
255 return AVERROR_NOMEM;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 386
diff changeset
256 av_set_pts_info(st, 33, 1, 90000);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
257 wc3->audio_stream_index = st->index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
258 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
259 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
260 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
261 st->codec->channels = WC3_AUDIO_CHANNELS;
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->bits_per_sample = WC3_AUDIO_BITS;
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->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
264 st->codec->bit_rate = st->codec->channels * st->codec->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
265 st->codec->bits_per_sample;
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->block_align = WC3_AUDIO_BITS * WC3_AUDIO_CHANNELS;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
267
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
268 return 0;
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
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
271 static int wc3_read_packet(AVFormatContext *s,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
272 AVPacket *pkt)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
273 {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
274 Wc3DemuxContext *wc3 = (Wc3DemuxContext *)s->priv_data;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
275 ByteIOContext *pb = &s->pb;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
276 unsigned int fourcc_tag;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
277 unsigned int size;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
278 int packet_read = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
279 int ret = 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
280 unsigned char preamble[WC3_PREAMBLE_SIZE];
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
281 unsigned char text[1024];
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
282 unsigned int palette_number;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
283 int i;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
284 unsigned char r, g, b;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
285 int base_palette_index;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
286
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
287 while (!packet_read) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
288
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
289 /* get the next chunk preamble */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
290 if ((ret = get_buffer(pb, preamble, WC3_PREAMBLE_SIZE)) !=
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
291 WC3_PREAMBLE_SIZE)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
292 ret = AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
293
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
294 fourcc_tag = LE_32(&preamble[0]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
295 /* chunk sizes are 16-bit aligned */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
296 size = (BE_32(&preamble[4]) + 1) & (~1);
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 switch (fourcc_tag) {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
299
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
300 case BRCH_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
301 /* no-op */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
302 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
303
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
304 case SHOT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
305 /* load up new palette */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
306 if ((ret = get_buffer(pb, preamble, 4)) != 4)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
307 return AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
308 palette_number = LE_32(&preamble[0]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
309 if (palette_number >= wc3->palette_count)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
310 return AVERROR_INVALIDDATA;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
311 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
312 for (i = 0; i < PALETTE_COUNT; i++) {
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 245
diff changeset
313 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
314 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
315 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
316 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
317 }
245
d8b6af80b1dd deploy palette control API
tmmm
parents: 243
diff changeset
318 wc3->palette_control.palette_changed = 1;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
319 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
320
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
321 case VGA__TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
322 /* send out video chunk */
775
c5077fdab490 AVPacket.pos
michael
parents: 643
diff changeset
323 ret= av_get_packet(pb, pkt, size);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
324 pkt->stream_index = wc3->video_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
325 pkt->pts = wc3->pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
326 if (ret != size)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
327 ret = AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
328 packet_read = 1;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
329 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
330
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
331 case TEXT_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
332 /* subtitle chunk */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
333 #if 0
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
334 url_fseek(pb, size, SEEK_CUR);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
335 #else
643
253b5292946a various security fixes and precautionary checks
michael
parents: 639
diff changeset
336 if ((unsigned)size > sizeof(text) || (ret = get_buffer(pb, text, size)) != size)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
337 ret = AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
338 else {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
339 int i = 0;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
340 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
341 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
342 i += text[i] + 1;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
343 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
344 i += text[i] + 1;
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 295
diff changeset
345 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
346 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
347 #endif
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
348 break;
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 case AUDI_TAG:
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
351 /* send out audio chunk */
775
c5077fdab490 AVPacket.pos
michael
parents: 643
diff changeset
352 ret= av_get_packet(pb, pkt, size);
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
353 pkt->stream_index = wc3->audio_stream_index;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
354 pkt->pts = wc3->pts;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
355 if (ret != size)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 462
diff changeset
356 ret = AVERROR_IO;
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
357
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
358 /* time to advance pts */
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
359 wc3->pts += WC3_FRAME_PTS_INC;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
360
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 default:
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
365 av_log (s, AV_LOG_ERROR, " unrecognized WC3 chunk: %c%c%c%c (0x%02X%02X%02X%02X)\n",
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
366 preamble[0], preamble[1], preamble[2], preamble[3],
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
367 preamble[0], preamble[1], preamble[2], preamble[3]);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
368 ret = AVERROR_INVALIDDATA;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
369 packet_read = 1;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
370 break;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
371 }
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
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
374 return ret;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
375 }
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 static int wc3_read_close(AVFormatContext *s)
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
378 {
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
379 Wc3DemuxContext *wc3 = (Wc3DemuxContext *)s->priv_data;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
380
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
381 av_free(wc3->palettes);
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
382
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
383 return 0;
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
384 }
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
385
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
386 AVInputFormat wc3_demuxer = {
225
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
387 "wc3movie",
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
388 "Wing Commander III movie format",
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
389 sizeof(Wc3DemuxContext),
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
390 wc3_probe,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
391 wc3_read_header,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
392 wc3_read_packet,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
393 wc3_read_close,
d0332f4362b6 demuxer for custom Wing Commander III movie (.mve) files
tmmm
parents:
diff changeset
394 };