comparison flvdec.c @ 445:c1f88671135b libavformat

cleanup fix streamcopy
author michael
date Sat, 17 Apr 2004 12:04:59 +0000
parents abd83fc30f0e
children b69898ffc92a
comparison
equal deleted inserted replaced
444:d42038d418a0 445:c1f88671135b
38 return 50; 38 return 50;
39 } 39 }
40 return 0; 40 return 0;
41 } 41 }
42 42
43 #define FRAME_RATE_UNKNOWN 31415 //yes i know its beatifull
44
45 static int flv_read_header(AVFormatContext *s, 43 static int flv_read_header(AVFormatContext *s,
46 AVFormatParameters *ap) 44 AVFormatParameters *ap)
47 { 45 {
48 int offset, flags; 46 int offset, flags;
49 AVStream *st; 47 AVStream *st;
53 av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */ 51 av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */
54 52
55 url_fskip(&s->pb, 4); 53 url_fskip(&s->pb, 4);
56 flags = get_byte(&s->pb); 54 flags = get_byte(&s->pb);
57 55
58 if ((flags & 1)) {
59 st = av_new_stream(s, 0);
60 if (!st)
61 return AVERROR_NOMEM;
62 st->codec.codec_type = CODEC_TYPE_VIDEO;
63 st->codec.codec_id = CODEC_ID_FLV1;
64 st->codec.frame_rate= FRAME_RATE_UNKNOWN;
65 // st->codec.frame_rate= ap->frame_rate;
66 // st->codec.frame_rate_base= ap->frame_rate_base;
67 }
68
69 if ((flags & 4)) {
70 st = av_new_stream(s, 1);
71 if (!st)
72 return AVERROR_NOMEM;
73 st->codec.codec_type = CODEC_TYPE_AUDIO;
74 st->codec.codec_id = CODEC_ID_MP3;
75 }
76
77 offset = get_be32(&s->pb); 56 offset = get_be32(&s->pb);
78 url_fseek(&s->pb, offset, SEEK_SET); 57 url_fseek(&s->pb, offset, SEEK_SET);
79 58
80 return 0; 59 return 0;
81 } 60 }
82 61
83 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) 62 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
84 { 63 {
85 int ret, i, type, size, pts, flags; 64 int ret, i, type, size, pts, flags, is_audio;
86 AVStream *st; 65 AVStream *st;
87 66
88 redo: 67 for(;;){
89 url_fskip(&s->pb, 4); /* size of previous packet */ 68 url_fskip(&s->pb, 4); /* size of previous packet */
90 type = get_byte(&s->pb); 69 type = get_byte(&s->pb);
91 size = get_be24(&s->pb); 70 size = get_be24(&s->pb);
92 pts = get_be24(&s->pb); 71 pts = get_be24(&s->pb);
93 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts); 72 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts);
94 if (url_feof(&s->pb)) 73 if (url_feof(&s->pb))
95 return -EIO; 74 return -EIO;
96 url_fskip(&s->pb, 4); /* reserved */ 75 url_fskip(&s->pb, 4); /* reserved */
97 flags = 0; 76 flags = 0;
77
78 if(size == 0)
79 continue;
80
98 if (type == 8) { 81 if (type == 8) {
82 is_audio=1;
99 flags = get_byte(&s->pb); 83 flags = get_byte(&s->pb);
100 size--; 84 size--;
101 if ((flags >> 4) != 2) { /* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/
102 goto skip;
103 }
104 } else if (type == 9) { 85 } else if (type == 9) {
86 is_audio=0;
105 flags = get_byte(&s->pb); 87 flags = get_byte(&s->pb);
106 size--; 88 size--;
107 if ((flags & 0xF) != 2) { /* 2: only format */
108 goto skip;
109 }
110 } else { 89 } else {
111 skip:
112 /* skip packet */ 90 /* skip packet */
113 av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags); 91 av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
114 url_fskip(&s->pb, size); 92 url_fskip(&s->pb, size);
115 goto redo; 93 continue;
116 } 94 }
117 95
118 /* now find stream */ 96 /* now find stream */
119 for(i=0;i<s->nb_streams;i++) { 97 for(i=0;i<s->nb_streams;i++) {
120 st = s->streams[i]; 98 st = s->streams[i];
121 if (st->id == ((type == 9) ? 0 : 1)) 99 if (st->id == is_audio)
122 goto found; 100 break;
123 } 101 }
124 goto skip; 102 if(i == s->nb_streams){
125 found: 103 st = av_new_stream(s, is_audio);
126 if(type == 8 && st->codec.sample_rate == 0){ 104 if (!st)
127 st->codec.channels = (flags&1)+1; 105 return AVERROR_NOMEM;
128 st->codec.sample_rate = (44100<<((flags>>2)&3))>>3; 106 st->codec.frame_rate_base= 0;
129 } 107 }
108 break;
109 }
130 110
131 //guess the frame rate 111 if(is_audio){
132 if(type==9 && st->codec.frame_rate == FRAME_RATE_UNKNOWN && pts){ 112 if(st->codec.sample_rate == 0){
133 st->codec.frame_rate_base=1; 113 st->codec.codec_type = CODEC_TYPE_AUDIO;
134 st->codec.frame_rate= (1000 + pts/2)/pts; 114 st->codec.channels = (flags&1)+1;
115 if((flags >> 4) == 5)
116 st->codec.sample_rate= 8000;
117 else
118 st->codec.sample_rate = (44100<<((flags>>2)&3))>>3;
119 switch(flags >> 4){/* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/
120 case 2: st->codec.codec_id = CODEC_ID_MP3; break;
121 default:
122 st->codec.codec_tag= (flags >> 4);
123 }
124 }
125 }else{
126 if(st->codec.frame_rate_base == 0){
127 st->codec.codec_type = CODEC_TYPE_VIDEO;
128 //guess the frame rate
129 if(pts){
130 st->codec.frame_rate_base=1;
131 st->codec.frame_rate= (1000 + pts/2)/pts;
132 }
133 switch(flags & 0xF){
134 case 2: st->codec.codec_id = CODEC_ID_FLV1; break;
135 default:
136 st->codec.codec_tag= flags & 0xF;
137 }
138 }
135 } 139 }
136 140
137 if (av_new_packet(pkt, size) < 0) 141 if (av_new_packet(pkt, size) < 0)
138 return -EIO; 142 return -EIO;
139 143