Mercurial > libavformat.hg
comparison flvdec.c @ 1553:504ceaa50e31 libavformat
Defines various common FLV format values between the FLV muxer and demuxer
in a common flv.h.
patch by Allan Hsu allan _at_ counterpop.net
author | aurel |
---|---|
date | Wed, 06 Dec 2006 00:23:04 +0000 |
parents | 3b00fb8ef8e4 |
children | 515e80ef01e6 |
comparison
equal
deleted
inserted
replaced
1552:de18846fa25c | 1553:504ceaa50e31 |
---|---|
23 * It is composed of: | 23 * It is composed of: |
24 * - upper 4bits: difference between encoded width and visible width | 24 * - upper 4bits: difference between encoded width and visible width |
25 * - lower 4bits: difference between encoded height and visible height | 25 * - lower 4bits: difference between encoded height and visible height |
26 */ | 26 */ |
27 #include "avformat.h" | 27 #include "avformat.h" |
28 #include "flv.h" | |
28 | 29 |
29 static int flv_probe(AVProbeData *p) | 30 static int flv_probe(AVProbeData *p) |
30 { | 31 { |
31 const uint8_t *d; | 32 const uint8_t *d; |
32 | 33 |
88 if(size == 0) | 89 if(size == 0) |
89 continue; | 90 continue; |
90 | 91 |
91 next= size + url_ftell(&s->pb); | 92 next= size + url_ftell(&s->pb); |
92 | 93 |
93 if (type == 8) { | 94 if (type == FLV_TAG_TYPE_AUDIO) { |
94 is_audio=1; | 95 is_audio=1; |
95 flags = get_byte(&s->pb); | 96 flags = get_byte(&s->pb); |
96 } else if (type == 9) { | 97 } else if (type == FLV_TAG_TYPE_VIDEO) { |
97 is_audio=0; | 98 is_audio=0; |
98 flags = get_byte(&s->pb); | 99 flags = get_byte(&s->pb); |
99 } else if (type == 18 && size > 13+1+4) { | 100 } else if (type == FLV_TAG_TYPE_META && size > 13+1+4) { |
100 url_fskip(&s->pb, 13); //onMetaData blah | 101 url_fskip(&s->pb, 13); //onMetaData blah |
101 if(get_byte(&s->pb) == 8){ | 102 if(get_byte(&s->pb) == 8){ |
102 url_fskip(&s->pb, 4); | 103 url_fskip(&s->pb, 4); |
103 } | 104 } |
104 while(url_ftell(&s->pb) + 5 < next){ | 105 while(url_ftell(&s->pb) + 5 < next){ |
111 break; | 112 break; |
112 get_buffer(&s->pb, tmp, len); | 113 get_buffer(&s->pb, tmp, len); |
113 tmp[len]=0; | 114 tmp[len]=0; |
114 | 115 |
115 type= get_byte(&s->pb); | 116 type= get_byte(&s->pb); |
116 if(type==0){ | 117 if(type == AMF_DATA_TYPE_NUMBER){ |
117 d= av_int2dbl(get_be64(&s->pb)); | 118 d= av_int2dbl(get_be64(&s->pb)); |
118 }else if(type==2){ | 119 }else if(type == AMF_DATA_TYPE_STRING){ |
119 len= get_be16(&s->pb); | 120 len= get_be16(&s->pb); |
120 if(len >= sizeof(tmp)) | 121 if(len >= sizeof(tmp)) |
121 break; | 122 break; |
122 url_fskip(&s->pb, len); | 123 url_fskip(&s->pb, len); |
123 }else if(type==8){ | 124 }else if(type == AMF_DATA_TYPE_MIXEDARRAY){ |
124 //array | 125 //array |
125 break; | 126 break; |
126 }else if(type==11){ | 127 }else if(type == AMF_DATA_TYPE_DATE){ |
127 d= av_int2dbl(get_be64(&s->pb)); | 128 d= av_int2dbl(get_be64(&s->pb)); |
128 get_be16(&s->pb); | 129 get_be16(&s->pb); |
129 } | 130 } |
130 | 131 |
131 if(!strcmp(tmp, "duration")){ | 132 if(!strcmp(tmp, "duration")){ |
156 | 157 |
157 av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */ | 158 av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */ |
158 st->codec->time_base= (AVRational){1,1000}; | 159 st->codec->time_base= (AVRational){1,1000}; |
159 } | 160 } |
160 // av_log(NULL, AV_LOG_DEBUG, "%d %X %d \n", is_audio, flags, st->discard); | 161 // av_log(NULL, AV_LOG_DEBUG, "%d %X %d \n", is_audio, flags, st->discard); |
161 if( (st->discard >= AVDISCARD_NONKEY && !((flags >> 4)==1 || is_audio)) | 162 if( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || is_audio)) |
162 ||(st->discard >= AVDISCARD_BIDIR && ((flags >> 4)==3 && !is_audio)) | 163 ||(st->discard >= AVDISCARD_BIDIR && ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio)) |
163 || st->discard >= AVDISCARD_ALL | 164 || st->discard >= AVDISCARD_ALL |
164 ){ | 165 ){ |
165 url_fseek(&s->pb, next, SEEK_SET); | 166 url_fseek(&s->pb, next, SEEK_SET); |
166 continue; | 167 continue; |
167 } | 168 } |
168 if ((flags >> 4)==1) | 169 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) |
169 av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME); | 170 av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME); |
170 break; | 171 break; |
171 } | 172 } |
172 | 173 |
173 if(is_audio){ | 174 if(is_audio){ |
174 if(st->codec->sample_rate == 0){ | 175 if(st->codec->sample_rate == 0){ |
175 st->codec->codec_type = CODEC_TYPE_AUDIO; | 176 st->codec->codec_type = CODEC_TYPE_AUDIO; |
176 st->codec->channels = (flags&1)+1; | 177 st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; |
177 if((flags >> 4) == 5) | 178 if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO) |
178 st->codec->sample_rate= 8000; | 179 st->codec->sample_rate= 8000; |
179 else | 180 else |
180 st->codec->sample_rate = (44100<<((flags>>2)&3))>>3; | 181 st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3); |
181 switch(flags >> 4){/* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/ | 182 switch(flags & FLV_AUDIO_CODECID_MASK) { |
182 case 0: if (flags&2) st->codec->codec_id = CODEC_ID_PCM_S16BE; | 183 case FLV_CODECID_PCM_BE: if (flags & FLV_AUDIO_SAMPLESIZE_MASK) st->codec->codec_id = CODEC_ID_PCM_S16BE; |
183 else st->codec->codec_id = CODEC_ID_PCM_S8; break; | 184 else st->codec->codec_id = CODEC_ID_PCM_S8; break; |
184 case 1: st->codec->codec_id = CODEC_ID_ADPCM_SWF; break; | 185 case FLV_CODECID_ADPCM : st->codec->codec_id = CODEC_ID_ADPCM_SWF; break; |
185 case 2: st->codec->codec_id = CODEC_ID_MP3; st->need_parsing = 1; break; | 186 case FLV_CODECID_MP3 : st->codec->codec_id = CODEC_ID_MP3 ; st->need_parsing = 1; break; |
186 // this is not listed at FLV but at SWF, strange... | 187 // this is not listed at FLV but at SWF, strange... |
187 case 3: if (flags&2) st->codec->codec_id = CODEC_ID_PCM_S16LE; | 188 case FLV_CODECID_PCM_LE: if (flags & FLV_AUDIO_SAMPLESIZE_MASK) st->codec->codec_id = CODEC_ID_PCM_S16LE; |
188 else st->codec->codec_id = CODEC_ID_PCM_S8; break; | 189 else st->codec->codec_id = CODEC_ID_PCM_S8; break; |
189 default: | 190 default: |
190 av_log(s, AV_LOG_INFO, "Unsupported audio codec (%x)\n", flags >> 4); | 191 av_log(s, AV_LOG_INFO, "Unsupported audio codec (%x)\n", flags >> 4); |
191 st->codec->codec_tag= (flags >> 4); | 192 st->codec->codec_tag= (flags >> 4); |
192 } | 193 } |
193 st->codec->bits_per_sample = (flags & 2) ? 16 : 8; | 194 st->codec->bits_per_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; |
194 } | 195 } |
195 }else{ | 196 }else{ |
196 st->codec->codec_type = CODEC_TYPE_VIDEO; | 197 st->codec->codec_type = CODEC_TYPE_VIDEO; |
197 switch(flags & 0xF){ | 198 switch(flags & FLV_VIDEO_CODECID_MASK){ |
198 case 2: st->codec->codec_id = CODEC_ID_FLV1; break; | 199 case FLV_CODECID_H263 : st->codec->codec_id = CODEC_ID_FLV1 ; break; |
199 case 3: st->codec->codec_id = CODEC_ID_FLASHSV; break; | 200 case FLV_CODECID_SCREEN: st->codec->codec_id = CODEC_ID_FLASHSV; break; |
200 case 4: | 201 case FLV_CODECID_VP6 : |
201 st->codec->codec_id = CODEC_ID_VP6F; | 202 st->codec->codec_id = CODEC_ID_VP6F; |
202 if (st->codec->extradata_size != 1) { | 203 if (st->codec->extradata_size != 1) { |
203 st->codec->extradata_size = 1; | 204 st->codec->extradata_size = 1; |
204 st->codec->extradata = av_malloc(1); | 205 st->codec->extradata = av_malloc(1); |
205 } | 206 } |
206 /* width and height adjustment */ | 207 /* width and height adjustment */ |
207 st->codec->extradata[0] = get_byte(&s->pb); | 208 st->codec->extradata[0] = get_byte(&s->pb); |
208 size--; | 209 size--; |
209 break; | 210 break; |
210 default: | 211 default: |
211 av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flags & 0xf); | 212 av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flags & FLV_VIDEO_CODECID_MASK); |
212 st->codec->codec_tag= flags & 0xF; | 213 st->codec->codec_tag = flags & FLV_VIDEO_CODECID_MASK; |
213 } | 214 } |
214 } | 215 } |
215 | 216 |
216 ret= av_get_packet(&s->pb, pkt, size - 1); | 217 ret= av_get_packet(&s->pb, pkt, size - 1); |
217 if (ret <= 0) { | 218 if (ret <= 0) { |
221 packet */ | 222 packet */ |
222 pkt->size = ret; | 223 pkt->size = ret; |
223 pkt->pts = pts; | 224 pkt->pts = pts; |
224 pkt->stream_index = st->index; | 225 pkt->stream_index = st->index; |
225 | 226 |
226 if (is_audio || ((flags >> 4)==1)) | 227 if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)) |
227 pkt->flags |= PKT_FLAG_KEY; | 228 pkt->flags |= PKT_FLAG_KEY; |
228 | 229 |
229 return ret; | 230 return ret; |
230 } | 231 } |
231 | 232 |