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){