annotate nsvdec.c @ 5910:536e5527c1e0 libavformat

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