annotate nsvdec.c @ 1942:70b741fa63eb libavformat

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