annotate nsvdec.c @ 594:89a09ede50ad libavformat

First implementation of nsv demuxer. Get libavformat linked with lavc and lmp3lame is required. BeOS requires no undefined syms on link! (besides it's bad to leave undef syms)
author mmu_man
date Sat, 20 Nov 2004 23:10:07 +0000
parents
children f0066a7fba8a
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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):
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
49 *
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
50 * It is followed by strings, then a table, but nothing tells
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
59 * which gave me 180. That leads me to think that NSVf[12-15] might be the
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 *
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
65 * nsvtrailer.nsv (S1) does not have any NSVf header, only NSVs chunks,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
66 * so the header seems to not be mandatory. (for streaming).
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
67 *
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
83 #define PRINT(_v)
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;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
159 int rate;
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;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
162
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
208 static const uint64_t nsv_framerate_table[] = {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
209 ((uint64_t)AV_TIME_BASE * 30),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
210 ((uint64_t)AV_TIME_BASE * 30000 / 1001), /* 29.97 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
211 ((uint64_t)AV_TIME_BASE * 25),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
212 ((uint64_t)AV_TIME_BASE * 24000 / 1001), /* 23.98 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
213 ((uint64_t)AV_TIME_BASE * 30), /* ?? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
214 ((uint64_t)AV_TIME_BASE * 15000 / 1001), /* 14.98 */
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;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
236 uint32 v = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
237 int i;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
238
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
239 PRINT(("%s(), offset = %Ld, state = %d\n", __FUNCTION__, url_ftell(pb), nsv->state));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
240
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
241 //nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
242
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 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
256
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 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
273
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;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
283 uint32_t tag, tag1, handler;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
284 int codec_type, stream_index, frame_period, bit_rate, scale, rate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
285 unsigned int file_size, size, nb_frames;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
286 int64_t duration;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
287 int strings_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
288 int table_entries;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
289 int table_entries_used;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
290 int i, n;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
291 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
292 NSVStream *ast;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
293
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
294 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
295
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
296 nsv->state = NSV_UNSYNC; /* in case we fail */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
297
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
298 size = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
299 if (size < 28)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
300 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
301 nsv->NSVf_end = size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
302
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
303 //s->file_size = (uint32_t)get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
304 file_size = (uint32_t)get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
305 PRINT(("NSV NSVf chunk_size %ld\n", size));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
306 PRINT(("NSV NSVf file_size %Ld\n", file_size));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
307
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
308 duration = get_le32(pb); /* in ms */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
309 nsv->duration = duration * AV_TIME_BASE / 1000; /* convert */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
310 PRINT(("NSV NSVf duration %Ld ms\n", duration));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
311 // XXX: store it in AVStreams
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
312
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
313 strings_size = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
314 table_entries = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
315 table_entries_used = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
316 PRINT(("NSV NSVf info-strings size: %d, table entries: %d, bis %d\n",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
317 strings_size, table_entries, table_entries_used));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
318 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
319 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
320
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
321 PRINT(("NSV got header; filepos %Ld\n", url_ftell(pb)));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
322
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
323 if (strings_size > 0) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
324 char *strings; /* last byte will be '\0' to play safe with str*() */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
325 char *p, *endp;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
326 char *token, *value;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
327 char quote;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
328
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
329 p = strings = av_mallocz(strings_size + 1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
330 endp = strings + strings_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
331 get_buffer(pb, strings, strings_size);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
332 while (p < endp) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
333 while (*p == ' ')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
334 p++; /* strip out spaces */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
335 if (p >= endp-2)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
336 break;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
337 token = p;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
338 p = strchr(p, '=');
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
339 if (!p || p >= endp-2)
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 quote = *p++;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
343 value = p;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
344 p = strchr(p, quote);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
345 if (!p || p >= endp)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
346 break;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
347 *p++ = '\0';
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
348 PRINT(("NSV NSVf INFO: %s='%s'\n", token, value));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
349 if (!strcmp(token, "ASPECT")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
350 /* don't care */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
351 } else if (!strcmp(token, "CREATOR") || !strcmp(token, "Author")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
352 strncpy(s->author, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
353 } else if (!strcmp(token, "Copyright")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
354 strncpy(s->copyright, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
355 } else if (!strcmp(token, "TITLE") || !strcmp(token, "Title")) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
356 strncpy(s->title, value, 512-1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
357 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
358 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
359 av_free(strings);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
360 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
361 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
362 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
363
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
364 PRINT(("NSV got infos; filepos %Ld\n", url_ftell(pb)));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
365
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
366 if (table_entries_used > 0) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
367 nsv->index_entries = table_entries_used;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
368 nsv->nsvf_index_data = av_malloc(table_entries * sizeof(uint32_t));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
369 get_buffer(pb, nsv->nsvf_index_data, table_entries * sizeof(uint32_t));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
370 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
371
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
372 PRINT(("NSV got index; filepos %Ld\n", url_ftell(pb)));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
373
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
374 #ifdef DEBUG_DUMP_INDEX
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
375 #define V(v) ((v<0x20 || v > 127)?'.':v)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
376 /* dump index */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
377 PRINT(("NSV %d INDEX ENTRIES:\n", table_entries));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
378 PRINT(("NSV [dataoffset][fileoffset]\n", table_entries));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
379 for (i = 0; i < table_entries; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
380 unsigned char b[8];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
381 url_fseek(pb, size + nsv->nsvf_index_data[i], SEEK_SET);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
382 get_buffer(pb, b, 8);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
383 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
384 "%c%c%c%c%c%c%c%c\n",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
385 nsv->nsvf_index_data[i], size + nsv->nsvf_index_data[i],
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
386 b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7],
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
387 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
388 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
389 //url_fseek(pb, size, SEEK_SET); /* go back to end of header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
390 #undef V
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
391 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
392
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
393 url_fseek(pb, nsv->base_offset + size, SEEK_SET); /* required for dumbdriving-271.nsv (2 extra bytes) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
394
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
395 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
396 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
397 nsv->state = NSV_HAS_READ_NSVF;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
398 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
399 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
400
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
401 static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
402 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
403 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
404 ByteIOContext *pb = &s->pb;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
405 uint32_t vtag, atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
406 uint16_t vwidth, vheight;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
407 uint32_t framerate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
408 uint16_t unknown;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
409 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
410 NSVStream *nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
411 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
412
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
413 vtag = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
414 atag = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
415 vwidth = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
416 vheight = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
417 framerate = (uint8_t)get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
418 /* XXX how big must the table be ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
419 /* seems there is more to that... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
420 PRINT(("NSV NSVs framerate code %2x\n", framerate));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
421 framerate = (framerate & 0x80)?(nsv_framerate_table[framerate & 0x7F]):(framerate*AV_TIME_BASE);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
422 unknown = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
423 #ifdef DEBUG
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
424 print_tag("NSV NSVs vtag", vtag, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
425 print_tag("NSV NSVs atag", atag, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
426 PRINT(("NSV NSVs vsize %dx%d\n", vwidth, vheight));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
427 PRINT(("NSV NSVs framerate %2x\n", framerate));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
428 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
429
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
430 /* XXX change to ap != NULL ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
431 if (s->nb_streams == 0) { /* streams not yet published, let's do that */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
432 nsv->vtag = vtag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
433 nsv->atag = atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
434 nsv->vwidth = vwidth;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
435 nsv->vheight = vwidth;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
436 if (vtag != T_NONE) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
437 st = av_new_stream(s, NSV_ST_VIDEO);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
438 if (!st)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
439 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
440
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
441 nst = av_mallocz(sizeof(NSVStream));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
442 if (!nst)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
443 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
444 st->priv_data = nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
445 st->codec.codec_type = CODEC_TYPE_VIDEO;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
446 st->codec.codec_tag = vtag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
447 st->codec.codec_id = codec_get_id(nsv_codec_video_tags, vtag);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
448 st->codec.width = vwidth;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
449 st->codec.height = vheight;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
450 st->codec.bits_per_sample = 24; /* depth XXX */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
451
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
452 st->codec.frame_rate = framerate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
453 st->codec.frame_rate_base = AV_TIME_BASE;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
454 av_set_pts_info(st, 64, AV_TIME_BASE, framerate);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
455 st->start_time = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
456 st->duration = nsv->duration;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
457 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
458 if (atag != T_NONE) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
459 #ifndef DISABLE_AUDIO
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
460 st = av_new_stream(s, NSV_ST_AUDIO);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
461 if (!st)
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
464 nst = av_mallocz(sizeof(NSVStream));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
465 if (!nst)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
466 goto fail;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
467 st->priv_data = nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
468 st->codec.codec_type = CODEC_TYPE_AUDIO;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
469 st->codec.codec_tag = atag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
470 st->codec.codec_id = codec_get_id(nsv_codec_audio_tags, atag);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
471 st->start_time = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
472 st->duration = nsv->duration;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
473
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
474 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
475 /* XXX:FIXME */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
476 //st->codec.channels = 2; //XXX:channels;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
477 //st->codec.sample_rate = 1000;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
478 //av_set_pts_info(st, 64, 1, st->codec.sample_rate);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
479
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
480 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
481 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
482 #ifdef CHECK_SUBSEQUENT_NSVS
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
483 } else {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
484 if (nsv->vtag != vtag || nsv->atag != atag || nsv->vwidth != vwidth || nsv->vheight != vwidth) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
485 PRINT(("NSV NSVs header values differ from the first one!!!\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
486 //return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
487 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
488 #endif /* CHECK_SUBSEQUENT_NSVS */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
489 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
490
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
491 nsv->state = NSV_HAS_READ_NSVS;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
492 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
493 fail:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
494 /* XXX */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
495 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
496 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
497 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
498
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
499 static int nsv_read_header(AVFormatContext *s, AVFormatParameters *ap)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
500 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
501 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
502 ByteIOContext *pb = &s->pb;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
503 uint32_t tag, tag1, handler;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
504 int codec_type, stream_index, frame_period, bit_rate, scale, rate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
505 unsigned int size, nb_frames;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
506 int table_entries;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
507 int i, n, err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
508 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
509 NSVStream *ast;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
510
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
511 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
512 PRINT(("filename '%s'\n", s->filename));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
513
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
514 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
515 nsv->ahead[0].data = nsv->ahead[1].data = NULL;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
516
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
517 for (i = 0; i < NSV_MAX_RESYNC_TRIES; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
518 if (nsv_resync(s) < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
519 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
520 if (nsv->state == NSV_FOUND_NSVF)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
521 err = nsv_parse_NSVf_header(s, ap);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
522 /* we need the first NSVs also... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
523 if (nsv->state == NSV_FOUND_NSVS) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
524 err = nsv_parse_NSVs_header(s, ap);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
525 break; /* we just want the first one */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
526 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
527 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
528 if (s->nb_streams < 1) /* no luck so far */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
529 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
530 /* now read the first chunk, so we can attempt to decode more info */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
531 err = nsv_read_chunk(s, 1);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
532
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
533 PRINT(("parsed header\n"));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
534 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
535 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
536
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
537 static int nsv_read_chunk(AVFormatContext *s, int fill_header)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
538 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
539 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
540 ByteIOContext *pb = &s->pb;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
541 AVStream *st[2] = {NULL, NULL};
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
542 NSVStream *nst;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
543 AVPacket *pkt;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
544 uint32 v = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
545 int i, err = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
546 uint8 auxcount; /* number of aux metadata, also 4 bits of vsize */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
547 uint32 vsize;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
548 uint16 asize;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
549 uint16 auxsize;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
550 uint32 auxtag;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
551
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
552 PRINT(("%s(%d)\n", __FUNCTION__, fill_header));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
553
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
554 if (nsv->ahead[0].data || nsv->ahead[1].data)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
555 return 0; //-1; /* hey! eat what you've in your plate first! */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
556
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
557 null_chunk_retry:
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
558 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
559 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
560
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
561 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
562 err = nsv_resync(s);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
563 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
564 return err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
565 if (nsv->state == NSV_FOUND_NSVS)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
566 err = nsv_parse_NSVs_header(s, NULL);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
567 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
568 return err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
569 if (nsv->state != NSV_HAS_READ_NSVS && nsv->state != NSV_FOUND_BEEF)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
570 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
571
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
572 auxcount = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
573 vsize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
574 asize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
575 vsize = (vsize << 4) | (auxcount >> 4);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
576 auxcount &= 0x0f;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
577 PRINT(("NSV CHUNK %d aux, %ld bytes video, %d bytes audio\n", auxcount, vsize, asize));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
578 /* skip aux stuff */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
579 for (i = 0; i < auxcount; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
580 auxsize = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
581 auxtag = get_le32(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
582 PRINT(("NSV aux data: '%c%c%c%c', %d bytes\n",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
583 (auxtag & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
584 ((auxtag >> 8) & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
585 ((auxtag >> 16) & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
586 ((auxtag >> 24) & 0x0ff),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
587 auxsize));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
588 url_fskip(pb, auxsize);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
589 vsize -= auxsize + sizeof(uint16) + sizeof(uint32); /* that's becoming braindead */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
590 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
591
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
592 if (url_feof(pb))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
593 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
594 if (!vsize && !asize) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
595 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
596 goto null_chunk_retry;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
597 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
598
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
599 /* map back streams to v,a */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
600 if (s->streams[0])
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
601 st[s->streams[0]->id] = s->streams[0];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
602 if (s->streams[1])
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
603 st[s->streams[1]->id] = s->streams[1];
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 (vsize/* && st[NSV_ST_VIDEO]*/) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
606 nst = st[NSV_ST_VIDEO]->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
607 pkt = &nsv->ahead[NSV_ST_VIDEO];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
608 av_new_packet(pkt, vsize);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
609 get_buffer(pb, pkt->data, vsize);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
610 pkt->stream_index = st[NSV_ST_VIDEO]->index;//NSV_ST_VIDEO;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
611 pkt->dts = nst->frame_offset++;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
612 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
613 /*
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
614 for (i = 0; i < MIN(8, vsize); i++)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
615 PRINT(("NSV video: [%d] = %02x\n", i, pkt->data[i]));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
616 */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
617 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
618 if (asize/*st[NSV_ST_AUDIO]*/) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
619 nst = st[NSV_ST_AUDIO]->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
620 pkt = &nsv->ahead[NSV_ST_AUDIO];
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
621 /* read raw audio specific header on the first audio chunk... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
622 /* on ALL audio chunks ?? seems so! */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
623 if (asize && st[NSV_ST_AUDIO]->codec.codec_tag == MKTAG('P', 'C', 'M', ' ')/* && fill_header*/) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
624 uint8_t bps;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
625 uint8_t channels;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
626 uint16_t samplerate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
627 bps = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
628 channels = get_byte(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
629 samplerate = get_le16(pb);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
630 asize-=4;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
631 PRINT(("NSV RAWAUDIO: bps %d, nchan %d, srate %ld\n", bps, channels, samplerate));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
632 if (fill_header) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
633 st[NSV_ST_AUDIO]->need_parsing = 0; /* we know everything */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
634 if (bps != 16) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
635 PRINT(("NSV AUDIO bit/sample != 16 (%d)!!!\n", bps));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
636 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
637 bps /= channels; // ???
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
638 if (bps == 8)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
639 st[NSV_ST_AUDIO]->codec.codec_id = CODEC_ID_PCM_U8;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
640 samplerate /= 4;/* UGH ??? XXX */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
641 channels = 1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
642 st[NSV_ST_AUDIO]->codec.channels = channels;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
643 st[NSV_ST_AUDIO]->codec.sample_rate = samplerate;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
644 av_set_pts_info(st[NSV_ST_AUDIO], 64, 1,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
645 st[NSV_ST_AUDIO]->codec.sample_rate);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
646 PRINT(("NSV RAWAUDIO: bps %d, nchan %d, srate %ld\n", bps, channels, samplerate));
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 av_new_packet(pkt, asize);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
650 if (asize)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
651 get_buffer(pb, pkt->data, asize);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
652 pkt->stream_index = st[NSV_ST_AUDIO]->index;//NSV_ST_AUDIO;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
653 //pkt->dts = nst->frame_offset;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
654 //if (nst->sample_size)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
655 // pkt->dts /= nst->sample_size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
656 nst->frame_offset += asize; // XXX: that's valid only for PCM !?
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
657 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
658
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
659 //pkt->flags |= PKT_FLAG_KEY;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
660 nsv->state = NSV_UNSYNC;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
661 return 0;
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
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
665 static int nsv_read_packet(AVFormatContext *s, AVPacket *pkt)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
666 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
667 NSVContext *nsv = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
668 ByteIOContext *pb = &s->pb;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
669 int i, err = 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
670
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
671 PRINT(("%s()\n", __FUNCTION__));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
672
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
673 /* in case we don't already have something to eat ... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
674 if (nsv->ahead[0].data == NULL && nsv->ahead[1].data == NULL)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
675 err = nsv_read_chunk(s, 0);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
676 if (err < 0)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
677 return err;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
678
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
679 /* now pick one of the plates */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
680 for (i = 0; i < 2; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
681 if (nsv->ahead[i].data) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
682 PRINT(("%s: using cached packet[%d]\n", __FUNCTION__, i));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
683 /* avoid the cost of new_packet + memcpy(->data) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
684 memcpy(pkt, &nsv->ahead[i], sizeof(AVPacket));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
685 nsv->ahead[i].data = NULL; /* we ate that one */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
686 return pkt->size;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
687 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
688 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
689
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
690 /* this restaurant is not approvisionned :^] */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
691 return -1;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
692 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
693
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
694 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
695 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
696 NSVContext *avi = s->priv_data;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
697 AVStream *st;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
698 NSVStream *ast;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
699 int frame_number, i;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
700 int64_t pos;
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 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
707 int i;
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 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
722 av_free(st->codec.extradata);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
723 av_free(st->codec.palctrl);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
724 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
725
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
726 #endif
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
727 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
728 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
729
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
730 static int nsv_probe(AVProbeData *p)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
731 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
732 int i;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
733 PRINT(("nsv_probe(), buf_size %d\n", p->buf_size));
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
734 /* check file header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
735 if (p->buf_size <= 32)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
736 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
737 if (p->buf[0] == 'N' && p->buf[1] == 'S' &&
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
738 p->buf[2] == 'V' && p->buf[3] == 'f')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
739 return AVPROBE_SCORE_MAX;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
740 /* streamed files might not have any header */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
741 if (p->buf[0] == 'N' && p->buf[1] == 'S' &&
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
742 p->buf[2] == 'V' && p->buf[3] == 's')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
743 return AVPROBE_SCORE_MAX;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
744 /* XXX: do streamed files always start at chunk boundary ?? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
745 /* or do we need to search NSVs in the byte stream ? */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
746 /* seems the servers don't bother starting clean chunks... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
747 /* sometimes even the first header is at 9KB or something :^) */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
748 for (i = 1; i < p->buf_size - 3; i++) {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
749 if (p->buf[i+0] == 'N' && p->buf[i+1] == 'S' &&
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
750 p->buf[i+2] == 'V' && p->buf[i+3] == 's')
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
751 return AVPROBE_SCORE_MAX-20;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
752 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
753 /* so we'll have more luck on extension... */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
754 if (match_ext(p->filename, "nsv"))
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
755 return AVPROBE_SCORE_MAX-20;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
756 /* FIXME: add mime-type check */
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
757 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
758 }
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
759
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
760 static AVInputFormat nsv_iformat = {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
761 "nsv",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
762 "NullSoft Video format",
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
763 sizeof(NSVContext),
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
764 nsv_probe,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
765 nsv_read_header,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
766 nsv_read_packet,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
767 nsv_read_close,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
768 nsv_read_seek,
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
769 };
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
770
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
771 int nsvdec_init(void)
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
772 {
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
773 av_register_input_format(&nsv_iformat);
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
774 return 0;
89a09ede50ad First implementation of nsv demuxer.
mmu_man
parents:
diff changeset
775 }