comparison nutdec.c @ 2700:dfcac0102c34 libavformat

Add ff_ prefix to get_v()
author kostya
date Sat, 03 Nov 2007 18:29:16 +0000
parents 49c540731133
children d52c718e83f9
comparison
equal deleted inserted replaced
2699:49c540731133 2700:dfcac0102c34
26 26
27 #undef NDEBUG 27 #undef NDEBUG
28 #include <assert.h> 28 #include <assert.h>
29 29
30 static int get_str(ByteIOContext *bc, char *string, unsigned int maxlen){ 30 static int get_str(ByteIOContext *bc, char *string, unsigned int maxlen){
31 unsigned int len= get_v(bc); 31 unsigned int len= ff_get_v(bc);
32 32
33 if(len && maxlen) 33 if(len && maxlen)
34 get_buffer(bc, string, FFMIN(len, maxlen)); 34 get_buffer(bc, string, FFMIN(len, maxlen));
35 while(len > maxlen){ 35 while(len > maxlen){
36 get_byte(bc); 36 get_byte(bc);
45 else 45 else
46 return 0; 46 return 0;
47 } 47 }
48 48
49 static int64_t get_s(ByteIOContext *bc){ 49 static int64_t get_s(ByteIOContext *bc){
50 int64_t v = get_v(bc) + 1; 50 int64_t v = ff_get_v(bc) + 1;
51 51
52 if (v&1) return -(v>>1); 52 if (v&1) return -(v>>1);
53 else return (v>>1); 53 else return (v>>1);
54 } 54 }
55 55
56 static uint64_t get_fourcc(ByteIOContext *bc){ 56 static uint64_t get_fourcc(ByteIOContext *bc){
57 unsigned int len= get_v(bc); 57 unsigned int len= ff_get_v(bc);
58 58
59 if (len==2) return get_le16(bc); 59 if (len==2) return get_le16(bc);
60 else if(len==4) return get_le32(bc); 60 else if(len==4) return get_le32(bc);
61 else return -1; 61 else return -1;
62 } 62 }
63 63
64 #ifdef TRACE 64 #ifdef TRACE
65 static inline uint64_t get_v_trace(ByteIOContext *bc, char *file, char *func, int line){ 65 static inline uint64_t get_v_trace(ByteIOContext *bc, char *file, char *func, int line){
66 uint64_t v= get_v(bc); 66 uint64_t v= ff_get_v(bc);
67 67
68 av_log(NULL, AV_LOG_DEBUG, "get_v %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line); 68 av_log(NULL, AV_LOG_DEBUG, "get_v %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
69 return v; 69 return v;
70 } 70 }
71 71
80 uint64_t v= get_vb(bc); 80 uint64_t v= get_vb(bc);
81 81
82 av_log(NULL, AV_LOG_DEBUG, "get_vb %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line); 82 av_log(NULL, AV_LOG_DEBUG, "get_vb %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
83 return v; 83 return v;
84 } 84 }
85 #define get_v(bc) get_v_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__) 85 #define ff_get_v(bc) get_v_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
86 #define get_s(bc) get_s_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__) 86 #define get_s(bc) get_s_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
87 #define get_vb(bc) get_vb_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__) 87 #define get_vb(bc) get_vb_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
88 #endif 88 #endif
89 89
90 static int get_packetheader(NUTContext *nut, ByteIOContext *bc, int calculate_checksum, uint64_t startcode) 90 static int get_packetheader(NUTContext *nut, ByteIOContext *bc, int calculate_checksum, uint64_t startcode)
94 94
95 startcode= be2me_64(startcode); 95 startcode= be2me_64(startcode);
96 startcode= ff_crc04C11DB7_update(0, &startcode, 8); 96 startcode= ff_crc04C11DB7_update(0, &startcode, 8);
97 97
98 init_checksum(bc, ff_crc04C11DB7_update, startcode); 98 init_checksum(bc, ff_crc04C11DB7_update, startcode);
99 size= get_v(bc); 99 size= ff_get_v(bc);
100 if(size > 4096) 100 if(size > 4096)
101 get_be32(bc); 101 get_be32(bc);
102 if(get_checksum(bc) && size > 4096) 102 if(get_checksum(bc) && size > 4096)
103 return -1; 103 return -1;
104 104
158 } 158 }
159 return 0; 159 return 0;
160 } 160 }
161 161
162 #define GET_V(dst, check) \ 162 #define GET_V(dst, check) \
163 tmp= get_v(bc);\ 163 tmp= ff_get_v(bc);\
164 if(!(check)){\ 164 if(!(check)){\
165 av_log(s, AV_LOG_ERROR, "Error " #dst " is (%"PRId64")\n", tmp);\ 165 av_log(s, AV_LOG_ERROR, "Error " #dst " is (%"PRId64")\n", tmp);\
166 return -1;\ 166 return -1;\
167 }\ 167 }\
168 dst= tmp; 168 dst= tmp;
190 end += url_ftell(bc); 190 end += url_ftell(bc);
191 191
192 GET_V(tmp , tmp >=2 && tmp <= 3) 192 GET_V(tmp , tmp >=2 && tmp <= 3)
193 GET_V(stream_count , tmp > 0 && tmp <=MAX_STREAMS) 193 GET_V(stream_count , tmp > 0 && tmp <=MAX_STREAMS)
194 194
195 nut->max_distance = get_v(bc); 195 nut->max_distance = ff_get_v(bc);
196 if(nut->max_distance > 65536){ 196 if(nut->max_distance > 65536){
197 av_log(s, AV_LOG_DEBUG, "max_distance %d\n", nut->max_distance); 197 av_log(s, AV_LOG_DEBUG, "max_distance %d\n", nut->max_distance);
198 nut->max_distance= 65536; 198 nut->max_distance= 65536;
199 } 199 }
200 200
211 } 211 }
212 tmp_pts=0; 212 tmp_pts=0;
213 tmp_mul=1; 213 tmp_mul=1;
214 tmp_stream=0; 214 tmp_stream=0;
215 for(i=0; i<256;){ 215 for(i=0; i<256;){
216 int tmp_flags = get_v(bc); 216 int tmp_flags = ff_get_v(bc);
217 int tmp_fields= get_v(bc); 217 int tmp_fields= ff_get_v(bc);
218 if(tmp_fields>0) tmp_pts = get_s(bc); 218 if(tmp_fields>0) tmp_pts = get_s(bc);
219 if(tmp_fields>1) tmp_mul = get_v(bc); 219 if(tmp_fields>1) tmp_mul = ff_get_v(bc);
220 if(tmp_fields>2) tmp_stream= get_v(bc); 220 if(tmp_fields>2) tmp_stream= ff_get_v(bc);
221 if(tmp_fields>3) tmp_size = get_v(bc); 221 if(tmp_fields>3) tmp_size = ff_get_v(bc);
222 else tmp_size = 0; 222 else tmp_size = 0;
223 if(tmp_fields>4) tmp_res = get_v(bc); 223 if(tmp_fields>4) tmp_res = ff_get_v(bc);
224 else tmp_res = 0; 224 else tmp_res = 0;
225 if(tmp_fields>5) count = get_v(bc); 225 if(tmp_fields>5) count = ff_get_v(bc);
226 else count = tmp_mul - tmp_size; 226 else count = tmp_mul - tmp_size;
227 227
228 while(tmp_fields-- > 6) 228 while(tmp_fields-- > 6)
229 get_v(bc); 229 ff_get_v(bc);
230 230
231 if(count == 0 || i+count > 256){ 231 if(count == 0 || i+count > 256){
232 av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i); 232 av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i);
233 return -1; 233 return -1;
234 } 234 }
282 282
283 st = s->streams[stream_id]; 283 st = s->streams[stream_id];
284 if (!st) 284 if (!st)
285 return AVERROR(ENOMEM); 285 return AVERROR(ENOMEM);
286 286
287 class = get_v(bc); 287 class = ff_get_v(bc);
288 tmp = get_fourcc(bc); 288 tmp = get_fourcc(bc);
289 st->codec->codec_tag= tmp; 289 st->codec->codec_tag= tmp;
290 switch(class) 290 switch(class)
291 { 291 {
292 case 0: 292 case 0:
311 av_log(s, AV_LOG_ERROR, "unknown stream class (%d)\n", class); 311 av_log(s, AV_LOG_ERROR, "unknown stream class (%d)\n", class);
312 return -1; 312 return -1;
313 } 313 }
314 GET_V(stc->time_base_id , tmp < nut->time_base_count); 314 GET_V(stc->time_base_id , tmp < nut->time_base_count);
315 GET_V(stc->msb_pts_shift , tmp < 16); 315 GET_V(stc->msb_pts_shift , tmp < 16);
316 stc->max_pts_distance= get_v(bc); 316 stc->max_pts_distance= ff_get_v(bc);
317 GET_V(stc->decode_delay , tmp < 1000); //sanity limit, raise this if Moore's law is true 317 GET_V(stc->decode_delay , tmp < 1000); //sanity limit, raise this if Moore's law is true
318 st->codec->has_b_frames= stc->decode_delay; 318 st->codec->has_b_frames= stc->decode_delay;
319 get_v(bc); //stream flags 319 ff_get_v(bc); //stream flags
320 320
321 GET_V(st->codec->extradata_size, tmp < (1<<30)); 321 GET_V(st->codec->extradata_size, tmp < (1<<30));
322 if(st->codec->extradata_size){ 322 if(st->codec->extradata_size){
323 st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 323 st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
324 get_buffer(bc, st->codec->extradata, st->codec->extradata_size); 324 get_buffer(bc, st->codec->extradata, st->codec->extradata_size);
325 } 325 }
326 326
327 if (st->codec->codec_type == CODEC_TYPE_VIDEO){ 327 if (st->codec->codec_type == CODEC_TYPE_VIDEO){
328 GET_V(st->codec->width , tmp > 0) 328 GET_V(st->codec->width , tmp > 0)
329 GET_V(st->codec->height, tmp > 0) 329 GET_V(st->codec->height, tmp > 0)
330 st->codec->sample_aspect_ratio.num= get_v(bc); 330 st->codec->sample_aspect_ratio.num= ff_get_v(bc);
331 st->codec->sample_aspect_ratio.den= get_v(bc); 331 st->codec->sample_aspect_ratio.den= ff_get_v(bc);
332 if((!st->codec->sample_aspect_ratio.num) != (!st->codec->sample_aspect_ratio.den)){ 332 if((!st->codec->sample_aspect_ratio.num) != (!st->codec->sample_aspect_ratio.den)){
333 av_log(s, AV_LOG_ERROR, "invalid aspect ratio\n"); 333 av_log(s, AV_LOG_ERROR, "invalid aspect ratio\n");
334 return -1; 334 return -1;
335 } 335 }
336 get_v(bc); /* csp type */ 336 ff_get_v(bc); /* csp type */
337 }else if (st->codec->codec_type == CODEC_TYPE_AUDIO){ 337 }else if (st->codec->codec_type == CODEC_TYPE_AUDIO){
338 GET_V(st->codec->sample_rate , tmp > 0) 338 GET_V(st->codec->sample_rate , tmp > 0)
339 tmp= get_v(bc); // samplerate_den 339 tmp= ff_get_v(bc); // samplerate_den
340 if(tmp > st->codec->sample_rate){ 340 if(tmp > st->codec->sample_rate){
341 av_log(s, AV_LOG_ERROR, "Bleh, libnut muxed this ;)\n"); 341 av_log(s, AV_LOG_ERROR, "Bleh, libnut muxed this ;)\n");
342 st->codec->sample_rate= tmp; 342 st->codec->sample_rate= tmp;
343 } 343 }
344 GET_V(st->codec->channels, tmp > 0) 344 GET_V(st->codec->channels, tmp > 0)
364 end= get_packetheader(nut, bc, 1, INFO_STARTCODE); 364 end= get_packetheader(nut, bc, 1, INFO_STARTCODE);
365 end += url_ftell(bc); 365 end += url_ftell(bc);
366 366
367 GET_V(stream_id_plus1, tmp <= s->nb_streams) 367 GET_V(stream_id_plus1, tmp <= s->nb_streams)
368 chapter_id = get_s(bc); 368 chapter_id = get_s(bc);
369 chapter_start= get_v(bc); 369 chapter_start= ff_get_v(bc);
370 chapter_len = get_v(bc); 370 chapter_len = ff_get_v(bc);
371 count = get_v(bc); 371 count = ff_get_v(bc);
372 for(i=0; i<count; i++){ 372 for(i=0; i<count; i++){
373 get_str(bc, name, sizeof(name)); 373 get_str(bc, name, sizeof(name));
374 value= get_s(bc); 374 value= get_s(bc);
375 if(value == -1){ 375 if(value == -1){
376 type= "UTF-8"; 376 type= "UTF-8";
381 }else if(value == -3){ 381 }else if(value == -3){
382 type= "s"; 382 type= "s";
383 value= get_s(bc); 383 value= get_s(bc);
384 }else if(value == -4){ 384 }else if(value == -4){
385 type= "t"; 385 type= "t";
386 value= get_v(bc); 386 value= ff_get_v(bc);
387 }else if(value < -4){ 387 }else if(value < -4){
388 type= "r"; 388 type= "r";
389 get_s(bc); 389 get_s(bc);
390 }else{ 390 }else{
391 type= "v"; 391 type= "v";
418 nut->last_syncpoint_pos= url_ftell(bc)-8; 418 nut->last_syncpoint_pos= url_ftell(bc)-8;
419 419
420 end= get_packetheader(nut, bc, 1, SYNCPOINT_STARTCODE); 420 end= get_packetheader(nut, bc, 1, SYNCPOINT_STARTCODE);
421 end += url_ftell(bc); 421 end += url_ftell(bc);
422 422
423 tmp= get_v(bc); 423 tmp= ff_get_v(bc);
424 *back_ptr= nut->last_syncpoint_pos - 16*get_v(bc); 424 *back_ptr= nut->last_syncpoint_pos - 16*ff_get_v(bc);
425 if(*back_ptr < 0) 425 if(*back_ptr < 0)
426 return -1; 426 return -1;
427 427
428 ff_nut_reset_ts(nut, nut->time_base[tmp % nut->time_base_count], tmp); 428 ff_nut_reset_ts(nut, nut->time_base[tmp % nut->time_base_count], tmp);
429 429
455 } 455 }
456 456
457 end= get_packetheader(nut, bc, 1, INDEX_STARTCODE); 457 end= get_packetheader(nut, bc, 1, INDEX_STARTCODE);
458 end += url_ftell(bc); 458 end += url_ftell(bc);
459 459
460 get_v(bc); //max_pts 460 ff_get_v(bc); //max_pts
461 GET_V(syncpoint_count, tmp < INT_MAX/8 && tmp > 0) 461 GET_V(syncpoint_count, tmp < INT_MAX/8 && tmp > 0)
462 syncpoints= av_malloc(sizeof(int64_t)*syncpoint_count); 462 syncpoints= av_malloc(sizeof(int64_t)*syncpoint_count);
463 has_keyframe= av_malloc(sizeof(int8_t)*(syncpoint_count+1)); 463 has_keyframe= av_malloc(sizeof(int8_t)*(syncpoint_count+1));
464 for(i=0; i<syncpoint_count; i++){ 464 for(i=0; i<syncpoint_count; i++){
465 GET_V(syncpoints[i], tmp>0) 465 GET_V(syncpoints[i], tmp>0)
468 } 468 }
469 469
470 for(i=0; i<s->nb_streams; i++){ 470 for(i=0; i<s->nb_streams; i++){
471 int64_t last_pts= -1; 471 int64_t last_pts= -1;
472 for(j=0; j<syncpoint_count;){ 472 for(j=0; j<syncpoint_count;){
473 uint64_t x= get_v(bc); 473 uint64_t x= ff_get_v(bc);
474 int type= x&1; 474 int type= x&1;
475 int n= j; 475 int n= j;
476 x>>=1; 476 x>>=1;
477 if(type){ 477 if(type){
478 int flag= x&1; 478 int flag= x&1;
499 return -1; 499 return -1;
500 } 500 }
501 assert(n<=syncpoint_count+1); 501 assert(n<=syncpoint_count+1);
502 for(; j<n; j++){ 502 for(; j<n; j++){
503 if(has_keyframe[j]){ 503 if(has_keyframe[j]){
504 uint64_t B, A= get_v(bc); 504 uint64_t B, A= ff_get_v(bc);
505 if(!A){ 505 if(!A){
506 A= get_v(bc); 506 A= ff_get_v(bc);
507 B= get_v(bc); 507 B= ff_get_v(bc);
508 //eor_pts[j][i] = last_pts + A + B 508 //eor_pts[j][i] = last_pts + A + B
509 }else 509 }else
510 B= 0; 510 B= 0;
511 av_add_index_entry( 511 av_add_index_entry(
512 s->streams[i], 512 s->streams[i],
610 reserved_count = nut->frame_code[frame_code].reserved_count; 610 reserved_count = nut->frame_code[frame_code].reserved_count;
611 611
612 if(flags & FLAG_INVALID) 612 if(flags & FLAG_INVALID)
613 return -1; 613 return -1;
614 if(flags & FLAG_CODED) 614 if(flags & FLAG_CODED)
615 flags ^= get_v(bc); 615 flags ^= ff_get_v(bc);
616 if(flags & FLAG_STREAM_ID){ 616 if(flags & FLAG_STREAM_ID){
617 GET_V(*stream_id, tmp < s->nb_streams) 617 GET_V(*stream_id, tmp < s->nb_streams)
618 } 618 }
619 stc= &nut->stream[*stream_id]; 619 stc= &nut->stream[*stream_id];
620 if(flags&FLAG_CODED_PTS){ 620 if(flags&FLAG_CODED_PTS){
621 int coded_pts= get_v(bc); 621 int coded_pts= ff_get_v(bc);
622 //FIXME check last_pts validity? 622 //FIXME check last_pts validity?
623 if(coded_pts < (1<<stc->msb_pts_shift)){ 623 if(coded_pts < (1<<stc->msb_pts_shift)){
624 *pts=ff_lsb2full(stc, coded_pts); 624 *pts=ff_lsb2full(stc, coded_pts);
625 }else 625 }else
626 *pts=coded_pts - (1<<stc->msb_pts_shift); 626 *pts=coded_pts - (1<<stc->msb_pts_shift);
627 }else 627 }else
628 *pts= stc->last_pts + pts_delta; 628 *pts= stc->last_pts + pts_delta;
629 if(flags&FLAG_SIZE_MSB){ 629 if(flags&FLAG_SIZE_MSB){
630 size += size_mul*get_v(bc); 630 size += size_mul*ff_get_v(bc);
631 } 631 }
632 if(flags&FLAG_RESERVED) 632 if(flags&FLAG_RESERVED)
633 reserved_count= get_v(bc); 633 reserved_count= ff_get_v(bc);
634 for(i=0; i<reserved_count; i++) 634 for(i=0; i<reserved_count; i++)
635 get_v(bc); 635 ff_get_v(bc);
636 if(flags&FLAG_CHECKSUM){ 636 if(flags&FLAG_CHECKSUM){
637 get_be32(bc); //FIXME check this 637 get_be32(bc); //FIXME check this
638 }else if(size > 2*nut->max_distance || FFABS(stc->last_pts - *pts) > stc->max_pts_distance){ 638 }else if(size > 2*nut->max_distance || FFABS(stc->last_pts - *pts) > stc->max_pts_distance){
639 av_log(s, AV_LOG_ERROR, "frame size > 2max_distance and no checksum\n"); 639 av_log(s, AV_LOG_ERROR, "frame size > 2max_distance and no checksum\n");
640 return -1; 640 return -1;