annotate nsvdec.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents e421492a6e27
children 1d3d17de20ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1408
diff changeset
2 * NSV demuxer
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
3 * Copyright (c) 2004 The FFmpeg Project.
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1305
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1305
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1305
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
89a09ede50ad First implementation of nsv demuxer.
mmu_man
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: 1305
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1305
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
15 * Lesser General Public License for more details.
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
16 *
89a09ede50ad First implementation of nsv demuxer.
mmu_man
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: 1305
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
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
20 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
21 #include "avformat.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1169
diff changeset
22 #include "riff.h"
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
23
1408
9ce44c5f6fee disable annoying debug messages
bcoudurier
parents: 1358
diff changeset
24 //#define DEBUG
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
25 //#define DEBUG_DUMP_INDEX // XXX dumbdriving-271.nsv breaks with it commented!!
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
26 //#define DEBUG_SEEK
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
27 #define CHECK_SUBSEQUENT_NSVS
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
28 //#define DISABLE_AUDIO
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
29
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
30 /* max bytes to crawl for trying to resync
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
31 * stupid streaming servers don't start at chunk boundaries...
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
32 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
33 #define NSV_MAX_RESYNC (500*1024)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
34 #define NSV_MAX_RESYNC_TRIES 300
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
35
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
36 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
37 * First version by Francois Revol - revol@free.fr
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
38 * References:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
39 * (1) http://www.multimedia.cx/nsv-format.txt
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
40 * seems someone came to the same conclusions as me, and updated it:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
41 * (2) http://www.stud.ktu.lt/~vitslav/nsv/nsv-format.txt
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
42 * http://www.stud.ktu.lt/~vitslav/nsv/
1430
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
43 * official docs
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
44 * (3) http://ultravox.aol.com/NSVFormat.rtf
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
45 * Sample files:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
46 * (S1) http://www.nullsoft.com/nsv/samples/
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
47 * http://www.nullsoft.com/nsv/samples/faster.nsv
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
48 * http://streamripper.sourceforge.net/openbb/read.php?TID=492&page=4
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
49 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
50
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
51 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
52 * notes on the header (Francois Revol):
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
53 *
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
54 * It is followed by strings, then a table, but nothing tells
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
55 * where the table begins according to (1). After checking faster.nsv,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
56 * I believe NVSf[16-19] gives the size of the strings data
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
57 * (that is the offset of the data table after the header).
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
58 * After checking all samples from (S1) all confirms this.
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
59 *
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
60 * Then, about NSVf[12-15], faster.nsf has 179700. When veiwing it in VLC,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
61 * I noticed there was about 1 NVSs chunk/s, so I ran
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
62 * strings faster.nsv | grep NSVs | wc -l
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
63 * which gave me 180. That leads me to think that NSVf[12-15] might be the
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
64 * file length in milliseconds.
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
65 * Let's try that:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
66 * for f in *.nsv; do HTIME="$(od -t x4 "$f" | head -1 | sed 's/.* //')"; echo "'$f' $((0x$HTIME))s = $((0x$HTIME/1000/60)):$((0x$HTIME/1000%60))"; done
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
67 * except for nstrailer (which doesn't have an NSVf header), it repports correct time.
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
68 *
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
69 * nsvtrailer.nsv (S1) does not have any NSVf header, only NSVs chunks,
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
70 * so the header seems to not be mandatory. (for streaming).
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
71 *
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
72 * index slice duration check (excepts nsvtrailer.nsv):
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
73 * for f in [^n]*.nsv; do DUR="$(ffmpeg -i "$f" 2>/dev/null | grep 'NSVf duration' | cut -d ' ' -f 4)"; IC="$(ffmpeg -i "$f" 2>/dev/null | grep 'INDEX ENTRIES' | cut -d ' ' -f 2)"; echo "duration $DUR, slite time $(($DUR/$IC))"; done
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
74 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
75
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
76 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
77 * TODO:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
78 * - handle timestamps !!!
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
79 * - use index
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
80 * - mime-type in probe()
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
81 * - seek
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
82 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
83
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
84 #ifdef DEBUG
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
85 #define PRINT(_v) printf _v
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
86 #else
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
87 #define PRINT(_v)
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
88 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
89
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
90 #if 0
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
91 struct NSVf_header {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
92 uint32_t chunk_tag; /* 'NSVf' */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
93 uint32_t chunk_size;
2164
3804e39efbfd misc spelling fixes
diego
parents: 2023
diff changeset
94 uint32_t file_size; /* max 4GB ??? no one learns anything it seems :^) */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
95 uint32_t file_length; //unknown1; /* what about MSB of file_size ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
96 uint32_t info_strings_size; /* size of the info strings */ //unknown2;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
97 uint32_t table_entries;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
98 uint32_t table_entries_used; /* the left ones should be -1 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
99 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
100
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
101 struct NSVs_header {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
102 uint32_t chunk_tag; /* 'NSVs' */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
103 uint32_t v4cc; /* or 'NONE' */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
104 uint32_t a4cc; /* or 'NONE' */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
105 uint16_t vwidth; /* assert(vwidth%16==0) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
106 uint16_t vheight; /* assert(vheight%16==0) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
107 uint8_t framerate; /* value = (framerate&0x80)?frtable[frameratex0x7f]:framerate */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
108 uint16_t unknown;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
109 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
110
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
111 struct nsv_avchunk_header {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
112 uint8_t vchunk_size_lsb;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
113 uint16_t vchunk_size_msb; /* value = (vchunk_size_msb << 4) | (vchunk_size_lsb >> 4) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
114 uint16_t achunk_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
115 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
116
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
117 struct nsv_pcm_header {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
118 uint8_t bits_per_sample;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
119 uint8_t channel_count;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
120 uint16_t sample_rate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
121 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
122 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
123
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
124 /* variation from avi.h */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
125 /*typedef struct CodecTag {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
126 int id;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
127 unsigned int tag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
128 } CodecTag;*/
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
129
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
130 /* tags */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
131
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
132 #define T_NSVF MKTAG('N', 'S', 'V', 'f') /* file header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
133 #define T_NSVS MKTAG('N', 'S', 'V', 's') /* chunk header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
134 #define T_TOC2 MKTAG('T', 'O', 'C', '2') /* extra index marker */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
135 #define T_NONE MKTAG('N', 'O', 'N', 'E') /* null a/v 4CC */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
136 #define T_SUBT MKTAG('S', 'U', 'B', 'T') /* subtitle aux data */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
137 #define T_ASYN MKTAG('A', 'S', 'Y', 'N') /* async a/v aux marker */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
138 #define T_KEYF MKTAG('K', 'E', 'Y', 'F') /* video keyframe aux marker (addition) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
139
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
140 #define TB_NSVF MKBETAG('N', 'S', 'V', 'f')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
141 #define TB_NSVS MKBETAG('N', 'S', 'V', 's')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
142
3365
19bd4caf27a9 consistency cosmetics: indices --> indexes
diego
parents: 2771
diff changeset
143 /* hardcoded stream indexes */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
144 #define NSV_ST_VIDEO 0
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
145 #define NSV_ST_AUDIO 1
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
146 #define NSV_ST_SUBT 2
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
147
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
148 enum NSVStatus {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
149 NSV_UNSYNC,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
150 NSV_FOUND_NSVF,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
151 NSV_HAS_READ_NSVF,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
152 NSV_FOUND_NSVS,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
153 NSV_HAS_READ_NSVS,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
154 NSV_FOUND_BEEF,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
155 NSV_GOT_VIDEO,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
156 NSV_GOT_AUDIO,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
157 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
158
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
159 typedef struct NSVStream {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
160 int frame_offset; /* current frame (video) or byte (audio) counter
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
161 (used to compute the pts) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
162 int scale;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
163 int rate;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
164 int sample_size; /* audio only data */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
165 int start;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
166
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
167 int new_frame_offset; /* temporary storage (used during seek) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
168 int cum_len; /* temporary storage (used during seek) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
169 } NSVStream;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
170
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
171 typedef struct {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
172 int base_offset;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
173 int NSVf_end;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
174 uint32_t *nsvf_index_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
175 int index_entries;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
176 enum NSVStatus state;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
177 AVPacket ahead[2]; /* [v, a] if .data is !NULL there is something */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
178 /* cached */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
179 int64_t duration;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
180 uint32_t vtag, atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
181 uint16_t vwidth, vheight;
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
182 int16_t avsync;
3586
e421492a6e27 Try to fix FATE after my time_base simplification change.
michael
parents: 3424
diff changeset
183 AVRational framerate;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
184 //DVDemuxContext* dv_demux;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
185 } NSVContext;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
186
1677
2a85c82b8538 add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents: 1593
diff changeset
187 static const AVCodecTag nsv_codec_video_tags[] = {
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
188 { CODEC_ID_VP3, MKTAG('V', 'P', '3', ' ') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
189 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
190 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
1305
541f4aa12efc VP5 and VP6 video decoder
aurel
parents: 1172
diff changeset
191 { CODEC_ID_VP5, MKTAG('V', 'P', '5', ' ') },
541f4aa12efc VP5 and VP6 video decoder
aurel
parents: 1172
diff changeset
192 { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
1593
6f13826a5037 Add support for VP60 and VP61.
aurel
parents: 1430
diff changeset
193 { CODEC_ID_VP6, MKTAG('V', 'P', '6', ' ') },
6f13826a5037 Add support for VP60 and VP61.
aurel
parents: 1430
diff changeset
194 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
6f13826a5037 Add support for VP60 and VP61.
aurel
parents: 1430
diff changeset
195 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
1305
541f4aa12efc VP5 and VP6 video decoder
aurel
parents: 1172
diff changeset
196 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
197 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
198 { CODEC_ID_VP4, MKTAG('V', 'P', '4', ' ') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
199 { CODEC_ID_VP4, MKTAG('V', 'P', '4', '0') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
200 */
2164
3804e39efbfd misc spelling fixes
diego
parents: 2023
diff changeset
201 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') }, /* cf sample xvid decoder from nsv_codec_sdk.zip */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
202 { CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', '3') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
203 { 0, 0 },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
204 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
205
1677
2a85c82b8538 add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents: 1593
diff changeset
206 static const AVCodecTag nsv_codec_audio_tags[] = {
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
207 { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
208 { CODEC_ID_AAC, MKTAG('A', 'A', 'C', ' ') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
209 { CODEC_ID_AAC, MKTAG('A', 'A', 'C', 'P') }, /* _CUTTED__MUXED_2 Heads - Out Of The City.nsv */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
210 { CODEC_ID_PCM_U16LE, MKTAG('P', 'C', 'M', ' ') },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
211 { 0, 0 },
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
212 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
213
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
214 //static int nsv_load_index(AVFormatContext *s);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
215 static int nsv_read_chunk(AVFormatContext *s, int fill_header);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
216
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
217 #ifdef DEBUG
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
218 static void print_tag(const char *str, unsigned int tag, int size)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
219 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
220 printf("%s: tag=%c%c%c%c\n",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
221 str, tag & 0xff,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
222 (tag >> 8) & 0xff,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
223 (tag >> 16) & 0xff,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
224 (tag >> 24) & 0xff);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
225 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
226 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
227
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
228 /* try to find something we recognize, and set the state accordingly */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
229 static int nsv_resync(AVFormatContext *s)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
230 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
231 NSVContext *nsv = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2567
diff changeset
232 ByteIOContext *pb = s->pb;
595
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
233 uint32_t v = 0;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
234 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
235
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
236 PRINT(("%s(), offset = %"PRId64", state = %d\n", __FUNCTION__, url_ftell(pb), nsv->state));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
237
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
238 //nsv->state = NSV_UNSYNC;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
239
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
240 for (i = 0; i < NSV_MAX_RESYNC; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
241 if (url_feof(pb)) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
242 PRINT(("NSV EOF\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
243 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
244 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
245 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
246 v <<= 8;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
247 v |= get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
248 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
249 if (i < 8) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
250 PRINT(("NSV resync: [%d] = %02x\n", i, v & 0x0FF));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
251 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
252 */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
253
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
254 if ((v & 0x0000ffff) == 0xefbe) { /* BEEF */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
255 PRINT(("NSV resynced on BEEF after %d bytes\n", i+1));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
256 nsv->state = NSV_FOUND_BEEF;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
257 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
258 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
259 /* we read as big endian, thus the MK*BE* */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
260 if (v == TB_NSVF) { /* NSVf */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
261 PRINT(("NSV resynced on NSVf after %d bytes\n", i+1));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
262 nsv->state = NSV_FOUND_NSVF;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
263 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
264 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
265 if (v == MKBETAG('N', 'S', 'V', 's')) { /* NSVs */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
266 PRINT(("NSV resynced on NSVs after %d bytes\n", i+1));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
267 nsv->state = NSV_FOUND_NSVS;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
268 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
269 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
270
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
271 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
272 PRINT(("NSV sync lost\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
273 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
274 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
275
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
276 static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
277 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
278 NSVContext *nsv = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2567
diff changeset
279 ByteIOContext *pb = s->pb;
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 639
diff changeset
280 unsigned int file_size, size;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
281 int64_t duration;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
282 int strings_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
283 int table_entries;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
284 int table_entries_used;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
285
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
286 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
287
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
288 nsv->state = NSV_UNSYNC; /* in case we fail */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
289
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
290 size = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
291 if (size < 28)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
292 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
293 nsv->NSVf_end = size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
294
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
295 //s->file_size = (uint32_t)get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
296 file_size = (uint32_t)get_le32(pb);
838
128838bc4bb6 kill a bunch of compiler warnings
mru
parents: 820
diff changeset
297 PRINT(("NSV NSVf chunk_size %u\n", size));
128838bc4bb6 kill a bunch of compiler warnings
mru
parents: 820
diff changeset
298 PRINT(("NSV NSVf file_size %u\n", file_size));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
299
743
af4e24d6310c switch to native time bases
michael
parents: 742
diff changeset
300 nsv->duration = duration = get_le32(pb); /* in ms */
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
301 PRINT(("NSV NSVf duration %"PRId64" ms\n", duration));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
302 // XXX: store it in AVStreams
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
303
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
304 strings_size = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
305 table_entries = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
306 table_entries_used = get_le32(pb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
307 PRINT(("NSV NSVf info-strings size: %d, table entries: %d, bis %d\n",
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
308 strings_size, table_entries, table_entries_used));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
309 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
310 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
311
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
312 PRINT(("NSV got header; filepos %"PRId64"\n", url_ftell(pb)));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
313
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
314 if (strings_size > 0) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
315 char *strings; /* last byte will be '\0' to play safe with str*() */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
316 char *p, *endp;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
317 char *token, *value;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
318 char quote;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
319
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
320 p = strings = av_mallocz(strings_size + 1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
321 endp = strings + strings_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
322 get_buffer(pb, strings, strings_size);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
323 while (p < endp) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
324 while (*p == ' ')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
325 p++; /* strip out spaces */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
326 if (p >= endp-2)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
327 break;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
328 token = p;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
329 p = strchr(p, '=');
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
330 if (!p || p >= endp-2)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
331 break;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
332 *p++ = '\0';
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
333 quote = *p++;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
334 value = p;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
335 p = strchr(p, quote);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
336 if (!p || p >= endp)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
337 break;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
338 *p++ = '\0';
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
339 PRINT(("NSV NSVf INFO: %s='%s'\n", token, value));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
340 if (!strcmp(token, "ASPECT")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
341 /* don't care */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
342 } else if (!strcmp(token, "CREATOR") || !strcmp(token, "Author")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
343 strncpy(s->author, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
344 } else if (!strcmp(token, "Copyright")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
345 strncpy(s->copyright, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
346 } else if (!strcmp(token, "TITLE") || !strcmp(token, "Title")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
347 strncpy(s->title, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
348 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
349 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
350 av_free(strings);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
351 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
352 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
353 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
354
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
355 PRINT(("NSV got infos; filepos %"PRId64"\n", url_ftell(pb)));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
356
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
357 if (table_entries_used > 0) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
358 nsv->index_entries = table_entries_used;
639
0b52743104ac integer overflows, heap corruption
michael
parents: 601
diff changeset
359 if((unsigned)table_entries >= UINT_MAX / sizeof(uint32_t))
0b52743104ac integer overflows, heap corruption
michael
parents: 601
diff changeset
360 return -1;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
361 nsv->nsvf_index_data = av_malloc(table_entries * sizeof(uint32_t));
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
362 #warning "FIXME: Byteswap buffer as needed"
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
363 get_buffer(pb, (unsigned char *)nsv->nsvf_index_data, table_entries * sizeof(uint32_t));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
364 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
365
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 838
diff changeset
366 PRINT(("NSV got index; filepos %"PRId64"\n", url_ftell(pb)));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
367
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
368 #ifdef DEBUG_DUMP_INDEX
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
369 #define V(v) ((v<0x20 || v > 127)?'.':v)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
370 /* dump index */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
371 PRINT(("NSV %d INDEX ENTRIES:\n", table_entries));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
372 PRINT(("NSV [dataoffset][fileoffset]\n", table_entries));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
373 for (i = 0; i < table_entries; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
374 unsigned char b[8];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
375 url_fseek(pb, size + nsv->nsvf_index_data[i], SEEK_SET);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
376 get_buffer(pb, b, 8);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
377 PRINT(("NSV [0x%08lx][0x%08lx]: %02x %02x %02x %02x %02x %02x %02x %02x"
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
378 "%c%c%c%c%c%c%c%c\n",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
379 nsv->nsvf_index_data[i], size + nsv->nsvf_index_data[i],
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
380 b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7],
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
381 V(b[0]), V(b[1]), V(b[2]), V(b[3]), V(b[4]), V(b[5]), V(b[6]), V(b[7]) ));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
382 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
383 //url_fseek(pb, size, SEEK_SET); /* go back to end of header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
384 #undef V
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
385 #endif
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
386
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
387 url_fseek(pb, nsv->base_offset + size, SEEK_SET); /* required for dumbdriving-271.nsv (2 extra bytes) */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
388
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
389 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
390 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
391 nsv->state = NSV_HAS_READ_NSVF;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
392 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
393 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
394
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
395 static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
396 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
397 NSVContext *nsv = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2567
diff changeset
398 ByteIOContext *pb = s->pb;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
399 uint32_t vtag, atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
400 uint16_t vwidth, vheight;
742
21c1ae78f041 fix useless framerate messup
michael
parents: 683
diff changeset
401 AVRational framerate;
21c1ae78f041 fix useless framerate messup
michael
parents: 683
diff changeset
402 int i;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
403 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
404 NSVStream *nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
405 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
406
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
407 vtag = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
408 atag = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
409 vwidth = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
410 vheight = get_le16(pb);
742
21c1ae78f041 fix useless framerate messup
michael
parents: 683
diff changeset
411 i = get_byte(pb);
1430
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
412
742
21c1ae78f041 fix useless framerate messup
michael
parents: 683
diff changeset
413 PRINT(("NSV NSVs framerate code %2x\n", i));
1430
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
414 if(i&0x80) { /* odd way of giving native framerates from docs */
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
415 int t=(i & 0x7F)>>2;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
416 if(t<16) framerate = (AVRational){1, t+1};
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
417 else framerate = (AVRational){t-15, 1};
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
418
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
419 if(i&1){
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
420 framerate.num *= 1000;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
421 framerate.den *= 1001;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
422 }
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
423
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
424 if((i&3)==3) framerate.num *= 24;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
425 else if((i&3)==2) framerate.num *= 25;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
426 else framerate.num *= 30;
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
427 }
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
428 else
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
429 framerate= (AVRational){i, 1};
f72de3879e6c add support for all framerates specified by the standard
gpoirier
parents: 1429
diff changeset
430
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
431 nsv->avsync = get_le16(pb);
3586
e421492a6e27 Try to fix FATE after my time_base simplification change.
michael
parents: 3424
diff changeset
432 nsv->framerate = framerate;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
433 #ifdef DEBUG
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
434 print_tag("NSV NSVs vtag", vtag, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
435 print_tag("NSV NSVs atag", atag, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
436 PRINT(("NSV NSVs vsize %dx%d\n", vwidth, vheight));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
437 #endif
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
438
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
439 /* XXX change to ap != NULL ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
440 if (s->nb_streams == 0) { /* streams not yet published, let's do that */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
441 nsv->vtag = vtag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
442 nsv->atag = atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
443 nsv->vwidth = vwidth;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
444 nsv->vheight = vwidth;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
445 if (vtag != T_NONE) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
446 st = av_new_stream(s, NSV_ST_VIDEO);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
447 if (!st)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
448 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
449
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
450 nst = av_mallocz(sizeof(NSVStream));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
451 if (!nst)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
452 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
453 st->priv_data = nst;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
454 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
455 st->codec->codec_tag = vtag;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
456 st->codec->codec_id = codec_get_id(nsv_codec_video_tags, vtag);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
457 st->codec->width = vwidth;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
458 st->codec->height = vheight;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
459 st->codec->bits_per_sample = 24; /* depth XXX */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
460
742
21c1ae78f041 fix useless framerate messup
michael
parents: 683
diff changeset
461 av_set_pts_info(st, 64, framerate.den, framerate.num);
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
462 st->start_time = 0;
743
af4e24d6310c switch to native time bases
michael
parents: 742
diff changeset
463 st->duration = av_rescale(nsv->duration, framerate.num, 1000*framerate.den);
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
464 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
465 if (atag != T_NONE) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
466 #ifndef DISABLE_AUDIO
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
467 st = av_new_stream(s, NSV_ST_AUDIO);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
468 if (!st)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
469 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
470
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
471 nst = av_mallocz(sizeof(NSVStream));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
472 if (!nst)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
473 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
474 st->priv_data = nst;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
475 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
476 st->codec->codec_tag = atag;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
477 st->codec->codec_id = codec_get_id(nsv_codec_audio_tags, atag);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
478
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2003
diff changeset
479 st->need_parsing = AVSTREAM_PARSE_FULL; /* for PCM we will read a chunk later and put correct info */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
480
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
481 /* set timebase to common denominator of ms and framerate */
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
482 av_set_pts_info(st, 64, 1, framerate.num*1000);
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
483 st->start_time = 0;
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
484 st->duration = (int64_t)nsv->duration * framerate.num;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
485 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
486 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
487 #ifdef CHECK_SUBSEQUENT_NSVS
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
488 } else {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
489 if (nsv->vtag != vtag || nsv->atag != atag || nsv->vwidth != vwidth || nsv->vheight != vwidth) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
490 PRINT(("NSV NSVs header values differ from the first one!!!\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
491 //return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
492 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
493 #endif /* CHECK_SUBSEQUENT_NSVS */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
494 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
495
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
496 nsv->state = NSV_HAS_READ_NSVS;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
497 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
498 fail:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
499 /* XXX */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
500 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
501 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
502 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
503
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
504 static int nsv_read_header(AVFormatContext *s, AVFormatParameters *ap)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
505 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
506 NSVContext *nsv = s->priv_data;
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 639
diff changeset
507 int i, err;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
508
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
509 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
510 PRINT(("filename '%s'\n", s->filename));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
511
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
512 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
513 nsv->ahead[0].data = nsv->ahead[1].data = NULL;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
514
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
515 for (i = 0; i < NSV_MAX_RESYNC_TRIES; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
516 if (nsv_resync(s) < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
517 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
518 if (nsv->state == NSV_FOUND_NSVF)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
519 err = nsv_parse_NSVf_header(s, ap);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
520 /* we need the first NSVs also... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
521 if (nsv->state == NSV_FOUND_NSVS) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
522 err = nsv_parse_NSVs_header(s, ap);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
523 break; /* we just want the first one */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
524 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
525 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
526 if (s->nb_streams < 1) /* no luck so far */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
527 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
528 /* now read the first chunk, so we can attempt to decode more info */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
529 err = nsv_read_chunk(s, 1);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
530
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
531 PRINT(("parsed header\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
532 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
533 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
534
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
535 static int nsv_read_chunk(AVFormatContext *s, int fill_header)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
536 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
537 NSVContext *nsv = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2567
diff changeset
538 ByteIOContext *pb = s->pb;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
539 AVStream *st[2] = {NULL, NULL};
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
540 NSVStream *nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
541 AVPacket *pkt;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
542 int i, err = 0;
595
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
543 uint8_t auxcount; /* number of aux metadata, also 4 bits of vsize */
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
544 uint32_t vsize;
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
545 uint16_t asize;
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
546 uint16_t auxsize;
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
547 uint32_t auxtag;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
548
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
549 PRINT(("%s(%d)\n", __FUNCTION__, fill_header));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
550
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
551 if (nsv->ahead[0].data || nsv->ahead[1].data)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
552 return 0; //-1; /* hey! eat what you've in your plate first! */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
553
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
554 null_chunk_retry:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
555 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
556 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
557
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
558 for (i = 0; i < NSV_MAX_RESYNC_TRIES && nsv->state < NSV_FOUND_NSVS && !err; i++)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
559 err = nsv_resync(s);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
560 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
561 return err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
562 if (nsv->state == NSV_FOUND_NSVS)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
563 err = nsv_parse_NSVs_header(s, NULL);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
564 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
565 return err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
566 if (nsv->state != NSV_HAS_READ_NSVS && nsv->state != NSV_FOUND_BEEF)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
567 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
568
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
569 auxcount = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
570 vsize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
571 asize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
572 vsize = (vsize << 4) | (auxcount >> 4);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
573 auxcount &= 0x0f;
838
128838bc4bb6 kill a bunch of compiler warnings
mru
parents: 820
diff changeset
574 PRINT(("NSV CHUNK %d aux, %u bytes video, %d bytes audio\n", auxcount, vsize, asize));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
575 /* skip aux stuff */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
576 for (i = 0; i < auxcount; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
577 auxsize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
578 auxtag = get_le32(pb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
579 PRINT(("NSV aux data: '%c%c%c%c', %d bytes\n",
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
580 (auxtag & 0x0ff),
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
581 ((auxtag >> 8) & 0x0ff),
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
582 ((auxtag >> 16) & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
583 ((auxtag >> 24) & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
584 auxsize));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
585 url_fskip(pb, auxsize);
595
f0066a7fba8a use correct types
melanson
parents: 594
diff changeset
586 vsize -= auxsize + sizeof(uint16_t) + sizeof(uint32_t); /* that's becoming braindead */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
587 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
588
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
589 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
590 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
591 if (!vsize && !asize) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
592 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
593 goto null_chunk_retry;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
594 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
595
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
596 /* map back streams to v,a */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
597 if (s->streams[0])
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
598 st[s->streams[0]->id] = s->streams[0];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
599 if (s->streams[1])
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
600 st[s->streams[1]->id] = s->streams[1];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
601
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
602 if (vsize/* && st[NSV_ST_VIDEO]*/) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
603 nst = st[NSV_ST_VIDEO]->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
604 pkt = &nsv->ahead[NSV_ST_VIDEO];
775
c5077fdab490 AVPacket.pos
michael
parents: 743
diff changeset
605 av_get_packet(pb, pkt, vsize);
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
606 pkt->stream_index = st[NSV_ST_VIDEO]->index;//NSV_ST_VIDEO;
1942
70b741fa63eb The NSV demuxer assumes that a video frame's timestamp increases by one on each
diego
parents: 1677
diff changeset
607 pkt->dts = nst->frame_offset;
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
608 pkt->flags |= nsv->state == NSV_HAS_READ_NSVS ? PKT_FLAG_KEY : 0; /* keyframe only likely on a sync frame */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
609 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
610 for (i = 0; i < MIN(8, vsize); i++)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
611 PRINT(("NSV video: [%d] = %02x\n", i, pkt->data[i]));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
612 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
613 }
2566
347da1903d92 fix segfault with http://samples.mplayerhq.hu/nsv/nsv_samples/ot171_novideo.nsv.bz2
michael
parents: 2164
diff changeset
614 if(st[NSV_ST_VIDEO])
2567
michael
parents: 2566
diff changeset
615 ((NSVStream*)st[NSV_ST_VIDEO]->priv_data)->frame_offset++;
1942
70b741fa63eb The NSV demuxer assumes that a video frame's timestamp increases by one on each
diego
parents: 1677
diff changeset
616
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
617 if (asize/*st[NSV_ST_AUDIO]*/) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
618 nst = st[NSV_ST_AUDIO]->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
619 pkt = &nsv->ahead[NSV_ST_AUDIO];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
620 /* read raw audio specific header on the first audio chunk... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
621 /* on ALL audio chunks ?? seems so! */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
622 if (asize && st[NSV_ST_AUDIO]->codec->codec_tag == MKTAG('P', 'C', 'M', ' ')/* && fill_header*/) {
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
623 uint8_t bps;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
624 uint8_t channels;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
625 uint16_t samplerate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
626 bps = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
627 channels = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
628 samplerate = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
629 asize-=4;
838
128838bc4bb6 kill a bunch of compiler warnings
mru
parents: 820
diff changeset
630 PRINT(("NSV RAWAUDIO: bps %d, nchan %d, srate %d\n", bps, channels, samplerate));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
631 if (fill_header) {
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2003
diff changeset
632 st[NSV_ST_AUDIO]->need_parsing = AVSTREAM_PARSE_NONE; /* we know everything */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
633 if (bps != 16) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
634 PRINT(("NSV AUDIO bit/sample != 16 (%d)!!!\n", bps));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
635 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
636 bps /= channels; // ???
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
637 if (bps == 8)
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
638 st[NSV_ST_AUDIO]->codec->codec_id = CODEC_ID_PCM_U8;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
639 samplerate /= 4;/* UGH ??? XXX */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
640 channels = 1;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
641 st[NSV_ST_AUDIO]->codec->channels = channels;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
642 st[NSV_ST_AUDIO]->codec->sample_rate = samplerate;
838
128838bc4bb6 kill a bunch of compiler warnings
mru
parents: 820
diff changeset
643 PRINT(("NSV RAWAUDIO: bps %d, nchan %d, srate %d\n", bps, channels, samplerate));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
644 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
645 }
775
c5077fdab490 AVPacket.pos
michael
parents: 743
diff changeset
646 av_get_packet(pb, pkt, asize);
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
647 pkt->stream_index = st[NSV_ST_AUDIO]->index;//NSV_ST_AUDIO;
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
648 pkt->flags |= nsv->state == NSV_HAS_READ_NSVS ? PKT_FLAG_KEY : 0; /* keyframe only likely on a sync frame */
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
649 if( nsv->state == NSV_HAS_READ_NSVS && st[NSV_ST_VIDEO] ) {
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
650 /* on a nsvs frame we have new information on a/v sync */
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
651 pkt->dts = (((NSVStream*)st[NSV_ST_VIDEO]->priv_data)->frame_offset-1);
3586
e421492a6e27 Try to fix FATE after my time_base simplification change.
michael
parents: 3424
diff changeset
652 pkt->dts *= (int64_t)1000 * nsv->framerate.den;
e421492a6e27 Try to fix FATE after my time_base simplification change.
michael
parents: 3424
diff changeset
653 pkt->dts += (int64_t)nsv->avsync * nsv->framerate.num;
1429
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
654 PRINT(("NSV AUDIO: sync:%d, dts:%"PRId64, nsv->avsync, pkt->dts));
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
655 }
b0797563dfa6 Fix A/V (de)sync with discontinuous NSV streams,
gpoirier
parents: 1415
diff changeset
656 nst->frame_offset++;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
657 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
658
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
659 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
660 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
661 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
662
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
663
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
664 static int nsv_read_packet(AVFormatContext *s, AVPacket *pkt)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
665 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
666 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
667 int i, err = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
668
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
669 PRINT(("%s()\n", __FUNCTION__));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
670
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
671 /* in case we don't already have something to eat ... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
672 if (nsv->ahead[0].data == NULL && nsv->ahead[1].data == NULL)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
673 err = nsv_read_chunk(s, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
674 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
675 return err;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
676
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
677 /* now pick one of the plates */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
678 for (i = 0; i < 2; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
679 if (nsv->ahead[i].data) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
680 PRINT(("%s: using cached packet[%d]\n", __FUNCTION__, i));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
681 /* avoid the cost of new_packet + memcpy(->data) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
682 memcpy(pkt, &nsv->ahead[i], sizeof(AVPacket));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
683 nsv->ahead[i].data = NULL; /* we ate that one */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
684 return pkt->size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
685 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
686 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
687
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
688 /* this restaurant is not approvisionned :^] */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
689 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
690 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
691
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
692 static int nsv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
693 {
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 639
diff changeset
694 #if 0
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
695 NSVContext *avi = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
696 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
697 NSVStream *ast;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
698 int frame_number, i;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
699 int64_t pos;
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 639
diff changeset
700 #endif
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
701
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
702 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
703 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
704
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
705 static int nsv_read_close(AVFormatContext *s)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
706 {
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 639
diff changeset
707 /* int i; */
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
708 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
709
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
710 if (nsv->index_entries)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
711 av_free(nsv->nsvf_index_data);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
712
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
713 #if 0
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
714
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
715 for(i=0;i<s->nb_streams;i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
716 AVStream *st = s->streams[i];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
717 NSVStream *ast = st->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
718 if(ast){
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
719 av_free(ast->index_entries);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
720 av_free(ast);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
721 }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
722 av_free(st->codec->palctrl);
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
723 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
724
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
725 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
726 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
727 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
728
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
729 static int nsv_probe(AVProbeData *p)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
730 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
731 int i;
601
3d516cb458e6 kill a annoying debug printf
michael
parents: 595
diff changeset
732 // PRINT(("nsv_probe(), buf_size %d\n", p->buf_size));
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
733 /* check file header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
734 /* streamed files might not have any header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
735 if (p->buf[0] == 'N' && p->buf[1] == 'S' &&
2002
1aa1bc9c5be8 factorize
michael
parents: 2001
diff changeset
736 p->buf[2] == 'V' && (p->buf[3] == 'f' || p->buf[3] == 's'))
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
737 return AVPROBE_SCORE_MAX;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
738 /* XXX: do streamed files always start at chunk boundary ?? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
739 /* or do we need to search NSVs in the byte stream ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
740 /* seems the servers don't bother starting clean chunks... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
741 /* sometimes even the first header is at 9KB or something :^) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
742 for (i = 1; i < p->buf_size - 3; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
743 if (p->buf[i+0] == 'N' && p->buf[i+1] == 'S' &&
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
744 p->buf[i+2] == 'V' && p->buf[i+3] == 's')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
745 return AVPROBE_SCORE_MAX-20;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
746 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
747 /* so we'll have more luck on extension... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
748 if (match_ext(p->filename, "nsv"))
2003
05b383b1c46c file extension based probe is max/2
michael
parents: 2002
diff changeset
749 return AVPROBE_SCORE_MAX/2;
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
750 /* FIXME: add mime-type check */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
751 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
752 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
753
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
754 AVInputFormat nsv_demuxer = {
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
755 "nsv",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3365
diff changeset
756 NULL_IF_CONFIG_SMALL("NullSoft Video format"),
594
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
757 sizeof(NSVContext),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
758 nsv_probe,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
759 nsv_read_header,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
760 nsv_read_packet,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
761 nsv_read_close,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
762 nsv_read_seek,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
763 };