annotate nsvdec.c @ 1166:e89500dd9064 libavformat

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