annotate nut.c @ 2211:1fddd398cc31 libavformat

Add missing comment markers to #endif directive.
author diego
date Mon, 02 Jul 2007 10:10:53 +0000
parents 3804e39efbfd
children 08258d8c506f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1 /*
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
2 * "NUT" Container Format muxer and demuxer (DRAFT-200403??)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
3 * Copyright (c) 2003 Alex Beregszaszi
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
4 * Copyright (c) 2004 Michael Niedermayer
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
5 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1287
diff changeset
6 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1287
diff changeset
7 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1287
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
10 * 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: 1287
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
12 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1287
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
16 * Lesser General Public License for more details.
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
17 *
1400
cb3a850b9971 Fix license header error notice by Steve LHomme.
diego
parents: 1358
diff changeset
18 * 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: 1287
diff changeset
19 * 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
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
21 *
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
22 *
787
386fff926e83 some nut.hu hype
alex
parents: 782
diff changeset
23 * Visit the official site at http://www.nut.hu/
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
24 *
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
25 */
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
26
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
27 /*
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
28 * TODO:
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
29 * - index writing
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
30 * - index packet reading support
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
31 */
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
32
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
33 //#define DEBUG 1
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
34
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
35 #include <limits.h>
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
36 #include "avformat.h"
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
37 #include "mpegaudio.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1169
diff changeset
38 #include "riff.h"
1176
bfea7dcd2698 move adler32 to libavutil
mru
parents: 1172
diff changeset
39 #include "adler32.h"
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
40
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
41 #undef NDEBUG
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
42 #include <assert.h>
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
43
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
44 //#define TRACE
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
45
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
46 //from /dev/random
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
47
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
48 #define MAIN_STARTCODE (0x7A561F5F04ADULL + (((uint64_t)('N'<<8) + 'M')<<48))
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
49 #define STREAM_STARTCODE (0x11405BF2F9DBULL + (((uint64_t)('N'<<8) + 'S')<<48))
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
50 #define KEYFRAME_STARTCODE (0xE4ADEECA4569ULL + (((uint64_t)('N'<<8) + 'K')<<48))
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
51 #define INDEX_STARTCODE (0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48))
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
52 #define INFO_STARTCODE (0xAB68B596BA78ULL + (((uint64_t)('N'<<8) + 'I')<<48))
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
53
478
ac85aafd0971 file id string
michael
parents: 468
diff changeset
54 #define ID_STRING "nut/multimedia container\0"
ac85aafd0971 file id string
michael
parents: 468
diff changeset
55
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
56 #define MAX_DISTANCE (1024*16-1)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
57 #define MAX_SHORT_DISTANCE (1024*4-1)
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
58
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
59 #define FLAG_DATA_SIZE 1
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
60 #define FLAG_KEY_FRAME 2
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
61 #define FLAG_INVALID 4
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
62
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
63 typedef struct {
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
64 uint8_t flags;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
65 uint8_t stream_id_plus1;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
66 uint16_t size_mul;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
67 uint16_t size_lsb;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
68 int16_t timestamp_delta;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
69 uint8_t reserved_count;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
70 } FrameCode;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
71
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
72 typedef struct {
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
73 int last_key_frame;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
74 int msb_timestamp_shift;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
75 int rate_num;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
76 int rate_den;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
77 int64_t last_pts;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
78 int64_t last_sync_pos; ///<pos of last 1/2 type frame
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
79 int decode_delay;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
80 } StreamContext;
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
81
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
82 typedef struct {
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
83 AVFormatContext *avf;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
84 int written_packet_size;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
85 int64_t packet_start[3]; //0-> startcode less, 1-> short startcode 2-> long startcodes
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
86 FrameCode frame_code[256];
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
87 unsigned int stream_count;
2164
3804e39efbfd misc spelling fixes
diego
parents: 1622
diff changeset
88 uint64_t next_startcode; ///< stores the next startcode if it has already been parsed but the stream is not seekable
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
89 StreamContext *stream;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
90 int max_distance;
478
ac85aafd0971 file id string
michael
parents: 468
diff changeset
91 int max_short_distance;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
92 int rate_num;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
93 int rate_den;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
94 int short_startcode;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
95 } NUTContext;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
96
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
97 static char *info_table[][2]={
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
98 {NULL , NULL }, // end
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
99 {NULL , NULL },
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
100 {NULL , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
101 {NULL , "v"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
102 {NULL , "s"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
103 {"StreamId" , "v"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
104 {"SegmentId" , "v"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
105 {"StartTimestamp" , "v"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
106 {"EndTimestamp" , "v"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
107 {"Author" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
108 {"Title" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
109 {"Description" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
110 {"Copyright" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
111 {"Encoder" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
112 {"Keyword" , "UTF8"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
113 {"Cover" , "JPEG"},
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
114 {"Cover" , "PNG"},
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
115 };
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
116
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
117 static void update(NUTContext *nut, int stream_index, int64_t frame_start, int frame_type, int frame_code, int key_frame, int size, int64_t pts){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
118 StreamContext *stream= &nut->stream[stream_index];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
119
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
120 stream->last_key_frame= key_frame;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
121 nut->packet_start[ frame_type ]= frame_start;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
122 stream->last_pts= pts;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
123 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
124
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
125 static void reset(AVFormatContext *s, int64_t global_ts){
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
126 NUTContext *nut = s->priv_data;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
127 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
128
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
129 for(i=0; i<s->nb_streams; i++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
130 StreamContext *stream= &nut->stream[i];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
131
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
132 stream->last_key_frame= 1;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
133
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
134 stream->last_pts= av_rescale(global_ts, stream->rate_num*(int64_t)nut->rate_den, stream->rate_den*(int64_t)nut->rate_num);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
135 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
136 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
137
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
138 static void build_frame_code(AVFormatContext *s){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
139 NUTContext *nut = s->priv_data;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
140 int key_frame, index, pred, stream_id;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
141 int start=0;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
142 int end= 255;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
143 int keyframe_0_esc= s->nb_streams > 2;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
144 int pred_table[10];
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
145
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
146 if(keyframe_0_esc){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
147 /* keyframe = 0 escape */
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
148 FrameCode *ft= &nut->frame_code[start];
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
149 ft->flags= FLAG_DATA_SIZE;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
150 ft->stream_id_plus1= 0;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
151 ft->size_mul=1;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
152 ft->timestamp_delta=0;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
153 start++;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
154 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
155
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
156 for(stream_id= 0; stream_id<s->nb_streams; stream_id++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
157 int start2= start + (end-start)*stream_id / s->nb_streams;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
158 int end2 = start + (end-start)*(stream_id+1) / s->nb_streams;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
159 AVCodecContext *codec = s->streams[stream_id]->codec;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
160 int is_audio= codec->codec_type == CODEC_TYPE_AUDIO;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
161 int intra_only= /*codec->intra_only || */is_audio;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
162 int pred_count;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
163
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
164 for(key_frame=0; key_frame<2; key_frame++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
165 if(intra_only && keyframe_0_esc && key_frame==0)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
166 continue;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
167
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
168 {
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
169 FrameCode *ft= &nut->frame_code[start2];
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
170 ft->flags= FLAG_KEY_FRAME*key_frame;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
171 ft->flags|= FLAG_DATA_SIZE;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
172 ft->stream_id_plus1= stream_id + 1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
173 ft->size_mul=1;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
174 ft->timestamp_delta=0;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
175 start2++;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
176 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
177 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
178
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
179 key_frame= intra_only;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
180 #if 1
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
181 if(is_audio){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
182 int frame_bytes= codec->frame_size*(int64_t)codec->bit_rate / (8*codec->sample_rate);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
183 int pts;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
184 for(pts=0; pts<2; pts++){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
185 for(pred=0; pred<2; pred++){
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
186 FrameCode *ft= &nut->frame_code[start2];
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
187 ft->flags= FLAG_KEY_FRAME*key_frame;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
188 ft->stream_id_plus1= stream_id + 1;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
189 ft->size_mul=frame_bytes + 2;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
190 ft->size_lsb=frame_bytes + pred;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
191 ft->timestamp_delta=pts;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
192 start2++;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
193 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
194 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
195 }else{
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
196 FrameCode *ft= &nut->frame_code[start2];
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
197 ft->flags= FLAG_KEY_FRAME | FLAG_DATA_SIZE;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
198 ft->stream_id_plus1= stream_id + 1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
199 ft->size_mul=1;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
200 ft->timestamp_delta=1;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
201 start2++;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
202 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
203 #endif
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
204
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
205 if(codec->has_b_frames){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
206 pred_count=5;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
207 pred_table[0]=-2;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
208 pred_table[1]=-1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
209 pred_table[2]=1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
210 pred_table[3]=3;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
211 pred_table[4]=4;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
212 }else if(codec->codec_id == CODEC_ID_VORBIS){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
213 pred_count=3;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
214 pred_table[0]=2;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
215 pred_table[1]=9;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
216 pred_table[2]=16;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
217 }else{
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
218 pred_count=1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
219 pred_table[0]=1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
220 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
221
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
222 for(pred=0; pred<pred_count; pred++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
223 int start3= start2 + (end2-start2)*pred / pred_count;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
224 int end3 = start2 + (end2-start2)*(pred+1) / pred_count;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
225
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
226 for(index=start3; index<end3; index++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
227 FrameCode *ft= &nut->frame_code[index];
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
228 ft->flags= FLAG_KEY_FRAME*key_frame;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
229 ft->flags|= FLAG_DATA_SIZE;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
230 ft->stream_id_plus1= stream_id + 1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
231 //FIXME use single byte size and pred from last
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
232 ft->size_mul= end3-start3;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
233 ft->size_lsb= index - start3;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
234 ft->timestamp_delta= pred_table[pred];
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
235 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
236 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
237 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
238 memmove(&nut->frame_code['N'+1], &nut->frame_code['N'], sizeof(FrameCode)*(255-'N'));
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
239 nut->frame_code['N'].flags= FLAG_INVALID;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
240 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
241
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
242 static uint64_t get_v(ByteIOContext *bc)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
243 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
244 uint64_t val = 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
245
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
246 for(;;)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
247 {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
248 int tmp = get_byte(bc);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
249
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
250 if (tmp&0x80)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
251 val= (val<<7) + tmp - 0x80;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
252 else{
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
253 //av_log(NULL, AV_LOG_DEBUG, "get_v()= %"PRId64"\n", (val<<7) + tmp);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
254 return (val<<7) + tmp;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
255 }
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
256 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
257 return -1;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
258 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
259
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
260 static int get_str(ByteIOContext *bc, char *string, unsigned int maxlen){
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
261 unsigned int len= get_v(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
262
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
263 if(len && maxlen)
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
264 get_buffer(bc, string, FFMIN(len, maxlen));
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
265 while(len > maxlen){
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
266 get_byte(bc);
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
267 len--;
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
268 }
240
e6f99d238179 get_bi(), be/le fix
michaelni
parents: 232
diff changeset
269
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
270 if(maxlen)
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
271 string[FFMIN(len, maxlen-1)]= 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
272
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
273 if(maxlen == len)
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
274 return -1;
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
275 else
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
276 return 0;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
277 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
278
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
279 static int64_t get_s(ByteIOContext *bc){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
280 int64_t v = get_v(bc) + 1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
281
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
282 if (v&1) return -(v>>1);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
283 else return (v>>1);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
284 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
285
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
286 static uint64_t get_vb(ByteIOContext *bc){
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
287 uint64_t val=0;
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
288 unsigned int i= get_v(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
289
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
290 if(i>8)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
291 return UINT64_MAX;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
292
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
293 while(i--)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
294 val = (val<<8) + get_byte(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
295
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
296 //av_log(NULL, AV_LOG_DEBUG, "get_vb()= %"PRId64"\n", val);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
297 return val;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
298 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
299
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
300 #ifdef TRACE
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
301 static inline uint64_t get_v_trace(ByteIOContext *bc, char *file, char *func, int line){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
302 uint64_t v= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
303
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
304 printf("get_v %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
305 return v;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
306 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
307
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
308 static inline int64_t get_s_trace(ByteIOContext *bc, char *file, char *func, int line){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
309 int64_t v= get_s(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
310
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
311 printf("get_s %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
312 return v;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
313 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
314
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
315 static inline uint64_t get_vb_trace(ByteIOContext *bc, char *file, char *func, int line){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
316 uint64_t v= get_vb(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
317
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
318 printf("get_vb %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
319 return v;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
320 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
321 #define get_v(bc) get_v_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
322 #define get_s(bc) get_s_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
323 #define get_vb(bc) get_vb_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
324 #endif
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
325
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
326
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
327 static int get_packetheader(NUTContext *nut, ByteIOContext *bc, int calculate_checksum)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
328 {
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
329 int64_t start, size;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
330 start= url_ftell(bc) - 8;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
331
854
c9d9796a3d00 checksum doesnt cover the forward_ptr anymore
michael
parents: 853
diff changeset
332 size= get_v(bc);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
333
1184
5a743f6f836a fix regression failure after adler simplification
michael
parents: 1176
diff changeset
334 init_checksum(bc, calculate_checksum ? av_adler32_update : NULL, 1);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
335
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
336 nut->packet_start[2] = start;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
337 nut->written_packet_size= size;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
338
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
339 return size;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
340 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
341
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
342 static int check_checksum(ByteIOContext *bc){
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
343 unsigned long checksum= get_checksum(bc);
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
344 return checksum != get_be32(bc);
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
345 }
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
346
221
fa80efcf8e39 padding fix
michaelni
parents: 220
diff changeset
347 /**
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
348 *
221
fa80efcf8e39 padding fix
michaelni
parents: 220
diff changeset
349 */
fa80efcf8e39 padding fix
michaelni
parents: 220
diff changeset
350 static int get_length(uint64_t val){
fa80efcf8e39 padding fix
michaelni
parents: 220
diff changeset
351 int i;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
352
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
353 for (i=7; val>>i; i+=7);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
354
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
355 return i;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
356 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
357
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
358 static uint64_t find_any_startcode(ByteIOContext *bc, int64_t pos){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
359 uint64_t state=0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
360
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
361 if(pos >= 0)
2164
3804e39efbfd misc spelling fixes
diego
parents: 1622
diff changeset
362 url_fseek(bc, pos, SEEK_SET); //note, this may fail if the stream is not seekable, but that should not matter, as in this case we simply start where we are currently
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
363
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
364 while(!url_feof(bc)){
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
365 state= (state<<8) | get_byte(bc);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
366 if((state>>56) != 'N')
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
367 continue;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
368 switch(state){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
369 case MAIN_STARTCODE:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
370 case STREAM_STARTCODE:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
371 case KEYFRAME_STARTCODE:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
372 case INFO_STARTCODE:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
373 case INDEX_STARTCODE:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
374 return state;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
375 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
376 }
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
377
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
378 return 0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
379 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
380
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
381 /**
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
382 * find the given startcode.
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
383 * @param code the startcode
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
384 * @param pos the start position of the search, or -1 if the current position
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
385 * @returns the position of the startcode or -1 if not found
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
386 */
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
387 static int64_t find_startcode(ByteIOContext *bc, uint64_t code, int64_t pos){
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
388 for(;;){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
389 uint64_t startcode= find_any_startcode(bc, pos);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
390 if(startcode == code)
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
391 return url_ftell(bc) - 8;
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
392 else if(startcode == 0)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
393 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
394 pos=-1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
395 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
396 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
397
902
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
398 static int64_t lsb2full(StreamContext *stream, int64_t lsb){
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
399 int64_t mask = (1<<stream->msb_timestamp_shift)-1;
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
400 int64_t delta= stream->last_pts - mask/2;
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
401 return ((lsb - delta)&mask) + delta;
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
402 }
5d1bcf01ce28 Properly #ifdef muxer-specific parts.
diego
parents: 896
diff changeset
403
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 854
diff changeset
404 #ifdef CONFIG_MUXERS
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
405
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
406 static void put_v(ByteIOContext *bc, uint64_t val)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
407 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
408 int i;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
409
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
410 //av_log(NULL, AV_LOG_DEBUG, "put_v()= %"PRId64"\n", val);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
411 val &= 0x7FFFFFFFFFFFFFFFULL; // FIXME can only encode upto 63 bits currently
221
fa80efcf8e39 padding fix
michaelni
parents: 220
diff changeset
412 i= get_length(val);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
413
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
414 for (i-=7; i>0; i-=7){
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
415 put_byte(bc, 0x80 | (val>>i));
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
416 }
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
417
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
418 put_byte(bc, val&0x7f);
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
419 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
420
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
421 /**
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
422 * stores a string as vb.
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
423 */
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
424 static void put_str(ByteIOContext *bc, const char *string){
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
425 int len= strlen(string);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
426
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
427 put_v(bc, len);
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
428 put_buffer(bc, string, len);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
429 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
430
699
2f5f4578a076 "put_s should store signed values. Spotted on #mplayerdev by someone I
michael
parents: 683
diff changeset
431 static void put_s(ByteIOContext *bc, int64_t val){
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
432 if (val<=0) put_v(bc, -2*val );
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
433 else put_v(bc, 2*val-1);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
434 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
435
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
436 static void put_vb(ByteIOContext *bc, uint64_t val){
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
437 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
438
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
439 for (i=8; val>>i; i+=8);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
440
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
441 put_v(bc, i>>3);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
442 for(i-=8; i>=0; i-=8)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
443 put_byte(bc, (val>>i)&0xFF);
228
542e6d639bb9 fixed endianness dependancies (untested)
bellard
parents: 223
diff changeset
444 }
542e6d639bb9 fixed endianness dependancies (untested)
bellard
parents: 223
diff changeset
445
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
446 #ifdef TRACE
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
447 static inline void put_v_trace(ByteIOContext *bc, uint64_t v, char *file, char *func, int line){
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
448 printf("get_v %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
449
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
450 put_v(bc, v);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
451 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
452
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
453 static inline void put_s_trace(ByteIOContext *bc, int64_t v, char *file, char *func, int line){
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
454 printf("get_s %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
455
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
456 put_s(bc, v);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
457 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
458
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
459 static inline void put_vb_trace(ByteIOContext *bc, uint64_t v, char *file, char *func, int line){
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
460 printf("get_vb %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
461
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
462 put_vb(bc, v);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
463 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
464 #define put_v(bc, v) put_v_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
465 #define put_s(bc, v) put_s_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
466 #define put_vb(bc, v) put_vb_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
467 #endif
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
468
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
469 static int put_packetheader(NUTContext *nut, ByteIOContext *bc, int max_size, int calculate_checksum)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
470 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
471 put_flush_packet(bc);
853
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
472 nut->packet_start[2]= url_ftell(bc) - 8;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
473 nut->written_packet_size = max_size;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
474
854
c9d9796a3d00 checksum doesnt cover the forward_ptr anymore
michael
parents: 853
diff changeset
475 /* packet header */
c9d9796a3d00 checksum doesnt cover the forward_ptr anymore
michael
parents: 853
diff changeset
476 put_v(bc, nut->written_packet_size); /* forward ptr */
c9d9796a3d00 checksum doesnt cover the forward_ptr anymore
michael
parents: 853
diff changeset
477
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
478 if(calculate_checksum)
1184
5a743f6f836a fix regression failure after adler simplification
michael
parents: 1176
diff changeset
479 init_checksum(bc, av_adler32_update, 1);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
480
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
481 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
482 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
483
853
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
484 /**
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
485 *
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
486 * must not be called more then once per packet
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
487 */
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
488 static int update_packetheader(NUTContext *nut, ByteIOContext *bc, int additional_size, int calculate_checksum){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
489 int64_t start= nut->packet_start[2];
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
490 int64_t cur= url_ftell(bc);
853
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
491 int size= cur - start - get_length(nut->written_packet_size)/7 - 8;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
492
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
493 if(calculate_checksum)
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
494 size += 4;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
495
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
496 if(size != nut->written_packet_size){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
497 int i;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
498
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
499 assert( size <= nut->written_packet_size );
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
500
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
501 url_fseek(bc, start + 8, SEEK_SET);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
502 for(i=get_length(size); i < get_length(nut->written_packet_size); i+=7)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
503 put_byte(bc, 0x80);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
504 put_v(bc, size);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
505
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
506 url_fseek(bc, cur, SEEK_SET);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
507 nut->written_packet_size= size; //FIXME may fail if multiple updates with differing sizes, as get_length may differ
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
508
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
509 if(calculate_checksum)
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
510 put_be32(bc, get_checksum(bc));
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
511 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
512
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
513 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
514 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
515
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
516 static int nut_write_header(AVFormatContext *s)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
517 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
518 NUTContext *nut = s->priv_data;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
519 ByteIOContext *bc = &s->pb;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
520 AVCodecContext *codec;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
521 int i, j, tmp_time, tmp_flags,tmp_stream, tmp_mul, tmp_size, tmp_fields;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
522
1066
716c75917a10 Disable lavf NUT until it is synced to spec
ods15
parents: 979
diff changeset
523 if (strcmp(s->filename, "./data/b-libav.nut")) {
716c75917a10 Disable lavf NUT until it is synced to spec
ods15
parents: 979
diff changeset
524 av_log(s, AV_LOG_ERROR, " libavformat NUT is non-compliant and disabled\n");
716c75917a10 Disable lavf NUT until it is synced to spec
ods15
parents: 979
diff changeset
525 return -1;
716c75917a10 Disable lavf NUT until it is synced to spec
ods15
parents: 979
diff changeset
526 }
716c75917a10 Disable lavf NUT until it is synced to spec
ods15
parents: 979
diff changeset
527
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
528 nut->avf= s;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
529
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
530 nut->stream =
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
531 av_mallocz(sizeof(StreamContext)*s->nb_streams);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
532
478
ac85aafd0971 file id string
michael
parents: 468
diff changeset
533
ac85aafd0971 file id string
michael
parents: 468
diff changeset
534 put_buffer(bc, ID_STRING, strlen(ID_STRING));
ac85aafd0971 file id string
michael
parents: 468
diff changeset
535 put_byte(bc, 0);
ac85aafd0971 file id string
michael
parents: 468
diff changeset
536 nut->packet_start[2]= url_ftell(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
537
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
538 /* main header */
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
539 put_be64(bc, MAIN_STARTCODE);
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
540 put_packetheader(nut, bc, 120+5*256, 1);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
541 put_v(bc, 2); /* version */
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
542 put_v(bc, s->nb_streams);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
543 put_v(bc, MAX_DISTANCE);
478
ac85aafd0971 file id string
michael
parents: 468
diff changeset
544 put_v(bc, MAX_SHORT_DISTANCE);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
545
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
546 put_v(bc, nut->rate_num=1);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
547 put_v(bc, nut->rate_den=2);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
548 put_v(bc, nut->short_startcode=0x4EFE79);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
549
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
550 build_frame_code(s);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
551 assert(nut->frame_code['N'].flags == FLAG_INVALID);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
552
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
553 tmp_time= tmp_flags= tmp_stream= tmp_mul= tmp_size= /*tmp_res=*/ INT_MAX;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
554 for(i=0; i<256;){
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
555 tmp_fields=0;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
556 tmp_size= 0;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
557 if(tmp_time != nut->frame_code[i].timestamp_delta) tmp_fields=1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
558 if(tmp_mul != nut->frame_code[i].size_mul ) tmp_fields=2;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
559 if(tmp_stream != nut->frame_code[i].stream_id_plus1) tmp_fields=3;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
560 if(tmp_size != nut->frame_code[i].size_lsb ) tmp_fields=4;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
561 // if(tmp_res != nut->frame_code[i].res ) tmp_fields=5;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
562
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
563 tmp_time = nut->frame_code[i].timestamp_delta;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
564 tmp_flags = nut->frame_code[i].flags;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
565 tmp_stream= nut->frame_code[i].stream_id_plus1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
566 tmp_mul = nut->frame_code[i].size_mul;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
567 tmp_size = nut->frame_code[i].size_lsb;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
568 // tmp_res = nut->frame_code[i].res;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
569
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
570 for(j=0; i<256; j++,i++){
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
571 if(nut->frame_code[i].timestamp_delta != tmp_time ) break;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
572 if(nut->frame_code[i].flags != tmp_flags ) break;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
573 if(nut->frame_code[i].stream_id_plus1 != tmp_stream) break;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
574 if(nut->frame_code[i].size_mul != tmp_mul ) break;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
575 if(nut->frame_code[i].size_lsb != tmp_size+j) break;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
576 // if(nut->frame_code[i].res != tmp_res ) break;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
577 }
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
578 if(j != tmp_mul - tmp_size) tmp_fields=6;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
579
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
580 put_v(bc, tmp_flags);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
581 put_v(bc, tmp_fields);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
582 if(tmp_fields>0) put_s(bc, tmp_time);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
583 if(tmp_fields>1) put_v(bc, tmp_mul);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
584 if(tmp_fields>2) put_v(bc, tmp_stream);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
585 if(tmp_fields>3) put_v(bc, tmp_size);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
586 if(tmp_fields>4) put_v(bc, 0 /*tmp_res*/);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
587 if(tmp_fields>5) put_v(bc, j);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
588 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
589
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
590 update_packetheader(nut, bc, 0, 1);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
591
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
592 /* stream headers */
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
593 for (i = 0; i < s->nb_streams; i++)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
594 {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
595 int nom, denom, ssize;
271
e35faf19f79f fixed time base and sample rate handling
al3x
parents: 270
diff changeset
596
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
597 codec = s->streams[i]->codec;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
598
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
599 put_be64(bc, STREAM_STARTCODE);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
600 put_packetheader(nut, bc, 120 + codec->extradata_size, 1);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
601 put_v(bc, i /*s->streams[i]->index*/);
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
602 switch(codec->codec_type){
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
603 case CODEC_TYPE_VIDEO: put_v(bc, 0); break;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
604 case CODEC_TYPE_AUDIO: put_v(bc, 1); break;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
605 // case CODEC_TYPE_TEXT : put_v(bc, 2); break;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
606 case CODEC_TYPE_DATA : put_v(bc, 3); break;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
607 default: return -1;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
608 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
609 if (codec->codec_tag)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
610 put_vb(bc, codec->codec_tag);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
611 else if (codec->codec_type == CODEC_TYPE_VIDEO)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
612 {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
613 put_vb(bc, codec_get_bmp_tag(codec->codec_id));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
614 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
615 else if (codec->codec_type == CODEC_TYPE_AUDIO)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
616 {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
617 put_vb(bc, codec_get_wav_tag(codec->codec_id));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
618 }
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
619 else
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
620 put_vb(bc, 0);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
621
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
622 ff_parse_specific_params(codec, &nom, &ssize, &denom);
282
alex
parents: 277
diff changeset
623
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
624 nut->stream[i].rate_num= nom;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
625 nut->stream[i].rate_den= denom;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
626 av_set_pts_info(s->streams[i], 60, denom, nom);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
627
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
628 put_v(bc, codec->bit_rate);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
629 put_vb(bc, 0); /* no language code */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
630 put_v(bc, nom);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
631 put_v(bc, denom);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
632 if(nom / denom < 1000)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
633 nut->stream[i].msb_timestamp_shift = 7;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
634 else
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
635 nut->stream[i].msb_timestamp_shift = 14;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
636 put_v(bc, nut->stream[i].msb_timestamp_shift);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
637 put_v(bc, codec->has_b_frames);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
638 put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
639
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
640 if(codec->extradata_size){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
641 put_v(bc, 1);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
642 put_v(bc, codec->extradata_size);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
643 put_buffer(bc, codec->extradata, codec->extradata_size);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
644 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
645 put_v(bc, 0); /* end of codec specific headers */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
646
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
647 switch(codec->codec_type)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
648 {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
649 case CODEC_TYPE_AUDIO:
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
650 put_v(bc, codec->sample_rate);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
651 put_v(bc, 1);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
652 put_v(bc, codec->channels);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
653 break;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
654 case CODEC_TYPE_VIDEO:
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
655 put_v(bc, codec->width);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
656 put_v(bc, codec->height);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
657 put_v(bc, codec->sample_aspect_ratio.num);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
658 put_v(bc, codec->sample_aspect_ratio.den);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
659 put_v(bc, 0); /* csp type -- unknown */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
660 break;
228
542e6d639bb9 fixed endianness dependancies (untested)
bellard
parents: 223
diff changeset
661 default:
542e6d639bb9 fixed endianness dependancies (untested)
bellard
parents: 223
diff changeset
662 break;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
663 }
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
664 update_packetheader(nut, bc, 0, 1);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
665 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
666
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
667 /* info header */
223
848b612d0595 move packetheader after startcodes
al3x
parents: 222
diff changeset
668 put_be64(bc, INFO_STARTCODE);
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
669 put_packetheader(nut, bc, 30+strlen(s->author)+strlen(s->title)+
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
670 strlen(s->comment)+strlen(s->copyright)+strlen(LIBAVFORMAT_IDENT), 1);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
671 if (s->author[0])
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
672 {
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
673 put_v(bc, 9); /* type */
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
674 put_str(bc, s->author);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
675 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
676 if (s->title[0])
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
677 {
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
678 put_v(bc, 10); /* type */
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
679 put_str(bc, s->title);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
680 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
681 if (s->comment[0])
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
682 {
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
683 put_v(bc, 11); /* type */
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
684 put_str(bc, s->comment);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
685 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
686 if (s->copyright[0])
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
687 {
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
688 put_v(bc, 12); /* type */
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
689 put_str(bc, s->copyright);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
690 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
691 /* encoder */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
692 if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)){
441
6635c1e75087 bit-exact
michael
parents: 437
diff changeset
693 put_v(bc, 13); /* type */
6635c1e75087 bit-exact
michael
parents: 437
diff changeset
694 put_str(bc, LIBAVFORMAT_IDENT);
6635c1e75087 bit-exact
michael
parents: 437
diff changeset
695 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
696
222
1da43d2bdcae some fixes
al3x
parents: 221
diff changeset
697 put_v(bc, 0); /* eof info */
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
698 update_packetheader(nut, bc, 0, 1);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
699
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
700 put_flush_packet(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
701
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
702 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
703 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
704
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
705 static int nut_write_packet(AVFormatContext *s, AVPacket *pkt)
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
706 {
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
707 NUTContext *nut = s->priv_data;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
708 StreamContext *stream= &nut->stream[pkt->stream_index];
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
709 ByteIOContext *bc = &s->pb;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
710 int key_frame = 0, full_pts=0;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
711 AVCodecContext *enc;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
712 int64_t coded_pts;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
713 int frame_type, best_length, frame_code, flags, i, size_mul, size_lsb, time_delta;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
714 const int64_t frame_start= url_ftell(bc);
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
715 int64_t pts= pkt->pts;
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
716 int size= pkt->size;
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
717 int stream_index= pkt->stream_index;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
718
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
719 enc = s->streams[stream_index]->codec;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
720 key_frame = !!(pkt->flags & PKT_FLAG_KEY);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
721
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
722 frame_type=0;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
723 if(frame_start + size + 20 - FFMAX(nut->packet_start[1], nut->packet_start[2]) > MAX_DISTANCE)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
724 frame_type=2;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
725 if(key_frame && !stream->last_key_frame)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
726 frame_type=2;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
727
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
728 if(frame_type>1){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
729 int64_t global_ts= av_rescale(pts, stream->rate_den*(int64_t)nut->rate_num, stream->rate_num*(int64_t)nut->rate_den);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
730 reset(s, global_ts);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
731 put_be64(bc, KEYFRAME_STARTCODE);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
732 put_v(bc, global_ts);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
733 }
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
734 assert(stream->last_pts != AV_NOPTS_VALUE);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
735 coded_pts = pts & ((1<<stream->msb_timestamp_shift)-1);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
736 if(lsb2full(stream, coded_pts) != pts)
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
737 full_pts=1;
328
137b4ce31b0f msb pts support
alex
parents: 282
diff changeset
738
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
739 if(full_pts)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
740 coded_pts= pts + (1<<stream->msb_timestamp_shift);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
741
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
742 best_length=INT_MAX;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
743 frame_code= -1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
744 for(i=0; i<256; i++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
745 int stream_id_plus1= nut->frame_code[i].stream_id_plus1;
429
983639863758 removing keyframe prediction and checksum threshold
michael
parents: 427
diff changeset
746 int fc_key_frame;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
747 int length=0;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
748 size_mul= nut->frame_code[i].size_mul;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
749 size_lsb= nut->frame_code[i].size_lsb;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
750 time_delta= nut->frame_code[i].timestamp_delta;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
751 flags= nut->frame_code[i].flags;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
752
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
753 assert(size_mul > size_lsb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
754
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
755 if(stream_id_plus1 == 0) length+= get_length(stream_index);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
756 else if(stream_id_plus1 - 1 != stream_index)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
757 continue;
429
983639863758 removing keyframe prediction and checksum threshold
michael
parents: 427
diff changeset
758 fc_key_frame= !!(flags & FLAG_KEY_FRAME);
983639863758 removing keyframe prediction and checksum threshold
michael
parents: 427
diff changeset
759
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
760 assert(key_frame==0 || key_frame==1);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
761 if(fc_key_frame != key_frame)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
762 continue;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
763
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
764 if(flags & FLAG_DATA_SIZE){
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
765 if(size % size_mul != size_lsb)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
766 continue;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
767 length += get_length(size / size_mul);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
768 }else if(size != size_lsb)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
769 continue;
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
770
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
771 if(full_pts && time_delta)
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
772 continue;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
773
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
774 if(!time_delta){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
775 length += get_length(coded_pts);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
776 }else{
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
777 if(time_delta != pts - stream->last_pts)
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
778 continue;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
779 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
780
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
781 if(length < best_length){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
782 best_length= length;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
783 frame_code=i;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
784 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
785 // av_log(s, AV_LOG_DEBUG, "%d %d %d %d %d %d %d %d %d %d\n", key_frame, frame_type, full_pts, size, stream_index, flags, size_mul, size_lsb, stream_id_plus1, length);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
786 }
223
848b612d0595 move packetheader after startcodes
al3x
parents: 222
diff changeset
787
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
788 assert(frame_code != -1);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
789 flags= nut->frame_code[frame_code].flags;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
790 size_mul= nut->frame_code[frame_code].size_mul;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
791 size_lsb= nut->frame_code[frame_code].size_lsb;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
792 time_delta= nut->frame_code[frame_code].timestamp_delta;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
793 #ifdef TRACE
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
794 best_length /= 7;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
795 best_length ++; //frame_code
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
796 if(frame_type==2){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
797 best_length += 8; // startcode
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
798 }
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
799 av_log(s, AV_LOG_DEBUG, "kf:%d ft:%d pt:%d fc:%2X len:%2d size:%d stream:%d flag:%d mul:%d lsb:%d s+1:%d pts_delta:%d pts:%"PRId64" fs:%"PRId64"\n", key_frame, frame_type, full_pts ? 1 : 0, frame_code, best_length, size, stream_index, flags, size_mul, size_lsb, nut->frame_code[frame_code].stream_id_plus1,(int)(pts - stream->last_pts), pts, frame_start);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
800 // av_log(s, AV_LOG_DEBUG, "%d %d %d\n", stream->lru_pts_delta[0], stream->lru_pts_delta[1], stream->lru_pts_delta[2]);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
801 #endif
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
802
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
803 assert(frame_type != 1); //short startcode not implemented yet
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
804 put_byte(bc, frame_code);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
805
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
806 if(nut->frame_code[frame_code].stream_id_plus1 == 0)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
807 put_v(bc, stream_index);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
808 if (!time_delta){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
809 put_v(bc, coded_pts);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
810 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
811 if(flags & FLAG_DATA_SIZE)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
812 put_v(bc, size / size_mul);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
813 else
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
814 assert(size == size_lsb);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
815 if(size > MAX_DISTANCE){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
816 assert(frame_type > 1);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
817 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
818
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 463
diff changeset
819 put_buffer(bc, pkt->data, size);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
820
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
821 update(nut, stream_index, frame_start, frame_type, frame_code, key_frame, size, pts);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
822
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
823 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
824 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
825
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
826 static int nut_write_trailer(AVFormatContext *s)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
827 {
328
137b4ce31b0f msb pts support
alex
parents: 282
diff changeset
828 NUTContext *nut = s->priv_data;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
829 ByteIOContext *bc = &s->pb;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
830
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
831 #if 0
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
832 int i;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
833
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
834 /* WRITE INDEX */
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
835
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
836 for (i = 0; s->nb_streams; i++)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
837 {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
838 put_be64(bc, INDEX_STARTCODE);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
839 put_packetheader(nut, bc, 64, 1);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
840 put_v(bc, s->streams[i]->id);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
841 put_v(bc, ...);
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
842 update_packetheader(nut, bc, 0, 1);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
843 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
844 #endif
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
845
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
846 put_flush_packet(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
847
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
848 av_freep(&nut->stream);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
849
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
850 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
851 }
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 854
diff changeset
852 #endif //CONFIG_MUXERS
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
853
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
854 static int nut_probe(AVProbeData *p)
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
855 {
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
856 int i;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
857 uint64_t code= 0xff;
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
858
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
859 for (i = 0; i < p->buf_size; i++) {
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
860 code = (code << 8) | p->buf[i];
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
861 if (code == MAIN_STARTCODE)
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
862 return AVPROBE_SCORE_MAX;
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
863 }
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
864 return 0;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
865 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
866
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
867 static int decode_main_header(NUTContext *nut){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
868 AVFormatContext *s= nut->avf;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
869 ByteIOContext *bc = &s->pb;
220
1dbacadcd222 big/little endian fix
michaelni
parents: 219
diff changeset
870 uint64_t tmp;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
871 int i, j, tmp_stream, tmp_mul, tmp_time, tmp_size, count, tmp_res;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
872
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
873 get_packetheader(nut, bc, 1);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
874
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
875 tmp = get_v(bc);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
876 if (tmp != 2){
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
877 av_log(s, AV_LOG_ERROR, "bad version (%"PRId64")\n", tmp);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
878 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
879 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
880
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
881 nut->stream_count = get_v(bc);
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
882 if(nut->stream_count > MAX_STREAMS){
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
883 av_log(s, AV_LOG_ERROR, "too many streams\n");
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
884 return -1;
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
885 }
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
886 nut->max_distance = get_v(bc);
478
ac85aafd0971 file id string
michael
parents: 468
diff changeset
887 nut->max_short_distance = get_v(bc);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
888 nut->rate_num= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
889 nut->rate_den= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
890 nut->short_startcode= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
891 if(nut->short_startcode>>16 != 'N'){
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
892 av_log(s, AV_LOG_ERROR, "invalid short startcode %X\n", nut->short_startcode);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
893 return -1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
894 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
895
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
896 for(i=0; i<256;){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
897 int tmp_flags = get_v(bc);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
898 int tmp_fields= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
899 if(tmp_fields>0) tmp_time = get_s(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
900 if(tmp_fields>1) tmp_mul = get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
901 if(tmp_fields>2) tmp_stream= get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
902 if(tmp_fields>3) tmp_size = get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
903 else tmp_size = 0;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
904 if(tmp_fields>4) tmp_res = get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
905 else tmp_res = 0;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
906 if(tmp_fields>5) count = get_v(bc);
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
907 else count = tmp_mul - tmp_size;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
908
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
909 while(tmp_fields-- > 6)
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
910 get_v(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
911
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
912 if(count == 0 || i+count > 256){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
913 av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
914 return -1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
915 }
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
916 if(tmp_stream > nut->stream_count + 1){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
917 av_log(s, AV_LOG_ERROR, "illegal stream number\n");
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
918 return -1;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
919 }
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
920
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
921 for(j=0; j<count; j++,i++){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
922 nut->frame_code[i].flags = tmp_flags ;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
923 nut->frame_code[i].timestamp_delta = tmp_time ;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
924 nut->frame_code[i].stream_id_plus1 = tmp_stream;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
925 nut->frame_code[i].size_mul = tmp_mul ;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
926 nut->frame_code[i].size_lsb = tmp_size+j;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
927 nut->frame_code[i].reserved_count = tmp_res ;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
928 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
929 }
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
930 if(nut->frame_code['N'].flags != FLAG_INVALID){
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
931 av_log(s, AV_LOG_ERROR, "illegal frame_code table\n");
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
932 return -1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
933 }
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
934
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
935 if(check_checksum(bc)){
735
72f8690c3f37 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 709
diff changeset
936 av_log(s, AV_LOG_ERROR, "Main header checksum mismatch\n");
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
937 return -1;
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
938 }
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
939
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
940 return 0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
941 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
942
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
943 static int decode_stream_header(NUTContext *nut){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
944 AVFormatContext *s= nut->avf;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
945 ByteIOContext *bc = &s->pb;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
946 int class, nom, denom, stream_id;
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
947 uint64_t tmp;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
948 AVStream *st;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
949
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
950 get_packetheader(nut, bc, 1);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
951 stream_id= get_v(bc);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
952 if(stream_id >= nut->stream_count || s->streams[stream_id])
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
953 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
954
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
955 st = av_new_stream(s, stream_id);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
956 if (!st)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
957 return AVERROR_NOMEM;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 461
diff changeset
958
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
959 class = get_v(bc);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
960 tmp = get_vb(bc);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
961 st->codec->codec_tag= tmp;
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
962 switch(class)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
963 {
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
964 case 0:
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
965 st->codec->codec_type = CODEC_TYPE_VIDEO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
966 st->codec->codec_id = codec_get_bmp_id(tmp);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
967 if (st->codec->codec_id == CODEC_ID_NONE)
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
968 av_log(s, AV_LOG_ERROR, "Unknown codec?!\n");
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
969 break;
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
970 case 1:
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
971 case 32: //compatibility
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
972 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
973 st->codec->codec_id = codec_get_wav_id(tmp);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
974 if (st->codec->codec_id == CODEC_ID_NONE)
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
975 av_log(s, AV_LOG_ERROR, "Unknown codec?!\n");
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
976 break;
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
977 case 2:
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
978 // st->codec->codec_type = CODEC_TYPE_TEXT;
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
979 // break;
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
980 case 3:
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
981 st->codec->codec_type = CODEC_TYPE_DATA;
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
982 break;
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
983 default:
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
984 av_log(s, AV_LOG_ERROR, "Unknown stream class (%d)\n", class);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
985 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
986 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
987 s->bit_rate += get_v(bc);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
988 get_vb(bc); /* language code */
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
989 nom = get_v(bc);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
990 denom = get_v(bc);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
991 nut->stream[stream_id].msb_timestamp_shift = get_v(bc);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
992 st->codec->has_b_frames=
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
993 nut->stream[stream_id].decode_delay= get_v(bc);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
994 get_byte(bc); /* flags */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
995
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
996 /* codec specific data headers */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
997 while(get_v(bc) != 0){
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
998 st->codec->extradata_size= get_v(bc);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
999 if((unsigned)st->codec->extradata_size > (1<<30))
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
1000 return -1;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1001 st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1002 get_buffer(bc, st->codec->extradata, st->codec->extradata_size);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
1003 // url_fskip(bc, get_v(bc));
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1004 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1005
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1006 if (st->codec->codec_type == CODEC_TYPE_VIDEO) /* VIDEO */
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1007 {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1008 st->codec->width = get_v(bc);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1009 st->codec->height = get_v(bc);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1010 st->codec->sample_aspect_ratio.num= get_v(bc);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1011 st->codec->sample_aspect_ratio.den= get_v(bc);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1012 get_v(bc); /* csp type */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1013 }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1014 if (st->codec->codec_type == CODEC_TYPE_AUDIO) /* AUDIO */
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1015 {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1016 st->codec->sample_rate = get_v(bc);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1017 get_v(bc); // samplerate_den
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 798
diff changeset
1018 st->codec->channels = get_v(bc);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1019 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1020 if(check_checksum(bc)){
735
72f8690c3f37 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 709
diff changeset
1021 av_log(s, AV_LOG_ERROR, "Stream header %d checksum mismatch\n", stream_id);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1022 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1023 }
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1024 av_set_pts_info(s->streams[stream_id], 60, denom, nom);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1025 nut->stream[stream_id].rate_num= nom;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1026 nut->stream[stream_id].rate_den= denom;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1027 return 0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1028 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1029
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1030 static int decode_info_header(NUTContext *nut){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1031 AVFormatContext *s= nut->avf;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1032 ByteIOContext *bc = &s->pb;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1033
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1034 get_packetheader(nut, bc, 1);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1035
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1036 for(;;){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1037 int id= get_v(bc);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1038 char *name, *type, custom_name[256], custom_type[256];
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1039
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1040 if(!id)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1041 break;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1042 else if(id >= sizeof(info_table)/sizeof(info_table[0])){
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 858
diff changeset
1043 av_log(s, AV_LOG_ERROR, "info id is too large %d %zd\n", id, sizeof(info_table)/sizeof(info_table[0]));
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1044 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1045 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1046
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1047 type= info_table[id][1];
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1048 name= info_table[id][0];
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1049 //av_log(s, AV_LOG_DEBUG, "%d %s %s\n", id, type, name);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1050
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1051 if(!type){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1052 get_str(bc, custom_type, sizeof(custom_type));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1053 type= custom_type;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1054 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1055 if(!name){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1056 get_str(bc, custom_name, sizeof(custom_name));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1057 name= custom_name;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1058 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1059
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1060 if(!strcmp(type, "v")){
683
095009fc2f35 kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 682
diff changeset
1061 get_v(bc);
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1062 }else{
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1063 if(!strcmp(name, "Author"))
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1064 get_str(bc, s->author, sizeof(s->author));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1065 else if(!strcmp(name, "Title"))
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1066 get_str(bc, s->title, sizeof(s->title));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1067 else if(!strcmp(name, "Copyright"))
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1068 get_str(bc, s->copyright, sizeof(s->copyright));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1069 else if(!strcmp(name, "Description"))
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1070 get_str(bc, s->comment, sizeof(s->comment));
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1071 else
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1072 get_str(bc, NULL, 0);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1073 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1074 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1075 if(check_checksum(bc)){
735
72f8690c3f37 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 709
diff changeset
1076 av_log(s, AV_LOG_ERROR, "Info header checksum mismatch\n");
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1077 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1078 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1079 return 0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1080 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1081
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1082 static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1083 {
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1084 NUTContext *nut = s->priv_data;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1085 ByteIOContext *bc = &s->pb;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1086 int64_t pos;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1087 int inited_stream_count;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1088
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1089 nut->avf= s;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1090
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1091 /* main header */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1092 pos=0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1093 for(;;){
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1094 pos= find_startcode(bc, MAIN_STARTCODE, pos)+1;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1095 if (pos<0){
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1096 av_log(s, AV_LOG_ERROR, "no main startcode found\n");
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1097 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1098 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1099 if(decode_main_header(nut) >= 0)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1100 break;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1101 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1102
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1103
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1104 s->bit_rate = 0;
328
137b4ce31b0f msb pts support
alex
parents: 282
diff changeset
1105
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1106 nut->stream = av_malloc(sizeof(StreamContext)*nut->stream_count);
272
13cbfe47f085 fixed codec specific data headers
al3x
parents: 271
diff changeset
1107
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1108 /* stream headers */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1109 pos=0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1110 for(inited_stream_count=0; inited_stream_count < nut->stream_count;){
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1111 pos= find_startcode(bc, STREAM_STARTCODE, pos)+1;
782
56c96e647ce4 fix stream class
michael
parents: 775
diff changeset
1112 if (pos<0+1){
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1113 av_log(s, AV_LOG_ERROR, "not all stream headers found\n");
418
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
1114 return -1;
41da3366d341 checksuming for nut & nice checksum API for libavformat
michael
parents: 416
diff changeset
1115 }
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1116 if(decode_stream_header(nut) >= 0)
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1117 inited_stream_count++;
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
1118 }
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
1119
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1120 /* info headers */
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1121 pos=0;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1122 for(;;){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1123 uint64_t startcode= find_any_startcode(bc, pos);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1124 pos= url_ftell(bc);
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
1125
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1126 if(startcode==0){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1127 av_log(s, AV_LOG_ERROR, "EOF before video frames\n");
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1128 return -1;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1129 }else if(startcode == KEYFRAME_STARTCODE){
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1130 nut->next_startcode= startcode;
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1131 break;
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1132 }else if(startcode != INFO_STARTCODE){
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1133 continue;
415
badb7a946a9c info packet read/write & simplify
michael
parents: 414
diff changeset
1134 }
419
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1135
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1136 decode_info_header(nut);
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1137 }
51c25922a543 search for undamaged headers
michael
parents: 418
diff changeset
1138
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1139 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1140 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1141
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1142 static int decode_frame_header(NUTContext *nut, int *key_frame_ret, int64_t *pts_ret, int *stream_id_ret, int frame_code, int frame_type, int64_t frame_start){
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1143 AVFormatContext *s= nut->avf;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1144 StreamContext *stream;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1145 ByteIOContext *bc = &s->pb;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1146 int size, flags, size_mul, size_lsb, stream_id, time_delta;
328
137b4ce31b0f msb pts support
alex
parents: 282
diff changeset
1147 int64_t pts = 0;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1148
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1149 if(frame_type < 2 && frame_start - nut->packet_start[2] > nut->max_distance){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1150 av_log(s, AV_LOG_ERROR, "last frame must have been damaged\n");
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1151 return -1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1152 }
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1153
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1154 if(frame_type)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1155 nut->packet_start[ frame_type ]= frame_start; //otherwise 1 goto 1 may happen
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1156
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1157 flags= nut->frame_code[frame_code].flags;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1158 size_mul= nut->frame_code[frame_code].size_mul;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1159 size_lsb= nut->frame_code[frame_code].size_lsb;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1160 stream_id= nut->frame_code[frame_code].stream_id_plus1 - 1;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1161 time_delta= nut->frame_code[frame_code].timestamp_delta;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1162
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1163 if(stream_id==-1)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1164 stream_id= get_v(bc);
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1165 if(stream_id >= s->nb_streams){
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1166 av_log(s, AV_LOG_ERROR, "illegal stream_id\n");
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1167 return -1;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1168 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1169 stream= &nut->stream[stream_id];
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1170
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1171 // av_log(s, AV_LOG_DEBUG, "ft:%d ppts:%d %d %d\n", frame_type, stream->lru_pts_delta[0], stream->lru_pts_delta[1], stream->lru_pts_delta[2]);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1172
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1173 *key_frame_ret= !!(flags & FLAG_KEY_FRAME);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1174
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1175 if(!time_delta){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1176 int64_t mask = (1<<stream->msb_timestamp_shift)-1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1177 pts= get_v(bc);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1178 if(pts > mask){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1179 pts -= mask+1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1180 }else{
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1181 if(stream->last_pts == AV_NOPTS_VALUE){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1182 av_log(s, AV_LOG_ERROR, "no reference pts available\n");
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1183 return -1;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1184 }
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1185 pts= lsb2full(stream, pts);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1186 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1187 }else{
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1188 if(stream->last_pts == AV_NOPTS_VALUE){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1189 av_log(s, AV_LOG_ERROR, "no reference pts available\n");
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1190 return -1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1191 }
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1192 pts= stream->last_pts + time_delta;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1193 }
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1194
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1195 if(*key_frame_ret){
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
1196 // av_log(s, AV_LOG_DEBUG, "stream:%d start:%"PRId64" pts:%"PRId64" length:%"PRId64"\n",stream_id, frame_start, av_pts, frame_start - nut->stream[stream_id].last_sync_pos);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1197 av_add_index_entry(
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1198 s->streams[stream_id],
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1199 frame_start,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1200 pts,
979
d2e5dfdf4def add size to AVIndex
michael
parents: 902
diff changeset
1201 0,
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1202 frame_start - nut->stream[stream_id].last_sync_pos,
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1203 AVINDEX_KEYFRAME);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1204 nut->stream[stream_id].last_sync_pos= frame_start;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1205 // assert(nut->packet_start == frame_start);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1206 }
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1207
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1208 assert(size_mul > size_lsb);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1209 size= size_lsb;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1210 if(flags & FLAG_DATA_SIZE)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1211 size+= size_mul*get_v(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1212
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1213 #ifdef TRACE
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
1214 av_log(s, AV_LOG_DEBUG, "fs:%"PRId64" fc:%d ft:%d kf:%d pts:%"PRId64" size:%d mul:%d lsb:%d flags:%d delta:%d\n", frame_start, frame_code, frame_type, *key_frame_ret, pts, size, size_mul, size_lsb, flags, time_delta);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1215 #endif
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1216
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1217 if(frame_type==0 && url_ftell(bc) - nut->packet_start[2] + size > nut->max_distance){
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1218 av_log(s, AV_LOG_ERROR, "frame size too large\n");
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1219 return -1;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1220 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1221
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1222 *stream_id_ret = stream_id;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
1223 *pts_ret = pts;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1224
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1225 update(nut, stream_id, frame_start, frame_type, frame_code, *key_frame_ret, size, pts);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1226
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1227 return size;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1228 }
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1229
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1230 static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code, int frame_type, int64_t frame_start){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1231 AVFormatContext *s= nut->avf;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1232 ByteIOContext *bc = &s->pb;
708
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1233 int size, stream_id, key_frame, discard;
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1234 int64_t pts, last_IP_pts;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1235
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1236 size= decode_frame_header(nut, &key_frame, &pts, &stream_id, frame_code, frame_type, frame_start);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1237 if(size < 0)
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1238 return -1;
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1239
708
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1240 discard= s->streams[ stream_id ]->discard;
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1241 last_IP_pts= s->streams[ stream_id ]->last_IP_pts;
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1242 if( (discard >= AVDISCARD_NONKEY && !key_frame)
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1243 ||(discard >= AVDISCARD_BIDIR && last_IP_pts != AV_NOPTS_VALUE && last_IP_pts > pts)
d79164865a7c more fine grained discarding of packets
michael
parents: 699
diff changeset
1244 || discard >= AVDISCARD_ALL){
652
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1245 url_fskip(bc, size);
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1246 return 1;
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1247 }
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1248
775
c5077fdab490 AVPacket.pos
michael
parents: 743
diff changeset
1249 av_get_packet(bc, pkt, size);
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1250 pkt->stream_index = stream_id;
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1251 if (key_frame)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
1252 pkt->flags |= PKT_FLAG_KEY;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1253 pkt->pts = pts;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1254
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1255 return 0;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1256 }
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1257
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1258 static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1259 {
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1260 NUTContext *nut = s->priv_data;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1261 ByteIOContext *bc = &s->pb;
652
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1262 int i, frame_code=0, ret;
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1263
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1264 for(;;){
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1265 int64_t pos= url_ftell(bc);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1266 int frame_type= 0;
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1267 uint64_t tmp= nut->next_startcode;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1268 nut->next_startcode=0;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1269
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1270 if (url_feof(bc))
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1271 return -1;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1272
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1273 if(tmp){
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1274 pos-=8;
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1275 }else{
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1276 frame_code = get_byte(bc);
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1277 if(frame_code == 'N'){
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1278 tmp= frame_code;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1279 for(i=1; i<8; i++)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1280 tmp = (tmp<<8) + get_byte(bc);
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1281 }
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1282 }
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1283 switch(tmp){
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1284 case MAIN_STARTCODE:
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1285 case STREAM_STARTCODE:
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1286 case INDEX_STARTCODE:
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1287 get_packetheader(nut, bc, 0);
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1288 assert(nut->packet_start[2] == pos);
853
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
1289 url_fseek(bc, nut->written_packet_size, SEEK_CUR);
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1290 break;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1291 case INFO_STARTCODE:
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1292 if(decode_info_header(nut)<0)
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1293 goto resync;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1294 break;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1295 case KEYFRAME_STARTCODE:
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1296 frame_type = 2;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1297 reset(s, get_v(bc));
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1298 frame_code = get_byte(bc);
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1299 case 0:
652
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1300 ret= decode_frame(nut, pkt, frame_code, frame_type, pos);
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1301 if(ret==0)
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1302 return 0;
652
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1303 else if(ret==1) //ok but discard packet
b47948262721 support discarding uninterresting packets
michael
parents: 639
diff changeset
1304 break;
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1305 default:
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1306 resync:
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 858
diff changeset
1307 av_log(s, AV_LOG_DEBUG, "syncing from %"PRId64"\n", nut->packet_start[2]+1);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1308 tmp= find_any_startcode(bc, nut->packet_start[2]+1);
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1309 if(tmp==0)
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1310 return -1;
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1311 av_log(s, AV_LOG_DEBUG, "sync\n");
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1312 nut->next_startcode= tmp;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1313 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1314 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1315 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1316
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1317 static int64_t nut_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos_arg, int64_t pos_limit){
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1318 NUTContext *nut = s->priv_data;
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1319 StreamContext *stream;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1320 ByteIOContext *bc = &s->pb;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1321 int64_t pos, pts;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1322 uint64_t code;
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1323 int frame_code,step, stream_id, i,size, key_frame;
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 858
diff changeset
1324 av_log(s, AV_LOG_DEBUG, "read_timestamp(X,%d,%"PRId64",%"PRId64")\n", stream_index, *pos_arg, pos_limit);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1325
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1326 if(*pos_arg < 0)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1327 return AV_NOPTS_VALUE;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1328
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1329 pos= *pos_arg;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1330 step= FFMIN(16*1024, pos);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1331 do{
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1332 pos-= step;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1333 code= find_any_startcode(bc, pos);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1334
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1335 if(code && url_ftell(bc) - 8 <= *pos_arg)
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1336 break;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1337 step= FFMIN(2*step, pos);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1338 }while(step);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1339
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1340 if(!code) //nothing found, not even after pos_arg
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1341 return AV_NOPTS_VALUE;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1342
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1343 url_fseek(bc, -8, SEEK_CUR);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1344 for(i=0; i<s->nb_streams; i++)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1345 nut->stream[i].last_sync_pos= url_ftell(bc);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1346
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1347 for(;;){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1348 int frame_type=0;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1349 int64_t pos= url_ftell(bc);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1350 uint64_t tmp=0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1351
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1352 if(pos > pos_limit || url_feof(bc))
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1353 return AV_NOPTS_VALUE;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1354
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1355 frame_code = get_byte(bc);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1356 if(frame_code == 'N'){
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1357 tmp= frame_code;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1358 for(i=1; i<8; i++)
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1359 tmp = (tmp<<8) + get_byte(bc);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1360 }
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1400
diff changeset
1361 //av_log(s, AV_LOG_DEBUG, "before switch %"PRIX64" at=%"PRId64"\n", tmp, pos);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1362
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1363 switch(tmp){
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1364 case MAIN_STARTCODE:
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1365 case STREAM_STARTCODE:
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1366 case INDEX_STARTCODE:
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1367 case INFO_STARTCODE:
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1368 get_packetheader(nut, bc, 0);
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1369 assert(nut->packet_start[2]==pos);
853
00db24c46875 forward_ptr doesnt contain its own length anymore
michael
parents: 820
diff changeset
1370 url_fseek(bc, nut->written_packet_size, SEEK_CUR);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1371 break;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1372 case KEYFRAME_STARTCODE:
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1373 frame_type=2;
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1374 reset(s, get_v(bc));
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1375 frame_code = get_byte(bc);
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1376 case 0:
461
63540e5504f7 bytestream tracing support
michael
parents: 456
diff changeset
1377 size= decode_frame_header(nut, &key_frame, &pts, &stream_id, frame_code, frame_type, pos);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1378 if(size < 0)
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1379 goto resync;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1380
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1381 stream= &nut->stream[stream_id];
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1382 if(stream_id != stream_index || !key_frame || pos < *pos_arg){
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1383 url_fseek(bc, size, SEEK_CUR);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1384 break;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1385 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
1386
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1387 *pos_arg= pos;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1388 return pts;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1389 default:
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1390 resync:
881
91dcb9da9be6 use PRIxN, %zd, %td formats where needed
mru
parents: 858
diff changeset
1391 av_log(s, AV_LOG_DEBUG, "syncing from %"PRId64"\n", nut->packet_start[2]+1);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1392 if(!find_any_startcode(bc, nut->packet_start[2]+1))
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1393 return AV_NOPTS_VALUE;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1394
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1395 url_fseek(bc, -8, SEEK_CUR);
421
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1396 }
a35263593560 10l (bytes_left() -> url_feof())
michael
parents: 419
diff changeset
1397 }
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1398 return AV_NOPTS_VALUE;
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1399 }
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1400
555
0a997108f384 use native timebase for seeking
michael
parents: 478
diff changeset
1401 static int nut_read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1402 // NUTContext *nut = s->priv_data;
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1403 int64_t pos;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1404
555
0a997108f384 use native timebase for seeking
michael
parents: 478
diff changeset
1405 if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0)
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1406 return -1;
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1407
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1408 pos= url_ftell(&s->pb);
456
c13fd248e222 match latest spec
michael
parents: 442
diff changeset
1409 nut_read_timestamp(s, stream_index, &pos, pos-1);
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1410
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1411 return 0;
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1412 }
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1413
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1414 static int nut_read_close(AVFormatContext *s)
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1415 {
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1416 NUTContext *nut = s->priv_data;
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1417
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1418 av_freep(&nut->stream);
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1419
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1420 return 0;
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1421 }
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1422
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1423 #ifdef CONFIG_NUT_DEMUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1424 AVInputFormat nut_demuxer = {
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1425 "nut",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1426 "nut format",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1427 sizeof(NUTContext),
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1428 nut_probe,
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1429 nut_read_header,
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1430 nut_read_packet,
403
967c6bb2b8a6 nut (de)muxer update
michael
parents: 370
diff changeset
1431 nut_read_close,
426
652aaf869c7b fourcc & language code v->vb type
michael
parents: 421
diff changeset
1432 nut_read_seek,
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 432
diff changeset
1433 nut_read_timestamp,
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1434 .extensions = "nut",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1435 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1436 #endif
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1437 #ifdef CONFIG_NUT_MUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1438 AVOutputFormat nut_muxer = {
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1439 "nut",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1440 "nut format",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1441 "video/x-nut",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1442 "nut",
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1443 sizeof(NUTContext),
682
decfffe703bc 01-makefile_fix_updated.patch
michael
parents: 652
diff changeset
1444 #ifdef CONFIG_LIBVORBIS
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1445 CODEC_ID_VORBIS,
1622
ac2a299df031 variable renaming: mp3lame --> libmp3lame
diego
parents: 1443
diff changeset
1446 #elif defined(CONFIG_LIBMP3LAME)
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 228
diff changeset
1447 CODEC_ID_MP3,
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1448 #else
223
848b612d0595 move packetheader after startcodes
al3x
parents: 222
diff changeset
1449 CODEC_ID_MP2, /* AC3 needs liba52 decoder */
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1450 #endif
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1451 CODEC_ID_MPEG4,
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1452 nut_write_header,
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1453 nut_write_packet,
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1454 nut_write_trailer,
798
b54823a20627 nut prefers extradata style global headers
michael
parents: 787
diff changeset
1455 .flags = AVFMT_GLOBALHEADER,
219
2f16e3066399 initial nut muxer and demuxer (demuxer is not fail safe)
al3x
parents:
diff changeset
1456 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1457 #endif