Mercurial > libavformat.hg
comparison nut.c @ 429:983639863758 libavformat
removing keyframe prediction and checksum threshold
author | michael |
---|---|
date | Fri, 09 Apr 2004 16:46:12 +0000 |
parents | 29682362a127 |
children | 145cd93d0c86 |
comparison
equal
deleted
inserted
replaced
428:5ac07c7b4874 | 429:983639863758 |
---|---|
23 * | 23 * |
24 */ | 24 */ |
25 | 25 |
26 /* | 26 /* |
27 * TODO: | 27 * TODO: |
28 * - seeking | |
29 * - index writing | 28 * - index writing |
30 * - index packet reading support | 29 * - index packet reading support |
31 */ | 30 */ |
32 | 31 |
33 //#define DEBUG 1 | 32 //#define DEBUG 1 |
57 #define FLAG_FRAME_TYPE 1 | 56 #define FLAG_FRAME_TYPE 1 |
58 #define FLAG_DATA_SIZE 2 | 57 #define FLAG_DATA_SIZE 2 |
59 #define FLAG_PTS 16 | 58 #define FLAG_PTS 16 |
60 #define FLAG_FULL_PTS 4 | 59 #define FLAG_FULL_PTS 4 |
61 #define FLAG_KEY_FRAME 32 | 60 #define FLAG_KEY_FRAME 32 |
62 #define FLAG_PRED_KEY_FRAME 64 | |
63 | 61 |
64 typedef struct { | 62 typedef struct { |
65 uint8_t flags; | 63 uint8_t flags; |
66 uint8_t stream_id_plus1; | 64 uint8_t stream_id_plus1; |
67 uint8_t size_mul; | 65 uint8_t size_mul; |
476 /* main header */ | 474 /* main header */ |
477 put_be64(bc, MAIN_STARTCODE); | 475 put_be64(bc, MAIN_STARTCODE); |
478 put_packetheader(nut, bc, 120+5*256, 1); | 476 put_packetheader(nut, bc, 120+5*256, 1); |
479 put_v(bc, 1); /* version */ | 477 put_v(bc, 1); /* version */ |
480 put_v(bc, s->nb_streams); | 478 put_v(bc, s->nb_streams); |
481 put_v(bc, 3); | |
482 | 479 |
483 build_frame_code(s); | 480 build_frame_code(s); |
484 assert(nut->frame_code['N'].flags == 1); | 481 assert(nut->frame_code['N'].flags == 1); |
485 for(i=0; i<256;){ | 482 for(i=0; i<256;){ |
486 int tmp_flags = nut->frame_code[i].flags; | 483 int tmp_flags = nut->frame_code[i].flags; |
669 | 666 |
670 best_length=INT_MAX; | 667 best_length=INT_MAX; |
671 frame_code= -1; | 668 frame_code= -1; |
672 for(i=0; i<256; i++){ | 669 for(i=0; i<256; i++){ |
673 int stream_id_plus1= nut->frame_code[i].stream_id_plus1; | 670 int stream_id_plus1= nut->frame_code[i].stream_id_plus1; |
674 int fc_key_frame= stream->last_key_frame; | 671 int fc_key_frame; |
675 int length=0; | 672 int length=0; |
676 size_mul= nut->frame_code[i].size_mul; | 673 size_mul= nut->frame_code[i].size_mul; |
677 size_lsb= nut->frame_code[i].size_lsb; | 674 size_lsb= nut->frame_code[i].size_lsb; |
678 flags= nut->frame_code[i].flags; | 675 flags= nut->frame_code[i].flags; |
679 | 676 |
680 if(stream_id_plus1 == 0) length+= get_length(stream_index); | 677 if(stream_id_plus1 == 0) length+= get_length(stream_index); |
681 else if(stream_id_plus1 - 1 != stream_index) | 678 else if(stream_id_plus1 - 1 != stream_index) |
682 continue; | 679 continue; |
683 if(flags & FLAG_PRED_KEY_FRAME){ | 680 fc_key_frame= !!(flags & FLAG_KEY_FRAME); |
684 if(flags & FLAG_KEY_FRAME) | 681 |
685 fc_key_frame= !fc_key_frame; | |
686 }else{ | |
687 fc_key_frame= !!(flags & FLAG_KEY_FRAME); | |
688 } | |
689 assert(key_frame==0 || key_frame==1); | 682 assert(key_frame==0 || key_frame==1); |
690 if(fc_key_frame != key_frame) | 683 if(fc_key_frame != key_frame) |
691 continue; | 684 continue; |
692 | 685 |
693 if((!!(flags & FLAG_FRAME_TYPE)) != (frame_type > 0)) | 686 if((!!(flags & FLAG_FRAME_TYPE)) != (frame_type > 0)) |
830 av_log(s, AV_LOG_ERROR, "bad version (%Ld)\n", tmp); | 823 av_log(s, AV_LOG_ERROR, "bad version (%Ld)\n", tmp); |
831 return -1; | 824 return -1; |
832 } | 825 } |
833 | 826 |
834 nut->stream_count = get_v(bc); | 827 nut->stream_count = get_v(bc); |
835 get_v(bc); //checksum threshold | |
836 | 828 |
837 for(i=0; i<256;){ | 829 for(i=0; i<256;){ |
838 int tmp_flags = get_v(bc); | 830 int tmp_flags = get_v(bc); |
839 int tmp_stream= get_v(bc); | 831 int tmp_stream= get_v(bc); |
840 int tmp_mul = get_v(bc); | 832 int tmp_mul = get_v(bc); |
845 av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i); | 837 av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i); |
846 return -1; | 838 return -1; |
847 } | 839 } |
848 | 840 |
849 if((tmp_flags & FLAG_FRAME_TYPE) && tmp_flags != 1){ | 841 if((tmp_flags & FLAG_FRAME_TYPE) && tmp_flags != 1){ |
850 if(tmp_flags & FLAG_PRED_KEY_FRAME){ | |
851 av_log(s, AV_LOG_ERROR, "keyframe prediction in non 0 frame type\n"); | |
852 return -1; | |
853 } | |
854 if(!(tmp_flags & FLAG_PTS) || !(tmp_flags & FLAG_FULL_PTS) ){ | 842 if(!(tmp_flags & FLAG_PTS) || !(tmp_flags & FLAG_FULL_PTS) ){ |
855 av_log(s, AV_LOG_ERROR, "no full pts in non 0 frame type\n"); | 843 av_log(s, AV_LOG_ERROR, "no full pts in non 0 frame type\n"); |
856 return -1; | 844 return -1; |
857 } | 845 } |
858 } | 846 } |
1110 } | 1098 } |
1111 stream= &nut->stream[stream_id]; | 1099 stream= &nut->stream[stream_id]; |
1112 | 1100 |
1113 // 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]); | 1101 // 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]); |
1114 | 1102 |
1115 if(flags & FLAG_PRED_KEY_FRAME){ | 1103 key_frame= !!(flags & FLAG_KEY_FRAME); |
1116 if(flags & FLAG_KEY_FRAME) | |
1117 key_frame= !stream->last_key_frame; | |
1118 else | |
1119 key_frame= stream->last_key_frame; | |
1120 }else{ | |
1121 key_frame= !!(flags & FLAG_KEY_FRAME); | |
1122 } | |
1123 | 1104 |
1124 if(flags & FLAG_PTS){ | 1105 if(flags & FLAG_PTS){ |
1125 if(flags & FLAG_FULL_PTS){ | 1106 if(flags & FLAG_FULL_PTS){ |
1126 pts= get_v(bc); | 1107 pts= get_v(bc); |
1127 if(frame_type && key_frame){ | 1108 if(frame_type && key_frame){ |