Mercurial > libavformat.hg
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; |